rsScriptC_LibGL.cpp revision 61a4bb734b91ced09fbfee4214c6f253cb66e5f0
1aeb094b520d8ea49b74129927578f18f758c873eJason Sams/* 2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 3aeb094b520d8ea49b74129927578f18f758c873eJason Sams * 4aeb094b520d8ea49b74129927578f18f758c873eJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5aeb094b520d8ea49b74129927578f18f758c873eJason Sams * you may not use this file except in compliance with the License. 6aeb094b520d8ea49b74129927578f18f758c873eJason Sams * You may obtain a copy of the License at 7aeb094b520d8ea49b74129927578f18f758c873eJason Sams * 8aeb094b520d8ea49b74129927578f18f758c873eJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9aeb094b520d8ea49b74129927578f18f758c873eJason Sams * 10aeb094b520d8ea49b74129927578f18f758c873eJason Sams * Unless required by applicable law or agreed to in writing, software 11aeb094b520d8ea49b74129927578f18f758c873eJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12aeb094b520d8ea49b74129927578f18f758c873eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aeb094b520d8ea49b74129927578f18f758c873eJason Sams * See the License for the specific language governing permissions and 14aeb094b520d8ea49b74129927578f18f758c873eJason Sams * limitations under the License. 15aeb094b520d8ea49b74129927578f18f758c873eJason Sams */ 16aeb094b520d8ea49b74129927578f18f758c873eJason Sams 17aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "rsContext.h" 18aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "rsScriptC.h" 1987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix4x4.h" 2087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix3x3.h" 2187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix2x2.h" 224edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsMesh.h" 234edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsgApiStructs.h" 24aeb094b520d8ea49b74129927578f18f758c873eJason Sams 25aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "utils/Timers.h" 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdVertexArray.h" 27a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdShaderCache.h" 28a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdCore.h" 29aeb094b520d8ea49b74129927578f18f758c873eJason Sams 30aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GL_GLEXT_PROTOTYPES 31aeb094b520d8ea49b74129927578f18f758c873eJason Sams 32aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/gl.h> 33aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/glext.h> 34aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2.h> 35aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2ext.h> 36aeb094b520d8ea49b74129927578f18f758c873eJason Sams 37aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <time.h> 38aeb094b520d8ea49b74129927578f18f758c873eJason Sams 39aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android; 40aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android::renderscript; 41aeb094b520d8ea49b74129927578f18f758c873eJason Sams 4287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace android { 4387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace renderscript { 44aeb094b520d8ea49b74129927578f18f758c873eJason Sams 45aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 46aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Context 47aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 48aeb094b520d8ea49b74129927578f18f758c873eJason Sams 4987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindTexture(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) { 5087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(a); 5187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(pf); 5287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams pf->bindTexture(rsc, slot, a); 53aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 54aeb094b520d8ea49b74129927578f18f758c873eJason Sams 55a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchoukvoid rsrBindConstant(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) { 56a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk CHECK_OBJ_OR_NULL(a); 57a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk CHECK_OBJ(pf); 58a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk pf->bindAllocation(rsc, a, slot); 59a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk} 60a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk 618e6bde735d3c0024c36beff668e1588803657357Alex Sakhartchoukvoid rsrBindConstant(Context *rsc, Script *sc, ProgramVertex *pv, uint32_t slot, Allocation *a) { 62a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk CHECK_OBJ_OR_NULL(a); 638e6bde735d3c0024c36beff668e1588803657357Alex Sakhartchouk CHECK_OBJ(pv); 648e6bde735d3c0024c36beff668e1588803657357Alex Sakhartchouk pv->bindAllocation(rsc, a, slot); 65a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk} 66a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk 6787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) { 68605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(vs); 69605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ(vpf); 7087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams pf->bindSampler(rsc, slot, s); 71aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 72aeb094b520d8ea49b74129927578f18f758c873eJason Sams 7387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) { 7487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(ps); 7587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramStore(ps); 76aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 77aeb094b520d8ea49b74129927578f18f758c873eJason Sams 7887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) { 79605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(pf); 8087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramFragment(pf); 81aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 82aeb094b520d8ea49b74129927578f18f758c873eJason Sams 8387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) { 84605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(pv); 8587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramVertex(pv); 86aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 87aeb094b520d8ea49b74129927578f18f758c873eJason Sams 8887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) { 8987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(pr); 9087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramRaster(pr); 91aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 92aeb094b520d8ea49b74129927578f18f758c873eJason Sams 9387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) { 947d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk CHECK_OBJ(va); 9587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->mFBOCache.bindColorTarget(rsc, a, slot); 96a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 977d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 987d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 9987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) { 1007d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk CHECK_OBJ(va); 10187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->mFBOCache.bindDepthTarget(rsc, a); 102a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1037d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1047d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 10587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) { 1067d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.bindColorTarget(rsc, NULL, slot); 107a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1087d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1097d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 11087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) { 1117d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.bindDepthTarget(rsc, NULL); 112a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1137d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1147d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 11587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) { 1167d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.resetAll(rsc); 117a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1187d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1197d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 120aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 121aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP 122aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 123aeb094b520d8ea49b74129927578f18f758c873eJason Sams 12487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 12560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setProjectionMatrix(rsc, m); 126a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller} 127a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller 12887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 12960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setModelviewMatrix(rsc, m); 130aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 131aeb094b520d8ea49b74129927578f18f758c873eJason Sams 13287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 13360709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setTextureMatrix(rsc, m); 134aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 135aeb094b520d8ea49b74129927578f18f758c873eJason Sams 13687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf, 13787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float r, float g, float b, float a) { 13887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(pf); 139383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 1406445e5210c6d7f8689e94be9026153d017c9545bJason Sams} 1416445e5210c6d7f8689e94be9026153d017c9545bJason Sams 14287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) { 14360709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->getProjectionMatrix(rsc, m); 14495333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk} 14595333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 146aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 147aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing 148aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 149aeb094b520d8ea49b74129927578f18f758c873eJason Sams 15087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuadTexCoords(Context *rsc, Script *sc, 15187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x1, float y1, float z1, float u1, float v1, 15287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x2, float y2, float z2, float u2, float v2, 15387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x3, float y3, float z3, float u3, float v3, 15487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x4, float y4, float z4, float u4, float v4) { 155aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 156aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 157aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 158aeb094b520d8ea49b74129927578f18f758c873eJason Sams 159a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 160a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (!dc->gl.shaderCache->setup(rsc)) { 161a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk return; 162a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 163a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 164af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("Quad"); 165af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1); 166af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2); 167af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3); 168af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4); 169aeb094b520d8ea49b74129927578f18f758c873eJason Sams 170aeb094b520d8ea49b74129927578f18f758c873eJason Sams float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4}; 171aeb094b520d8ea49b74129927578f18f758c873eJason Sams const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4}; 172aeb094b520d8ea49b74129927578f18f758c873eJason Sams 173a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdVertexArray::Attrib attribs[2]; 17454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position"); 17554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0"); 17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 177a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdVertexArray va(attribs, 2); 178c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk va.setup(rsc); 179aeb094b520d8ea49b74129927578f18f758c873eJason Sams 1802382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4); 181aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 182aeb094b520d8ea49b74129927578f18f758c873eJason Sams 18387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuad(Context *rsc, Script *sc, 18487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x1, float y1, float z1, 18587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x2, float y2, float z2, 18687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x3, float y3, float z3, 18787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x4, float y4, float z4) { 18887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1, 18987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x2, y2, z2, 1, 1, 19087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x3, y3, z3, 1, 0, 19187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x4, y4, z4, 0, 0); 192aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 193aeb094b520d8ea49b74129927578f18f758c873eJason Sams 19487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawSpriteScreenspace(Context *rsc, Script *sc, 19587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x, float y, float z, float w, float h) { 19660709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex()); 19760709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->setProgramVertex(rsc->getDefaultProgramVertex()); 198aeb094b520d8ea49b74129927578f18f758c873eJason Sams //rsc->setupCheck(); 199aeb094b520d8ea49b74129927578f18f758c873eJason Sams 200aeb094b520d8ea49b74129927578f18f758c873eJason Sams //GLint crop[4] = {0, h, w, -h}; 201aeb094b520d8ea49b74129927578f18f758c873eJason Sams 202aeb094b520d8ea49b74129927578f18f758c873eJason Sams float sh = rsc->getHeight(); 203aeb094b520d8ea49b74129927578f18f758c873eJason Sams 20487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsrDrawQuad(rsc, sc, 20587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x, sh - y, z, 206aeb094b520d8ea49b74129927578f18f758c873eJason Sams x+w, sh - y, z, 207aeb094b520d8ea49b74129927578f18f758c873eJason Sams x+w, sh - (y+h), z, 208aeb094b520d8ea49b74129927578f18f758c873eJason Sams x, sh - (y+h), z); 20960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->setProgramVertex((ProgramVertex *)tmp.get()); 210aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 211aeb094b520d8ea49b74129927578f18f758c873eJason Sams 21287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) { 213af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z); 21487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z); 215aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 216aeb094b520d8ea49b74129927578f18f758c873eJason Sams 2179e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsvoid rsrDrawPath(Context *rsc, Script *sc, Path *sm) { 2189e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams CHECK_OBJ(sm); 2199e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams if (!rsc->setupCheck()) { 2209e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams return; 2219e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams } 2229e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams sm->render(rsc); 2239e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 2249e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 22587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) { 22687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 227aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 228aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 229aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 230aeb094b520d8ea49b74129927578f18f758c873eJason Sams sm->render(rsc); 231aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 232aeb094b520d8ea49b74129927578f18f758c873eJason Sams 23387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) { 23487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 235aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 236aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 237aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 2384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitive(rsc, primIndex); 2394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 24187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex, 24287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams uint32_t start, uint32_t len) { 24387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 2444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (!rsc->setupCheck()) { 2454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitiveRange(rsc, primIndex, start, len); 248aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 249aeb094b520d8ea49b74129927578f18f758c873eJason Sams 25087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm, 25187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *minX, float *minY, float *minZ, 25287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *maxX, float *maxY, float *maxZ) { 25387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 254e3150cfb3edb028407669e4a65e087eae77e718cJason Sams sm->computeBBox(rsc); 255ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minX = sm->mBBoxMin[0]; 256ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minY = sm->mBBoxMin[1]; 257ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minZ = sm->mBBoxMin[2]; 258ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxX = sm->mBBoxMax[0]; 259ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxY = sm->mBBoxMax[1]; 260ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxZ = sm->mBBoxMax[2]; 261ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 262ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 263aeb094b520d8ea49b74129927578f18f758c873eJason Sams 264aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 265aeb094b520d8ea49b74129927578f18f758c873eJason Sams// 266aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 267aeb094b520d8ea49b74129927578f18f758c873eJason Sams 268aeb094b520d8ea49b74129927578f18f758c873eJason Sams 26987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 27087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams ProgramFragment *pf = rsc->getProgramFragment(); 271383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 272aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 273aeb094b520d8ea49b74129927578f18f758c873eJason Sams 274653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchoukvoid rsrPrepareClear(Context *rsc, Script *sc) { 275c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk rsc->mFBOCache.setup(rsc); 276889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk rsc->setupProgramStore(); 277aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 278aeb094b520d8ea49b74129927578f18f758c873eJason Sams 27987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetWidth(Context *rsc, Script *sc) { 280aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getWidth(); 281aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 282aeb094b520d8ea49b74129927578f18f758c873eJason Sams 28387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetHeight(Context *rsc, Script *sc) { 284aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getHeight(); 285aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 286aeb094b520d8ea49b74129927578f18f758c873eJason Sams 28787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) { 28861a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a); 28987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams size_t allocSize = a->getType()->getSizeBytes(); 29009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, allocSize, x, y); 29161a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.unlock1D(rsc, a); 292d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 293d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 29487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) { 29509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 29609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, textLen, x, y); 29709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 29809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 29987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SetMetrics(Font::Rect *metrics, 30087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 301afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (left) { 30209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *left = metrics->left; 30309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 304afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (right) { 30509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *right = metrics->right; 30609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 307afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (top) { 30809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *top = metrics->top; 30909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 310afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (bottom) { 31109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *bottom = metrics->bottom; 31209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 31309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 31409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 31587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a, 31687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 31787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(a); 31861a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a); 31987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams size_t textLen = a->getType()->getSizeBytes(); 32009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 32109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 32287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 32361a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.unlock1D(rsc, a); 32409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 32509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 32687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureText(Context *rsc, Script *sc, const char *text, 32787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 32809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 32909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 33009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 33187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 332d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 333d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 33487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFont(Context *rsc, Script *sc, Font *font) { 335605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ(font); 336d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsi_ContextBindFont(rsc, font); 337d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 338aeb094b520d8ea49b74129927578f18f758c873eJason Sams 33987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 3409fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk rsc->mStateFont.setFontColor(r, g, b, a); 3419fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk} 3429fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk 343aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 34487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 345