rsScriptC_LibGL.cpp revision a04e30dbb5ab11592b03666bb3d102070759c58e
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); 827d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 837d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 8487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) { 857d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk CHECK_OBJ(va); 8687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->mFBOCache.bindDepthTarget(rsc, a); 877d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 887d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 8987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) { 907d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.bindColorTarget(rsc, NULL, slot); 917d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 927d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 9387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) { 947d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.bindDepthTarget(rsc, NULL); 957d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 967d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 9787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) { 987d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.resetAll(rsc); 997d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1007d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 101aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 102aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP 103aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 104aeb094b520d8ea49b74129927578f18f758c873eJason Sams 10587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 10660709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setProjectionMatrix(rsc, m); 107a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller} 108a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller 10987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 11060709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setModelviewMatrix(rsc, m); 111aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 112aeb094b520d8ea49b74129927578f18f758c873eJason Sams 11387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { 11460709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setTextureMatrix(rsc, m); 115aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 116aeb094b520d8ea49b74129927578f18f758c873eJason Sams 11787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf, 11887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float r, float g, float b, float a) { 11987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(pf); 120383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 1216445e5210c6d7f8689e94be9026153d017c9545bJason Sams} 1226445e5210c6d7f8689e94be9026153d017c9545bJason Sams 12387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) { 12460709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->getProjectionMatrix(rsc, m); 12595333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk} 12695333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 127aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 128aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing 129aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 130aeb094b520d8ea49b74129927578f18f758c873eJason Sams 13187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuadTexCoords(Context *rsc, Script *sc, 13287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x1, float y1, float z1, float u1, float v1, 13387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x2, float y2, float z2, float u2, float v2, 13487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x3, float y3, float z3, float u3, float v3, 13587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x4, float y4, float z4, float u4, float v4) { 136aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 137aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 138aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 139aeb094b520d8ea49b74129927578f18f758c873eJason Sams 140a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 141a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (!dc->gl.shaderCache->setup(rsc)) { 142a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk return; 143a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 144a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 145aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("Quad"); 146aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1); 147aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2); 148aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3); 149aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4); 150aeb094b520d8ea49b74129927578f18f758c873eJason Sams 151aeb094b520d8ea49b74129927578f18f758c873eJason Sams float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4}; 152aeb094b520d8ea49b74129927578f18f758c873eJason Sams const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4}; 153aeb094b520d8ea49b74129927578f18f758c873eJason Sams 154a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdVertexArray::Attrib attribs[2]; 15554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position"); 15654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0"); 15754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 158a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdVertexArray va(attribs, 2); 159a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk va.setupGL2(rsc); 160aeb094b520d8ea49b74129927578f18f758c873eJason Sams 161aeb094b520d8ea49b74129927578f18f758c873eJason Sams glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 162aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 163aeb094b520d8ea49b74129927578f18f758c873eJason Sams 16487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuad(Context *rsc, Script *sc, 16587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x1, float y1, float z1, 16687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x2, float y2, float z2, 16787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x3, float y3, float z3, 16887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x4, float y4, float z4) { 16987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1, 17087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x2, y2, z2, 1, 1, 17187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x3, y3, z3, 1, 0, 17287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x4, y4, z4, 0, 0); 173aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 174aeb094b520d8ea49b74129927578f18f758c873eJason Sams 17587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawSpriteScreenspace(Context *rsc, Script *sc, 17687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float x, float y, float z, float w, float h) { 17760709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex()); 17860709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->setProgramVertex(rsc->getDefaultProgramVertex()); 179aeb094b520d8ea49b74129927578f18f758c873eJason Sams //rsc->setupCheck(); 180aeb094b520d8ea49b74129927578f18f758c873eJason Sams 181aeb094b520d8ea49b74129927578f18f758c873eJason Sams //GLint crop[4] = {0, h, w, -h}; 182aeb094b520d8ea49b74129927578f18f758c873eJason Sams 183aeb094b520d8ea49b74129927578f18f758c873eJason Sams float sh = rsc->getHeight(); 184aeb094b520d8ea49b74129927578f18f758c873eJason Sams 18587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsrDrawQuad(rsc, sc, 18687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams x, sh - y, z, 187aeb094b520d8ea49b74129927578f18f758c873eJason Sams x+w, sh - y, z, 188aeb094b520d8ea49b74129927578f18f758c873eJason Sams x+w, sh - (y+h), z, 189aeb094b520d8ea49b74129927578f18f758c873eJason Sams x, sh - (y+h), z); 19060709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->setProgramVertex((ProgramVertex *)tmp.get()); 191aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 192aeb094b520d8ea49b74129927578f18f758c873eJason Sams 19387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) { 194aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z); 19587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z); 196aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 197aeb094b520d8ea49b74129927578f18f758c873eJason Sams 19887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) { 19987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 200aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 201aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 202aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 203aeb094b520d8ea49b74129927578f18f758c873eJason Sams sm->render(rsc); 204aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 205aeb094b520d8ea49b74129927578f18f758c873eJason Sams 20687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) { 20787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 208aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 209aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 210aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 2114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitive(rsc, primIndex); 2124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 21487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex, 21587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams uint32_t start, uint32_t len) { 21687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 2174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (!rsc->setupCheck()) { 2184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2204e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitiveRange(rsc, primIndex, start, len); 221aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 222aeb094b520d8ea49b74129927578f18f758c873eJason Sams 22387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm, 22487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *minX, float *minY, float *minZ, 22587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *maxX, float *maxY, float *maxZ) { 22687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 227ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk sm->computeBBox(); 228ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minX = sm->mBBoxMin[0]; 229ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minY = sm->mBBoxMin[1]; 230ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minZ = sm->mBBoxMin[2]; 231ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxX = sm->mBBoxMax[0]; 232ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxY = sm->mBBoxMax[1]; 233ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxZ = sm->mBBoxMax[2]; 234ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 235ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 236aeb094b520d8ea49b74129927578f18f758c873eJason Sams 237aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 238aeb094b520d8ea49b74129927578f18f758c873eJason Sams// 239aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 240aeb094b520d8ea49b74129927578f18f758c873eJason Sams 241aeb094b520d8ea49b74129927578f18f758c873eJason Sams 24287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 24387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams ProgramFragment *pf = rsc->getProgramFragment(); 244383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 245aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 246aeb094b520d8ea49b74129927578f18f758c873eJason Sams 24787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFinish(Context *rsc, Script *sc) { 2487d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk glFinish(); 2497d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 2507d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 251b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams 25287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 2537d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.setupGL2(rsc); 254889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk rsc->setupProgramStore(); 255aeb094b520d8ea49b74129927578f18f758c873eJason Sams 25622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClearColor(r, g, b, a); 25722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClear(GL_COLOR_BUFFER_BIT); 258aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 259aeb094b520d8ea49b74129927578f18f758c873eJason Sams 26087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearDepth(Context *rsc, Script *sc, float v) { 2617d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.setupGL2(rsc); 262889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk rsc->setupProgramStore(); 26322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 26422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClearDepthf(v); 26522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClear(GL_DEPTH_BUFFER_BIT); 266aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 267aeb094b520d8ea49b74129927578f18f758c873eJason Sams 26887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetWidth(Context *rsc, Script *sc) { 269aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getWidth(); 270aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 271aeb094b520d8ea49b74129927578f18f758c873eJason Sams 27287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetHeight(Context *rsc, Script *sc) { 273aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getHeight(); 274aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 275aeb094b520d8ea49b74129927578f18f758c873eJason Sams 27687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) { 27787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams const char *text = (const char *)a->getPtr(); 27887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams size_t allocSize = a->getType()->getSizeBytes(); 27909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, allocSize, x, y); 280d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 281d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 28287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) { 28309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 28409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, textLen, x, y); 28509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 28609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 28787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SetMetrics(Font::Rect *metrics, 28887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 289afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (left) { 29009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *left = metrics->left; 29109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 292afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (right) { 29309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *right = metrics->right; 29409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 295afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (top) { 29609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *top = metrics->top; 29709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 298afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (bottom) { 29909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *bottom = metrics->bottom; 30009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 30109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 30209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 30387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a, 30487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 30587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(a); 30687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams const char *text = (const char *)a->getPtr(); 30787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams size_t textLen = a->getType()->getSizeBytes(); 30809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 30909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 31087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 31109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 31209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 31387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureText(Context *rsc, Script *sc, const char *text, 31487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 31509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 31609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 31709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 31887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 319d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 320d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 32187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFont(Context *rsc, Script *sc, Font *font) { 322605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ(font); 323d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsi_ContextBindFont(rsc, font); 324d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 325aeb094b520d8ea49b74129927578f18f758c873eJason Sams 32687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 3279fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk rsc->mStateFont.setFontColor(r, g, b, a); 3289fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk} 3299fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk 330aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 33187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 332