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