1536923df75eb53a2c27e889526b200e170e45492Jason Sams/* 24a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 3536923df75eb53a2c27e889526b200e170e45492Jason Sams * 4536923df75eb53a2c27e889526b200e170e45492Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5536923df75eb53a2c27e889526b200e170e45492Jason Sams * you may not use this file except in compliance with the License. 6536923df75eb53a2c27e889526b200e170e45492Jason Sams * You may obtain a copy of the License at 7536923df75eb53a2c27e889526b200e170e45492Jason Sams * 8536923df75eb53a2c27e889526b200e170e45492Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9536923df75eb53a2c27e889526b200e170e45492Jason Sams * 10536923df75eb53a2c27e889526b200e170e45492Jason Sams * Unless required by applicable law or agreed to in writing, software 11536923df75eb53a2c27e889526b200e170e45492Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12536923df75eb53a2c27e889526b200e170e45492Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13536923df75eb53a2c27e889526b200e170e45492Jason Sams * See the License for the specific language governing permissions and 14536923df75eb53a2c27e889526b200e170e45492Jason Sams * limitations under the License. 15536923df75eb53a2c27e889526b200e170e45492Jason Sams */ 16536923df75eb53a2c27e889526b200e170e45492Jason Sams 17536923df75eb53a2c27e889526b200e170e45492Jason Sams#include "rsContext.h" 18536923df75eb53a2c27e889526b200e170e45492Jason Sams#include "rsScriptC.h" 19fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsMatrix4x4.h" 20fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsMatrix3x3.h" 21fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsMatrix2x2.h" 22536923df75eb53a2c27e889526b200e170e45492Jason Sams 23536923df75eb53a2c27e889526b200e170e45492Jason Sams#include "utils/Timers.h" 244a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#include "driver/rsdVertexArray.h" 254a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#include "driver/rsdShaderCache.h" 264a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#include "driver/rsdCore.h" 27536923df75eb53a2c27e889526b200e170e45492Jason Sams 28536923df75eb53a2c27e889526b200e170e45492Jason Sams#define GL_GLEXT_PROTOTYPES 29536923df75eb53a2c27e889526b200e170e45492Jason Sams 30536923df75eb53a2c27e889526b200e170e45492Jason Sams#include <GLES/gl.h> 31536923df75eb53a2c27e889526b200e170e45492Jason Sams#include <GLES/glext.h> 32536923df75eb53a2c27e889526b200e170e45492Jason Sams#include <GLES2/gl2.h> 33536923df75eb53a2c27e889526b200e170e45492Jason Sams#include <GLES2/gl2ext.h> 34536923df75eb53a2c27e889526b200e170e45492Jason Sams 35536923df75eb53a2c27e889526b200e170e45492Jason Sams#include <time.h> 36536923df75eb53a2c27e889526b200e170e45492Jason Sams 37536923df75eb53a2c27e889526b200e170e45492Jason Samsusing namespace android; 38536923df75eb53a2c27e889526b200e170e45492Jason Samsusing namespace android::renderscript; 39536923df75eb53a2c27e889526b200e170e45492Jason Sams 40fcf7231249822ff4dae852f1de1f799756689f91Jason Samsnamespace android { 41fcf7231249822ff4dae852f1de1f799756689f91Jason Samsnamespace renderscript { 42536923df75eb53a2c27e889526b200e170e45492Jason Sams 43536923df75eb53a2c27e889526b200e170e45492Jason Sams////////////////////////////////////////////////////////////////////////////// 44536923df75eb53a2c27e889526b200e170e45492Jason Sams// Context 45536923df75eb53a2c27e889526b200e170e45492Jason Sams////////////////////////////////////////////////////////////////////////////// 46536923df75eb53a2c27e889526b200e170e45492Jason Sams 47fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrBindTexture(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) { 48fcf7231249822ff4dae852f1de1f799756689f91Jason Sams CHECK_OBJ_OR_NULL(a); 49fcf7231249822ff4dae852f1de1f799756689f91Jason Sams CHECK_OBJ(pf); 50fcf7231249822ff4dae852f1de1f799756689f91Jason Sams pf->bindTexture(rsc, slot, a); 51536923df75eb53a2c27e889526b200e170e45492Jason Sams} 52536923df75eb53a2c27e889526b200e170e45492Jason Sams 53fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) { 54f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams CHECK_OBJ_OR_NULL(vs); 55f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams CHECK_OBJ(vpf); 56fcf7231249822ff4dae852f1de1f799756689f91Jason Sams pf->bindSampler(rsc, slot, s); 57536923df75eb53a2c27e889526b200e170e45492Jason Sams} 58536923df75eb53a2c27e889526b200e170e45492Jason Sams 59fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) { 60fcf7231249822ff4dae852f1de1f799756689f91Jason Sams CHECK_OBJ_OR_NULL(ps); 61fcf7231249822ff4dae852f1de1f799756689f91Jason Sams rsc->setProgramStore(ps); 62536923df75eb53a2c27e889526b200e170e45492Jason Sams} 63536923df75eb53a2c27e889526b200e170e45492Jason Sams 64fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) { 65f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams CHECK_OBJ_OR_NULL(pf); 66fcf7231249822ff4dae852f1de1f799756689f91Jason Sams rsc->setProgramFragment(pf); 67536923df75eb53a2c27e889526b200e170e45492Jason Sams} 68536923df75eb53a2c27e889526b200e170e45492Jason Sams 69fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) { 70f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams CHECK_OBJ_OR_NULL(pv); 71fcf7231249822ff4dae852f1de1f799756689f91Jason Sams rsc->setProgramVertex(pv); 72536923df75eb53a2c27e889526b200e170e45492Jason Sams} 73536923df75eb53a2c27e889526b200e170e45492Jason Sams 74fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) { 75fcf7231249822ff4dae852f1de1f799756689f91Jason Sams CHECK_OBJ_OR_NULL(pr); 76fcf7231249822ff4dae852f1de1f799756689f91Jason Sams rsc->setProgramRaster(pr); 77536923df75eb53a2c27e889526b200e170e45492Jason Sams} 78536923df75eb53a2c27e889526b200e170e45492Jason Sams 79fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) { 808e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk CHECK_OBJ(va); 81fcf7231249822ff4dae852f1de1f799756689f91Jason Sams rsc->mFBOCache.bindColorTarget(rsc, a, slot); 828e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk} 838e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk 84fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) { 858e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk CHECK_OBJ(va); 86fcf7231249822ff4dae852f1de1f799756689f91Jason Sams rsc->mFBOCache.bindDepthTarget(rsc, a); 878e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk} 888e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk 89fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) { 908e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk rsc->mFBOCache.bindColorTarget(rsc, NULL, slot); 918e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk} 928e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk 93fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) { 948e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk rsc->mFBOCache.bindDepthTarget(rsc, NULL); 958e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk} 968e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk 97fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) { 988e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk rsc->mFBOCache.resetAll(rsc); 998e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk} 1008e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk 101536923df75eb53a2c27e889526b200e170e45492Jason Sams////////////////////////////////////////////////////////////////////////////// 102536923df75eb53a2c27e889526b200e170e45492Jason Sams// VP 103536923df75eb53a2c27e889526b200e170e45492Jason Sams////////////////////////////////////////////////////////////////////////////// 104536923df75eb53a2c27e889526b200e170e45492Jason Sams 105fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 106a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams rsc->getProgramVertex()->setProjectionMatrix(rsc, m); 107d8e76204555e5739df495f92061cd3861ad83bb9Jim Miller} 108d8e76204555e5739df495f92061cd3861ad83bb9Jim Miller 109fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 110a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams rsc->getProgramVertex()->setModelviewMatrix(rsc, m); 111536923df75eb53a2c27e889526b200e170e45492Jason Sams} 112536923df75eb53a2c27e889526b200e170e45492Jason Sams 113fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 114a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams rsc->getProgramVertex()->setTextureMatrix(rsc, m); 115536923df75eb53a2c27e889526b200e170e45492Jason Sams} 116536923df75eb53a2c27e889526b200e170e45492Jason Sams 117fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf, 118fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float r, float g, float b, float a) { 119fcf7231249822ff4dae852f1de1f799756689f91Jason Sams CHECK_OBJ(pf); 120b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 121442a647424e6537e94341654e3ae5d52efd84862Jason Sams} 122442a647424e6537e94341654e3ae5d52efd84862Jason Sams 123fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) { 124a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams rsc->getProgramVertex()->getProjectionMatrix(rsc, m); 125cbed7524eacb4adf61c20a0af8bfb37938610bd6Alex Sakhartchouk} 126cbed7524eacb4adf61c20a0af8bfb37938610bd6Alex Sakhartchouk 127536923df75eb53a2c27e889526b200e170e45492Jason Sams////////////////////////////////////////////////////////////////////////////// 128536923df75eb53a2c27e889526b200e170e45492Jason Sams// Drawing 129536923df75eb53a2c27e889526b200e170e45492Jason Sams////////////////////////////////////////////////////////////////////////////// 130536923df75eb53a2c27e889526b200e170e45492Jason Sams 131fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrDrawQuadTexCoords(Context *rsc, Script *sc, 132fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float x1, float y1, float z1, float u1, float v1, 133fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float x2, float y2, float z2, float u2, float v2, 134fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float x3, float y3, float z3, float u3, float v3, 135fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float x4, float y4, float z4, float u4, float v4) { 136536923df75eb53a2c27e889526b200e170e45492Jason Sams if (!rsc->setupCheck()) { 137536923df75eb53a2c27e889526b200e170e45492Jason Sams return; 138536923df75eb53a2c27e889526b200e170e45492Jason Sams } 139536923df75eb53a2c27e889526b200e170e45492Jason Sams 1404a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 1414a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk if (!dc->gl.shaderCache->setup(rsc)) { 1424a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk return; 1434a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk } 1444a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 145536923df75eb53a2c27e889526b200e170e45492Jason Sams //LOGE("Quad"); 146536923df75eb53a2c27e889526b200e170e45492Jason Sams //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1); 147536923df75eb53a2c27e889526b200e170e45492Jason Sams //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2); 148536923df75eb53a2c27e889526b200e170e45492Jason Sams //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3); 149536923df75eb53a2c27e889526b200e170e45492Jason Sams //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4); 150536923df75eb53a2c27e889526b200e170e45492Jason Sams 151536923df75eb53a2c27e889526b200e170e45492Jason Sams float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4}; 152536923df75eb53a2c27e889526b200e170e45492Jason Sams const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4}; 153536923df75eb53a2c27e889526b200e170e45492Jason Sams 1544a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk RsdVertexArray::Attrib attribs[2]; 1559d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position"); 1569d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0"); 1579d71e2180062931416092f26276a07e55b318f62Alex Sakhartchouk 1584a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk RsdVertexArray va(attribs, 2); 159407cae950325682a56fe5373dd218a666da901efAlex Sakhartchouk va.setup(rsc); 160536923df75eb53a2c27e889526b200e170e45492Jason Sams 1615316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4); 162536923df75eb53a2c27e889526b200e170e45492Jason Sams} 163536923df75eb53a2c27e889526b200e170e45492Jason Sams 164fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrDrawQuad(Context *rsc, Script *sc, 165fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float x1, float y1, float z1, 166fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float x2, float y2, float z2, 167fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float x3, float y3, float z3, 168fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float x4, float y4, float z4) { 169fcf7231249822ff4dae852f1de1f799756689f91Jason Sams rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1, 170fcf7231249822ff4dae852f1de1f799756689f91Jason Sams x2, y2, z2, 1, 1, 171fcf7231249822ff4dae852f1de1f799756689f91Jason Sams x3, y3, z3, 1, 0, 172fcf7231249822ff4dae852f1de1f799756689f91Jason Sams x4, y4, z4, 0, 0); 173536923df75eb53a2c27e889526b200e170e45492Jason Sams} 174536923df75eb53a2c27e889526b200e170e45492Jason Sams 175fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrDrawSpriteScreenspace(Context *rsc, Script *sc, 176fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float x, float y, float z, float w, float h) { 177a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex()); 178a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams rsc->setProgramVertex(rsc->getDefaultProgramVertex()); 179536923df75eb53a2c27e889526b200e170e45492Jason Sams //rsc->setupCheck(); 180536923df75eb53a2c27e889526b200e170e45492Jason Sams 181536923df75eb53a2c27e889526b200e170e45492Jason Sams //GLint crop[4] = {0, h, w, -h}; 182536923df75eb53a2c27e889526b200e170e45492Jason Sams 183536923df75eb53a2c27e889526b200e170e45492Jason Sams float sh = rsc->getHeight(); 184536923df75eb53a2c27e889526b200e170e45492Jason Sams 185fcf7231249822ff4dae852f1de1f799756689f91Jason Sams rsrDrawQuad(rsc, sc, 186fcf7231249822ff4dae852f1de1f799756689f91Jason Sams x, sh - y, z, 187536923df75eb53a2c27e889526b200e170e45492Jason Sams x+w, sh - y, z, 188536923df75eb53a2c27e889526b200e170e45492Jason Sams x+w, sh - (y+h), z, 189536923df75eb53a2c27e889526b200e170e45492Jason Sams x, sh - (y+h), z); 190a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams rsc->setProgramVertex((ProgramVertex *)tmp.get()); 191536923df75eb53a2c27e889526b200e170e45492Jason Sams} 192536923df75eb53a2c27e889526b200e170e45492Jason Sams 193fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) { 194536923df75eb53a2c27e889526b200e170e45492Jason Sams //LOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z); 195fcf7231249822ff4dae852f1de1f799756689f91Jason Sams rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z); 196536923df75eb53a2c27e889526b200e170e45492Jason Sams} 197536923df75eb53a2c27e889526b200e170e45492Jason Sams 198fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) { 199fcf7231249822ff4dae852f1de1f799756689f91Jason Sams CHECK_OBJ(sm); 200536923df75eb53a2c27e889526b200e170e45492Jason Sams if (!rsc->setupCheck()) { 201536923df75eb53a2c27e889526b200e170e45492Jason Sams return; 202536923df75eb53a2c27e889526b200e170e45492Jason Sams } 203536923df75eb53a2c27e889526b200e170e45492Jason Sams sm->render(rsc); 204536923df75eb53a2c27e889526b200e170e45492Jason Sams} 205536923df75eb53a2c27e889526b200e170e45492Jason Sams 206fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) { 207fcf7231249822ff4dae852f1de1f799756689f91Jason Sams CHECK_OBJ(sm); 208536923df75eb53a2c27e889526b200e170e45492Jason Sams if (!rsc->setupCheck()) { 209536923df75eb53a2c27e889526b200e170e45492Jason Sams return; 210536923df75eb53a2c27e889526b200e170e45492Jason Sams } 211164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk sm->renderPrimitive(rsc, primIndex); 212164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk} 213164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk 214fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex, 215fcf7231249822ff4dae852f1de1f799756689f91Jason Sams uint32_t start, uint32_t len) { 216fcf7231249822ff4dae852f1de1f799756689f91Jason Sams CHECK_OBJ(sm); 217164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk if (!rsc->setupCheck()) { 218164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk return; 219164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk } 220164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk sm->renderPrimitiveRange(rsc, primIndex, start, len); 221536923df75eb53a2c27e889526b200e170e45492Jason Sams} 222536923df75eb53a2c27e889526b200e170e45492Jason Sams 223fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm, 224fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float *minX, float *minY, float *minZ, 225fcf7231249822ff4dae852f1de1f799756689f91Jason Sams float *maxX, float *maxY, float *maxZ) { 226fcf7231249822ff4dae852f1de1f799756689f91Jason Sams CHECK_OBJ(sm); 227a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk sm->computeBBox(); 228a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk *minX = sm->mBBoxMin[0]; 229a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk *minY = sm->mBBoxMin[1]; 230a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk *minZ = sm->mBBoxMin[2]; 231a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk *maxX = sm->mBBoxMax[0]; 232a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk *maxY = sm->mBBoxMax[1]; 233a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk *maxZ = sm->mBBoxMax[2]; 234a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk} 235a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk 236536923df75eb53a2c27e889526b200e170e45492Jason Sams 237536923df75eb53a2c27e889526b200e170e45492Jason Sams////////////////////////////////////////////////////////////////////////////// 238536923df75eb53a2c27e889526b200e170e45492Jason Sams// 239536923df75eb53a2c27e889526b200e170e45492Jason Sams////////////////////////////////////////////////////////////////////////////// 240536923df75eb53a2c27e889526b200e170e45492Jason Sams 241536923df75eb53a2c27e889526b200e170e45492Jason Sams 242fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 243fcf7231249822ff4dae852f1de1f799756689f91Jason Sams ProgramFragment *pf = rsc->getProgramFragment(); 244b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 245536923df75eb53a2c27e889526b200e170e45492Jason Sams} 246536923df75eb53a2c27e889526b200e170e45492Jason Sams 247fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrFinish(Context *rsc, Script *sc) { 2485316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams RSD_CALL_GL(glFinish); 2498e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk} 2508e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk 2516d8eb266dd398abf0511685fdaf98abba3396174Jason Sams 252fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 253407cae950325682a56fe5373dd218a666da901efAlex Sakhartchouk rsc->mFBOCache.setup(rsc); 254feede2aee6fe3e721ee71ffc35b277f1d9260e03Alex Sakhartchouk rsc->setupProgramStore(); 255536923df75eb53a2c27e889526b200e170e45492Jason Sams 2565316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams RSD_CALL_GL(glClearColor, r, g, b, a); 2575316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT); 258536923df75eb53a2c27e889526b200e170e45492Jason Sams} 259536923df75eb53a2c27e889526b200e170e45492Jason Sams 260fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrClearDepth(Context *rsc, Script *sc, float v) { 261407cae950325682a56fe5373dd218a666da901efAlex Sakhartchouk rsc->mFBOCache.setup(rsc); 262feede2aee6fe3e721ee71ffc35b277f1d9260e03Alex Sakhartchouk rsc->setupProgramStore(); 263d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams 2645316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams RSD_CALL_GL(glClearDepthf, v); 2655316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT); 266536923df75eb53a2c27e889526b200e170e45492Jason Sams} 267536923df75eb53a2c27e889526b200e170e45492Jason Sams 268fcf7231249822ff4dae852f1de1f799756689f91Jason Samsuint32_t rsrGetWidth(Context *rsc, Script *sc) { 269536923df75eb53a2c27e889526b200e170e45492Jason Sams return rsc->getWidth(); 270536923df75eb53a2c27e889526b200e170e45492Jason Sams} 271536923df75eb53a2c27e889526b200e170e45492Jason Sams 272fcf7231249822ff4dae852f1de1f799756689f91Jason Samsuint32_t rsrGetHeight(Context *rsc, Script *sc) { 273536923df75eb53a2c27e889526b200e170e45492Jason Sams return rsc->getHeight(); 274536923df75eb53a2c27e889526b200e170e45492Jason Sams} 275536923df75eb53a2c27e889526b200e170e45492Jason Sams 276fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) { 277fcf7231249822ff4dae852f1de1f799756689f91Jason Sams const char *text = (const char *)a->getPtr(); 278fcf7231249822ff4dae852f1de1f799756689f91Jason Sams size_t allocSize = a->getType()->getSizeBytes(); 27910825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk rsc->mStateFont.renderText(text, allocSize, x, y); 2809b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk} 2819b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk 282fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) { 28310825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk size_t textLen = strlen(text); 28410825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk rsc->mStateFont.renderText(text, textLen, x, y); 28510825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk} 28610825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk 287fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SetMetrics(Font::Rect *metrics, 288fcf7231249822ff4dae852f1de1f799756689f91Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 289ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk if (left) { 29010825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk *left = metrics->left; 29110825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk } 292ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk if (right) { 29310825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk *right = metrics->right; 29410825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk } 295ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk if (top) { 29610825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk *top = metrics->top; 29710825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk } 298ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk if (bottom) { 29910825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk *bottom = metrics->bottom; 30010825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk } 30110825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk} 30210825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk 303fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a, 304fcf7231249822ff4dae852f1de1f799756689f91Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 305fcf7231249822ff4dae852f1de1f799756689f91Jason Sams CHECK_OBJ(a); 306fcf7231249822ff4dae852f1de1f799756689f91Jason Sams const char *text = (const char *)a->getPtr(); 307fcf7231249822ff4dae852f1de1f799756689f91Jason Sams size_t textLen = a->getType()->getSizeBytes(); 30810825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk Font::Rect metrics; 30910825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 310fcf7231249822ff4dae852f1de1f799756689f91Jason Sams SetMetrics(&metrics, left, right, top, bottom); 31110825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk} 31210825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk 313fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrMeasureText(Context *rsc, Script *sc, const char *text, 314fcf7231249822ff4dae852f1de1f799756689f91Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 31510825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk size_t textLen = strlen(text); 31610825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk Font::Rect metrics; 31710825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 318fcf7231249822ff4dae852f1de1f799756689f91Jason Sams SetMetrics(&metrics, left, right, top, bottom); 3199b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk} 3209b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk 321fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrBindFont(Context *rsc, Script *sc, Font *font) { 322f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams CHECK_OBJ(font); 3239b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk rsi_ContextBindFont(rsc, font); 3249b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk} 325536923df75eb53a2c27e889526b200e170e45492Jason Sams 326fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 327fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk rsc->mStateFont.setFontColor(r, g, b, a); 328fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk} 329fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk 330536923df75eb53a2c27e889526b200e170e45492Jason Sams} 331fcf7231249822ff4dae852f1de1f799756689f91Jason Sams} 332