rsScriptC_LibGL.cpp revision 60709257bbdeb0c50f39b9c8969dc76264d6e142
1aeb094b520d8ea49b74129927578f18f758c873eJason Sams/*
2aeb094b520d8ea49b74129927578f18f758c873eJason Sams * Copyright (C) 2009 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"
19aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "rsMatrix.h"
20aeb094b520d8ea49b74129927578f18f758c873eJason Sams
21aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "utils/Timers.h"
22aeb094b520d8ea49b74129927578f18f758c873eJason Sams
23aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GL_GLEXT_PROTOTYPES
24aeb094b520d8ea49b74129927578f18f758c873eJason Sams
25aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/gl.h>
26aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/glext.h>
27aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2.h>
28aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2ext.h>
29aeb094b520d8ea49b74129927578f18f758c873eJason Sams
30aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <time.h>
31aeb094b520d8ea49b74129927578f18f758c873eJason Sams
32aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android;
33aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android::renderscript;
34aeb094b520d8ea49b74129927578f18f758c873eJason Sams
35aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GET_TLS()  Context::ScriptTLSStruct * tls = \
36aeb094b520d8ea49b74129927578f18f758c873eJason Sams    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
37aeb094b520d8ea49b74129927578f18f758c873eJason Sams    Context * rsc = tls->mContext; \
38aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ScriptC * sc = (ScriptC *) tls->mScript
39aeb094b520d8ea49b74129927578f18f758c873eJason Sams
40aeb094b520d8ea49b74129927578f18f758c873eJason Sams
41aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
42aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Context
43aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
44aeb094b520d8ea49b74129927578f18f758c873eJason Sams
45afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_bindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va) {
46605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(va);
47605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vpf);
48aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
49aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ProgramBindTexture(rsc,
50aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<ProgramFragment *>(vpf),
51aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           slot,
52aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<Allocation *>(va));
53aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
54aeb094b520d8ea49b74129927578f18f758c873eJason Sams
55afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_bindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs) {
56605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(vs);
57605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vpf);
58aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
59aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ProgramBindSampler(rsc,
60aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<ProgramFragment *>(vpf),
61aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           slot,
62aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<Sampler *>(vs));
63aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
64aeb094b520d8ea49b74129927578f18f758c873eJason Sams
65afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_bindProgramStore(RsProgramStore pfs) {
66605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(pfs);
67aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
68aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramStore(rsc, pfs);
69aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
70aeb094b520d8ea49b74129927578f18f758c873eJason Sams
71afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_bindProgramFragment(RsProgramFragment pf) {
72605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(pf);
73aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
74aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramFragment(rsc, pf);
75aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
76aeb094b520d8ea49b74129927578f18f758c873eJason Sams
77afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_bindProgramVertex(RsProgramVertex pv) {
78605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(pv);
79aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
80aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramVertex(rsc, pv);
81aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
82aeb094b520d8ea49b74129927578f18f758c873eJason Sams
83afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_bindProgramRaster(RsProgramRaster pv) {
84605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(pv);
85aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
86aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramRaster(rsc, pv);
87aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
88aeb094b520d8ea49b74129927578f18f758c873eJason Sams
89aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
90aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP
91aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
92aeb094b520d8ea49b74129927578f18f758c873eJason Sams
93afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_vpLoadProjectionMatrix(const rsc_Matrix *m) {
94a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller    GET_TLS();
9560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
96a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller}
97a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller
98afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_vpLoadModelMatrix(const rsc_Matrix *m) {
99aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
10060709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
101aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
102aeb094b520d8ea49b74129927578f18f758c873eJason Sams
103afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_vpLoadTextureMatrix(const rsc_Matrix *m) {
104aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
10560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setTextureMatrix(rsc, m);
106aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
107aeb094b520d8ea49b74129927578f18f758c873eJason Sams
108afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, float a) {
109383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    GET_TLS();
110605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vpf);
1116445e5210c6d7f8689e94be9026153d017c9545bJason Sams    ProgramFragment *pf = static_cast<ProgramFragment *>(vpf);
112383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
1136445e5210c6d7f8689e94be9026153d017c9545bJason Sams}
1146445e5210c6d7f8689e94be9026153d017c9545bJason Sams
115afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_vpGetProjectionMatrix(rsc_Matrix *m) {
11695333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk    GET_TLS();
11760709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
11895333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk}
11995333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
120aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
121aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing
122aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
123aeb094b520d8ea49b74129927578f18f758c873eJason Sams
124aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuadTexCoords(float x1, float y1, float z1,
125aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u1, float v1,
126aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x2, float y2, float z2,
127aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u2, float v2,
128aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x3, float y3, float z3,
129aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u3, float v3,
130aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x4, float y4, float z4,
131afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                 float u4, float v4) {
132aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
133aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
134aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
135aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
136aeb094b520d8ea49b74129927578f18f758c873eJason Sams
137aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("Quad");
138aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
139aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
140aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
141aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
142aeb094b520d8ea49b74129927578f18f758c873eJason Sams
143aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
144aeb094b520d8ea49b74129927578f18f758c873eJason Sams    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
145aeb094b520d8ea49b74129927578f18f758c873eJason Sams
14654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    VertexArray::Attrib attribs[2];
14754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
14854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
14954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
15054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    VertexArray va(attribs, 2);
15179f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
152aeb094b520d8ea49b74129927578f18f758c873eJason Sams
153aeb094b520d8ea49b74129927578f18f758c873eJason Sams    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
154aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
155aeb094b520d8ea49b74129927578f18f758c873eJason Sams
156aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuad(float x1, float y1, float z1,
157aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x2, float y2, float z2,
158aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x3, float y3, float z3,
159afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float x4, float y4, float z4) {
160aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuadTexCoords(x1, y1, z1, 0, 1,
161aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x2, y2, z2, 1, 1,
162aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x3, y3, z3, 1, 0,
163aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x4, y4, z4, 0, 0);
164aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
165aeb094b520d8ea49b74129927578f18f758c873eJason Sams
166afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h) {
167aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
16860709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
16960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
170aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
171aeb094b520d8ea49b74129927578f18f758c873eJason Sams
172aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //GLint crop[4] = {0, h, w, -h};
173aeb094b520d8ea49b74129927578f18f758c873eJason Sams
174aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float sh = rsc->getHeight();
175aeb094b520d8ea49b74129927578f18f758c873eJason Sams
176aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x,   sh - y,     z,
177aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - y,     z,
178aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - (y+h), z,
179aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x,   sh - (y+h), z);
18060709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->setProgramVertex((ProgramVertex *)tmp.get());
181aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
182bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams/*
183aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSprite(float x, float y, float z, float w, float h)
184aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
185aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
186aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vin[3] = {x, y, z};
187aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vout[4];
188aeb094b520d8ea49b74129927578f18f758c873eJason Sams
189aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  in %f %f %f", x, y, z);
190aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->getVertex()->transformToScreen(rsc, vout, vin);
191aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]);
192aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] /= vout[3];
193aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] /= vout[3];
194aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[2] /= vout[3];
195aeb094b520d8ea49b74129927578f18f758c873eJason Sams
196aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] *= rsc->getWidth() / 2;
197aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] *= rsc->getHeight() / 2;
198aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] += rsc->getWidth() / 2;
199aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] += rsc->getHeight() / 2;
200aeb094b520d8ea49b74129927578f18f758c873eJason Sams
201aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] -= w/2;
202aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] -= h/2;
203aeb094b520d8ea49b74129927578f18f758c873eJason Sams
204aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out2 %f %f %f", vout[0], vout[1], vout[2]);
205aeb094b520d8ea49b74129927578f18f758c873eJason Sams
206aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // U, V, W, H
207aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w);
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
209aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
210bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams*/
211aeb094b520d8ea49b74129927578f18f758c873eJason Sams
212aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawRect(float x1, float y1,
213afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float x2, float y2, float z) {
214aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
215aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x1, y2, z,
216aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y2, z,
217aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y1, z,
218aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x1, y1, z);
219aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
220aeb094b520d8ea49b74129927578f18f758c873eJason Sams
221afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_drawMesh(RsMesh vsm) {
222605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vsm);
2234e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2244e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
225aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
226aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
227aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
228aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->render(rsc);
229aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
230aeb094b520d8ea49b74129927578f18f758c873eJason Sams
231afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_drawMeshPrimitive(RsMesh vsm, uint32_t primIndex) {
232605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vsm);
233aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
2344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
235aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
236aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
237aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
2384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, primIndex);
2394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
241afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_drawMeshPrimitiveRange(RsMesh vsm, uint32_t primIndex, uint32_t start, uint32_t len) {
242605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vsm);
2434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
2454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, primIndex, start, len);
249aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
250aeb094b520d8ea49b74129927578f18f758c873eJason Sams
251afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_meshComputeBoundingBox(RsMesh vsm,
252afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                      float *minX, float *minY, float *minZ,
253afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                      float *maxX, float *maxY, float *maxZ) {
254605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vsm);
255ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    GET_TLS();
256ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
257ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    sm->computeBBox();
258ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minX = sm->mBBoxMin[0];
259ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minY = sm->mBBoxMin[1];
260ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minZ = sm->mBBoxMin[2];
261ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxX = sm->mBBoxMax[0];
262ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxY = sm->mBBoxMax[1];
263ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxZ = sm->mBBoxMax[2];
264ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk}
265ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk
266aeb094b520d8ea49b74129927578f18f758c873eJason Sams
267aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
268aeb094b520d8ea49b74129927578f18f758c873eJason Sams//
269aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
270aeb094b520d8ea49b74129927578f18f758c873eJason Sams
271aeb094b520d8ea49b74129927578f18f758c873eJason Sams
272afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_color(float r, float g, float b, float a) {
273aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
27460709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    ProgramFragment *pf = (ProgramFragment *)rsc->getProgramFragment();
275383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
276aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
277aeb094b520d8ea49b74129927578f18f758c873eJason Sams
278afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel) {
279605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(va);
280aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
281aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
282aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
283afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
284afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_uploadToTexture(RsAllocation va) {
285605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(va);
28622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    GET_TLS();
28722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    rsi_AllocationUploadToTexture(rsc, va, false, 0);
28822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
289aeb094b520d8ea49b74129927578f18f758c873eJason Sams
290afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_uploadToBufferObject(RsAllocation va) {
291605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(va);
292aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
293aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToBufferObject(rsc, va);
294aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
295aeb094b520d8ea49b74129927578f18f758c873eJason Sams
296afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_ClearColor(float r, float g, float b, float a) {
297aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
298889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
299aeb094b520d8ea49b74129927578f18f758c873eJason Sams
30022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearColor(r, g, b, a);
30122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_COLOR_BUFFER_BIT);
302aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
303aeb094b520d8ea49b74129927578f18f758c873eJason Sams
304afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_ClearDepth(float v) {
305aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
306889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
30722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
30822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearDepthf(v);
30922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_DEPTH_BUFFER_BIT);
310aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
311aeb094b520d8ea49b74129927578f18f758c873eJason Sams
312afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_getWidth() {
313aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
314aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
315aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
316aeb094b520d8ea49b74129927578f18f758c873eJason Sams
317afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_getHeight() {
318aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
319aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
320aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
321aeb094b520d8ea49b74129927578f18f758c873eJason Sams
322afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_DrawTextAlloc(RsAllocation va, int x, int y) {
323605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(va);
324d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
325d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Allocation *alloc = static_cast<Allocation *>(va);
32609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    const char *text = (const char *)alloc->getPtr();
32709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t allocSize = alloc->getType()->getSizeBytes();
32809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, allocSize, x, y);
329d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
330d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
331afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_DrawText(const char *text, int x, int y) {
332d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
33309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
33409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, textLen, x, y);
33509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
33609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
33709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchoukstatic void SC_setMetrics(Font::Rect *metrics,
33809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                          int32_t *left, int32_t *right,
339afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                          int32_t *top, int32_t *bottom) {
340afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (left) {
34109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *left = metrics->left;
34209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
343afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (right) {
34409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *right = metrics->right;
34509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
346afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (top) {
34709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *top = metrics->top;
34809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
349afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (bottom) {
35009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *bottom = metrics->bottom;
35109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
35209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
35309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
35409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchoukstatic void SC_MeasureTextAlloc(RsAllocation va,
35509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                                int32_t *left, int32_t *right,
356afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                int32_t *top, int32_t *bottom) {
35709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    CHECK_OBJ(va);
35809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    GET_TLS();
35909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Allocation *alloc = static_cast<Allocation *>(va);
36009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    const char *text = (const char *)alloc->getPtr();
36109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = alloc->getType()->getSizeBytes();
36209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
36309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
36409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    SC_setMetrics(&metrics, left, right, top, bottom);
36509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
36609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
36709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchoukstatic void SC_MeasureText(const char *text,
36809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                           int32_t *left, int32_t *right,
369afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                           int32_t *top, int32_t *bottom) {
37009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    GET_TLS();
37109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
37209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
37309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
37409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    SC_setMetrics(&metrics, left, right, top, bottom);
375d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
376d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
377afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_BindFont(RsFont font) {
378605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(font);
379d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
380d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
381d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
382aeb094b520d8ea49b74129927578f18f758c873eJason Sams
383afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_FontColor(float r, float g, float b, float a) {
3849fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    GET_TLS();
3859fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    rsc->mStateFont.setFontColor(r, g, b, a);
3869fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk}
3879fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
388aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
389aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Class implementation
390aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
391aeb094b520d8ea49b74129927578f18f758c873eJason Sams
392aeb094b520d8ea49b74129927578f18f758c873eJason Sams// llvm name mangling ref
393aeb094b520d8ea49b74129927578f18f758c873eJason Sams//  <builtin-type> ::= v  # void
394aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= b  # bool
395aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= c  # char
396aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= a  # signed char
397aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= h  # unsigned char
398aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= s  # short
399aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= t  # unsigned short
400aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= i  # int
401aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= j  # unsigned int
402aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= l  # long
403aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= m  # unsigned long
404aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= x  # long long, __int64
405aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= y  # unsigned long long, __int64
406aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= f  # float
407aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= d  # double
408aeb094b520d8ea49b74129927578f18f758c873eJason Sams
409aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic ScriptCState::SymbolTable_t gSyms[] = {
4106bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_bindProgramFragment, false },
4116bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_bindProgramStore, false },
4126bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_bindProgramVertex, false },
4136bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_bindProgramRaster, false },
4146bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_bindSampler, false },
4156bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_bindTexture, false },
41622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4176bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadProjectionMatrix, false },
4186bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadModelMatrix, false },
4196bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadTextureMatrix, false },
42022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4216bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_vpGetProjectionMatrix, false },
42295333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
4236bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_pfConstantColor, false },
4246445e5210c6d7f8689e94be9026153d017c9545bJason Sams
4256bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgGetWidthv", (void *)&SC_getWidth, false },
4266bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z12rsgGetHeightv", (void *)&SC_getHeight, false },
42722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4286bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z18rsgUploadToTexture13rs_allocationj", (void *)&SC_uploadToTexture2, false },
4296bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture, false },
4306bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z23rsgUploadToBufferObject13rs_allocation", (void *)&SC_uploadToBufferObject, false },
43122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4326bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawRectfffff", (void *)&SC_drawRect, false },
4336bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_drawQuad, false },
4346bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_drawQuadTexCoords, false },
4356bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_drawSpriteScreenspace, false },
43622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4376bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_drawMesh, false },
4386bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_drawMeshPrimitive, false },
4396bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_drawMeshPrimitiveRange, false },
4406bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_meshComputeBoundingBox, false },
4414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
4426bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false },
4436bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false },
44422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4456bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText, false },
4466bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc, false },
4476bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgMeasureTextPKcPiS1_S1_S1_", (void *)&SC_MeasureText, false },
4486bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgMeasureText13rs_allocationPiS0_S0_S0_", (void *)&SC_MeasureTextAlloc, false },
449d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
4506bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont, false },
4516bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z12rsgFontColorffff", (void *)&SC_FontColor, false },
452d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
453aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // misc
4546bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z5colorffff", (void *)&SC_color, false },
455aeb094b520d8ea49b74129927578f18f758c873eJason Sams
4566bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { NULL, NULL, false }
457aeb094b520d8ea49b74129927578f18f758c873eJason Sams};
458aeb094b520d8ea49b74129927578f18f758c873eJason Sams
459afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukconst ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolGL(const char *sym) {
460aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ScriptCState::SymbolTable_t *syms = gSyms;
461aeb094b520d8ea49b74129927578f18f758c873eJason Sams
462aeb094b520d8ea49b74129927578f18f758c873eJason Sams    while (syms->mPtr) {
463aeb094b520d8ea49b74129927578f18f758c873eJason Sams        if (!strcmp(syms->mName, sym)) {
464aeb094b520d8ea49b74129927578f18f758c873eJason Sams            return syms;
465aeb094b520d8ea49b74129927578f18f758c873eJason Sams        }
466aeb094b520d8ea49b74129927578f18f758c873eJason Sams        syms++;
467aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
468aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return NULL;
469aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
470aeb094b520d8ea49b74129927578f18f758c873eJason Sams
471