rsScriptC_LibGL.cpp revision 9e0afb5a2b3e476c42a373e7cd89cef4a34f8195
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); 159c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk va.setup(rsc); 160aeb094b520d8ea49b74129927578f18f758c873eJason Sams 1612382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(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 1989e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsvoid rsrDrawPath(Context *rsc, Script *sc, Path *sm) { 1999e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams CHECK_OBJ(sm); 2009e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams if (!rsc->setupCheck()) { 2019e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams return; 2029e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams } 2039e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams sm->render(rsc); 2049e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 2059e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 20687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) { 20787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 208aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 209aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 210aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 211aeb094b520d8ea49b74129927578f18f758c873eJason Sams sm->render(rsc); 212aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 213aeb094b520d8ea49b74129927578f18f758c873eJason Sams 21487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) { 21587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 216aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 217aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 218aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 2194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitive(rsc, primIndex); 2204e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2214e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 22287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex, 22387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams uint32_t start, uint32_t len) { 22487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 2254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (!rsc->setupCheck()) { 2264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2284e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitiveRange(rsc, primIndex, start, len); 229aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 230aeb094b520d8ea49b74129927578f18f758c873eJason Sams 23187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm, 23287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *minX, float *minY, float *minZ, 23387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *maxX, float *maxY, float *maxZ) { 23487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 235ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk sm->computeBBox(); 236ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minX = sm->mBBoxMin[0]; 237ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minY = sm->mBBoxMin[1]; 238ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minZ = sm->mBBoxMin[2]; 239ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxX = sm->mBBoxMax[0]; 240ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxY = sm->mBBoxMax[1]; 241ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxZ = sm->mBBoxMax[2]; 242ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 243ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 244aeb094b520d8ea49b74129927578f18f758c873eJason Sams 245aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 246aeb094b520d8ea49b74129927578f18f758c873eJason Sams// 247aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 248aeb094b520d8ea49b74129927578f18f758c873eJason Sams 249aeb094b520d8ea49b74129927578f18f758c873eJason Sams 25087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 25187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams ProgramFragment *pf = rsc->getProgramFragment(); 252383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 253aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 254aeb094b520d8ea49b74129927578f18f758c873eJason Sams 25587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFinish(Context *rsc, Script *sc) { 2562382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glFinish); 2577d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 2587d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 259b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams 26087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 261c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk rsc->mFBOCache.setup(rsc); 262889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk rsc->setupProgramStore(); 263aeb094b520d8ea49b74129927578f18f758c873eJason Sams 2642382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glClearColor, r, g, b, a); 2652382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT); 266aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 267aeb094b520d8ea49b74129927578f18f758c873eJason Sams 26887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearDepth(Context *rsc, Script *sc, float v) { 269c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk rsc->mFBOCache.setup(rsc); 270889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk rsc->setupProgramStore(); 27122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 2722382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glClearDepthf, v); 2732382aba4a55c6ae74789c478eead8fbd96593321Jason Sams RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT); 274aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 275aeb094b520d8ea49b74129927578f18f758c873eJason Sams 27687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetWidth(Context *rsc, Script *sc) { 277aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getWidth(); 278aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 279aeb094b520d8ea49b74129927578f18f758c873eJason Sams 28087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetHeight(Context *rsc, Script *sc) { 281aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getHeight(); 282aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 283aeb094b520d8ea49b74129927578f18f758c873eJason Sams 28487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) { 28587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams const char *text = (const char *)a->getPtr(); 28687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams size_t allocSize = a->getType()->getSizeBytes(); 28709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, allocSize, x, y); 288d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 289d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 29087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) { 29109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 29209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, textLen, x, y); 29309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 29409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 29587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SetMetrics(Font::Rect *metrics, 29687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 297afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (left) { 29809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *left = metrics->left; 29909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (right) { 30109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *right = metrics->right; 30209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 303afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (top) { 30409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *top = metrics->top; 30509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 306afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (bottom) { 30709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *bottom = metrics->bottom; 30809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 30909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 31009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 31187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a, 31287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 31387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(a); 31487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams const char *text = (const char *)a->getPtr(); 31587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams size_t textLen = a->getType()->getSizeBytes(); 31609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 31709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 31887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 31909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 32009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 32187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureText(Context *rsc, Script *sc, const char *text, 32287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 32309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 32409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 32509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 32687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 327d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 328d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 32987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFont(Context *rsc, Script *sc, Font *font) { 330605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ(font); 331d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsi_ContextBindFont(rsc, font); 332d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 333aeb094b520d8ea49b74129927578f18f758c873eJason Sams 33487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) { 3359fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk rsc->mStateFont.setFontColor(r, g, b, a); 3369fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk} 3379fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk 338aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 33987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 340