rsScriptC_LibGL.cpp revision af12ac6a08651464f8d823add667c706f993b587
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" 22aeb094b520d8ea49b74129927578f18f758c873eJason Sams 23aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "utils/Timers.h" 24a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdVertexArray.h" 25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdShaderCache.h" 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdCore.h" 27aeb094b520d8ea49b74129927578f18f758c873eJason Sams 28aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GL_GLEXT_PROTOTYPES 29aeb094b520d8ea49b74129927578f18f758c873eJason Sams 30aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/gl.h> 31aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/glext.h> 32aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2.h> 33aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2ext.h> 34aeb094b520d8ea49b74129927578f18f758c873eJason Sams 35aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <time.h> 36aeb094b520d8ea49b74129927578f18f758c873eJason Sams 37aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android; 38aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android::renderscript; 39aeb094b520d8ea49b74129927578f18f758c873eJason Sams 4087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace android { 4187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace renderscript { 42aeb094b520d8ea49b74129927578f18f758c873eJason Sams 43aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 44aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Context 45aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 46aeb094b520d8ea49b74129927578f18f758c873eJason Sams 4787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindTexture(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) { 4887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(a); 4987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(pf); 5087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams pf->bindTexture(rsc, slot, a); 51aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 52aeb094b520d8ea49b74129927578f18f758c873eJason Sams 5387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) { 54605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(vs); 55605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ(vpf); 5687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams pf->bindSampler(rsc, slot, s); 57aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 58aeb094b520d8ea49b74129927578f18f758c873eJason Sams 5987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) { 6087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(ps); 6187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramStore(ps); 62aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 63aeb094b520d8ea49b74129927578f18f758c873eJason Sams 6487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) { 65605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(pf); 6687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramFragment(pf); 67aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 68aeb094b520d8ea49b74129927578f18f758c873eJason Sams 6987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) { 70605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(pv); 7187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramVertex(pv); 72aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 73aeb094b520d8ea49b74129927578f18f758c873eJason Sams 7487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) { 7587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(pr); 7687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramRaster(pr); 77aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 78aeb094b520d8ea49b74129927578f18f758c873eJason Sams 7987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) { 807d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk CHECK_OBJ(va); 8187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->mFBOCache.bindColorTarget(rsc, a, slot); 82a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 837d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 847d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 8587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) { 867d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk CHECK_OBJ(va); 8787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->mFBOCache.bindDepthTarget(rsc, a); 88a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 897d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 907d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 9187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) { 927d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.bindColorTarget(rsc, NULL, slot); 93a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 947d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 957d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 9687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) { 977d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.bindDepthTarget(rsc, NULL); 98a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 997d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1007d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 10187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) { 1027d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.resetAll(rsc); 103a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1047d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1057d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 106aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 107aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP 108aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 109aeb094b520d8ea49b74129927578f18f758c873eJason Sams 11087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 11160709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setProjectionMatrix(rsc, m); 112a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller} 113a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller 11487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 11560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setModelviewMatrix(rsc, m); 116aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 117aeb094b520d8ea49b74129927578f18f758c873eJason Sams 11887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 11960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setTextureMatrix(rsc, m); 120aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 121aeb094b520d8ea49b74129927578f18f758c873eJason Sams 12287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf, 12387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float r, float g, float b, float a) { 12487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(pf); 125383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 1266445e5210c6d7f8689e94be9026153d017c9545bJason Sams} 1276445e5210c6d7f8689e94be9026153d017c9545bJason Sams 12887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) { 12960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->getProjectionMatrix(rsc, m); 13095333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk} 13195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 132aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 133aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing 134aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 135aeb094b520d8ea49b74129927578f18f758c873eJason Sams 13687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuadTexCoords(Context *rsc, Script *sc, 13787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x1, float y1, float z1, float u1, float v1, 13887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x2, float y2, float z2, float u2, float v2, 13987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x3, float y3, float z3, float u3, float v3, 14087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x4, float y4, float z4, float u4, float v4) { 141aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 142aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 143aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 144aeb094b520d8ea49b74129927578f18f758c873eJason Sams 145a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 146a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (!dc->gl.shaderCache->setup(rsc)) { 147a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk return; 148a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 149a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 150af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("Quad"); 151af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1); 152af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2); 153af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3); 154af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4); 155aeb094b520d8ea49b74129927578f18f758c873eJason Sams 156aeb094b520d8ea49b74129927578f18f758c873eJason Sams float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4}; 157aeb094b520d8ea49b74129927578f18f758c873eJason Sams const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4}; 158aeb094b520d8ea49b74129927578f18f758c873eJason Sams 159a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdVertexArray::Attrib attribs[2]; 16054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position"); 16154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0"); 16254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 163a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdVertexArray va(attribs, 2); 164c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk va.setup(rsc); 165aeb094b520d8ea49b74129927578f18f758c873eJason Sams 1662382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4); 167aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 168aeb094b520d8ea49b74129927578f18f758c873eJason Sams 16987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuad(Context *rsc, Script *sc, 17087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x1, float y1, float z1, 17187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x2, float y2, float z2, 17287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x3, float y3, float z3, 17387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x4, float y4, float z4) { 17487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1, 17587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x2, y2, z2, 1, 1, 17687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x3, y3, z3, 1, 0, 17787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x4, y4, z4, 0, 0); 178aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 179aeb094b520d8ea49b74129927578f18f758c873eJason Sams 18087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawSpriteScreenspace(Context *rsc, Script *sc, 18187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x, float y, float z, float w, float h) { 18260709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex()); 18360709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->setProgramVertex(rsc->getDefaultProgramVertex()); 184aeb094b520d8ea49b74129927578f18f758c873eJason Sams //rsc->setupCheck(); 185aeb094b520d8ea49b74129927578f18f758c873eJason Sams 186aeb094b520d8ea49b74129927578f18f758c873eJason Sams //GLint crop[4] = {0, h, w, -h}; 187aeb094b520d8ea49b74129927578f18f758c873eJason Sams 188aeb094b520d8ea49b74129927578f18f758c873eJason Sams float sh = rsc->getHeight(); 189aeb094b520d8ea49b74129927578f18f758c873eJason Sams 19087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsrDrawQuad(rsc, sc, 19187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x, sh - y, z, 192aeb094b520d8ea49b74129927578f18f758c873eJason Sams x+w, sh - y, z, 193aeb094b520d8ea49b74129927578f18f758c873eJason Sams x+w, sh - (y+h), z, 194aeb094b520d8ea49b74129927578f18f758c873eJason Sams x, sh - (y+h), z); 19560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->setProgramVertex((ProgramVertex *)tmp.get()); 196aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 197aeb094b520d8ea49b74129927578f18f758c873eJason Sams 19887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) { 199af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z); 20087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z); 201aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 202aeb094b520d8ea49b74129927578f18f758c873eJason Sams 20387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) { 20487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 205aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 206aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 207aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 208aeb094b520d8ea49b74129927578f18f758c873eJason Sams sm->render(rsc); 209aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 210aeb094b520d8ea49b74129927578f18f758c873eJason Sams 21187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) { 21287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 213aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 214aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 215aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 2164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitive(rsc, primIndex); 2174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 21987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex, 22087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams uint32_t start, uint32_t len) { 22187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 2224e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (!rsc->setupCheck()) { 2234e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2244e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitiveRange(rsc, primIndex, start, len); 226aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 227aeb094b520d8ea49b74129927578f18f758c873eJason Sams 22887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm, 22987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *minX, float *minY, float *minZ, 23087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *maxX, float *maxY, float *maxZ) { 23187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 232ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk sm->computeBBox(); 233ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minX = sm->mBBoxMin[0]; 234ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minY = sm->mBBoxMin[1]; 235ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minZ = sm->mBBoxMin[2]; 236ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxX = sm->mBBoxMax[0]; 237ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxY = sm->mBBoxMax[1]; 238ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxZ = sm->mBBoxMax[2]; 239ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 240ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 241aeb094b520d8ea49b74129927578f18f758c873eJason Sams 242aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 243aeb094b520d8ea49b74129927578f18f758c873eJason Sams// 244aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 245aeb094b520d8ea49b74129927578f18f758c873eJason Sams 246aeb094b520d8ea49b74129927578f18f758c873eJason Sams 24787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 24887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams ProgramFragment *pf = rsc->getProgramFragment(); 249383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 250aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 251aeb094b520d8ea49b74129927578f18f758c873eJason Sams 25287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFinish(Context *rsc, Script *sc) { 2532382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glFinish); 2547d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 2557d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 256b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams 25787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 258c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk rsc->mFBOCache.setup(rsc); 259889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk rsc->setupProgramStore(); 260aeb094b520d8ea49b74129927578f18f758c873eJason Sams 2612382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glClearColor, r, g, b, a); 2622382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT); 263aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 264aeb094b520d8ea49b74129927578f18f758c873eJason Sams 26587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearDepth(Context *rsc, Script *sc, float v) { 266c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk rsc->mFBOCache.setup(rsc); 267889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk rsc->setupProgramStore(); 26822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 2692382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glClearDepthf, v); 2702382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT); 271aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 272aeb094b520d8ea49b74129927578f18f758c873eJason Sams 27387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetWidth(Context *rsc, Script *sc) { 274aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getWidth(); 275aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 276aeb094b520d8ea49b74129927578f18f758c873eJason Sams 27787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetHeight(Context *rsc, Script *sc) { 278aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getHeight(); 279aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 280aeb094b520d8ea49b74129927578f18f758c873eJason Sams 28187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) { 28287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams const char *text = (const char *)a->getPtr(); 28387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams size_t allocSize = a->getType()->getSizeBytes(); 28409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, allocSize, x, y); 285d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 286d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 28787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) { 28809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 28909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, textLen, x, y); 29009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 29109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 29287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SetMetrics(Font::Rect *metrics, 29387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 294afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (left) { 29509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *left = metrics->left; 29609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 297afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (right) { 29809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *right = metrics->right; 29909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (top) { 30109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *top = metrics->top; 30209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 303afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (bottom) { 30409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *bottom = metrics->bottom; 30509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 30609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 30709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 30887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a, 30987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 31087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(a); 31187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams const char *text = (const char *)a->getPtr(); 31287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams size_t textLen = a->getType()->getSizeBytes(); 31309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 31409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 31587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 31609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 31709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 31887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureText(Context *rsc, Script *sc, const char *text, 31987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 32009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 32109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 32209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 32387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 324d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 325d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 32687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFont(Context *rsc, Script *sc, Font *font) { 327605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ(font); 328d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsi_ContextBindFont(rsc, font); 329d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 330aeb094b520d8ea49b74129927578f18f758c873eJason Sams 33187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 3329fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk rsc->mStateFont.setFontColor(r, g, b, a); 3339fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk} 3349fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk 335aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 33687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 337