rsScriptC_LibGL.cpp revision b7e83bda41e66c966b98935b44140692bfe0c4ca
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
278b7e83bda41e66c966b98935b44140692bfe0c4caJason Samsstatic void SC_allocationSyncAll(RsAllocation va) {
279b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    CHECK_OBJ(va);
280b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    GET_TLS();
281b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    static_cast<Allocation *>(va)->syncAll(rsc, RS_ALLOCATION_USAGE_SCRIPT);
282b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams}
283b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams
284b7e83bda41e66c966b98935b44140692bfe0c4caJason Samsstatic void SC_allocationSyncAll2(RsAllocation va, RsAllocationUsageType source) {
285b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    CHECK_OBJ(va);
286b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    GET_TLS();
287b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    static_cast<Allocation *>(va)->syncAll(rsc, source);
288b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams}
289b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams
290afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel) {
291605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(va);
292aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
293aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
294aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
295afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
296afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_uploadToTexture(RsAllocation va) {
297605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(va);
29822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    GET_TLS();
29922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    rsi_AllocationUploadToTexture(rsc, va, false, 0);
30022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
301aeb094b520d8ea49b74129927578f18f758c873eJason Sams
302afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_uploadToBufferObject(RsAllocation va) {
303605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(va);
304aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
305aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToBufferObject(rsc, va);
306aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
307aeb094b520d8ea49b74129927578f18f758c873eJason Sams
308afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_ClearColor(float r, float g, float b, float a) {
309aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
310889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
311aeb094b520d8ea49b74129927578f18f758c873eJason Sams
31222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearColor(r, g, b, a);
31322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_COLOR_BUFFER_BIT);
314aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
315aeb094b520d8ea49b74129927578f18f758c873eJason Sams
316afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_ClearDepth(float v) {
317aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
318889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
31922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
32022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearDepthf(v);
32122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_DEPTH_BUFFER_BIT);
322aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
323aeb094b520d8ea49b74129927578f18f758c873eJason Sams
324afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_getWidth() {
325aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
326aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
327aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
328aeb094b520d8ea49b74129927578f18f758c873eJason Sams
329afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_getHeight() {
330aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
331aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
332aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
333aeb094b520d8ea49b74129927578f18f758c873eJason Sams
334afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_DrawTextAlloc(RsAllocation va, int x, int y) {
335605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(va);
336d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
337d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Allocation *alloc = static_cast<Allocation *>(va);
33809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    const char *text = (const char *)alloc->getPtr();
33909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t allocSize = alloc->getType()->getSizeBytes();
34009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, allocSize, x, y);
341d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
342d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
343afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_DrawText(const char *text, int x, int y) {
344d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
34509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
34609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, textLen, x, y);
34709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
34809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
34909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchoukstatic void SC_setMetrics(Font::Rect *metrics,
35009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                          int32_t *left, int32_t *right,
351afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                          int32_t *top, int32_t *bottom) {
352afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (left) {
35309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *left = metrics->left;
35409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
355afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (right) {
35609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *right = metrics->right;
35709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
358afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (top) {
35909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *top = metrics->top;
36009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
361afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (bottom) {
36209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *bottom = metrics->bottom;
36309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
36409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
36509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
36609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchoukstatic void SC_MeasureTextAlloc(RsAllocation va,
36709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                                int32_t *left, int32_t *right,
368afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                int32_t *top, int32_t *bottom) {
36909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    CHECK_OBJ(va);
37009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    GET_TLS();
37109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Allocation *alloc = static_cast<Allocation *>(va);
37209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    const char *text = (const char *)alloc->getPtr();
37309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = alloc->getType()->getSizeBytes();
37409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
37509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
37609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    SC_setMetrics(&metrics, left, right, top, bottom);
37709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
37809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
37909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchoukstatic void SC_MeasureText(const char *text,
38009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                           int32_t *left, int32_t *right,
381afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                           int32_t *top, int32_t *bottom) {
38209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    GET_TLS();
38309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
38409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
38509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
38609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    SC_setMetrics(&metrics, left, right, top, bottom);
387d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
388d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
389afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_BindFont(RsFont font) {
390605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(font);
391d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
392d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
393d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
394aeb094b520d8ea49b74129927578f18f758c873eJason Sams
395afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_FontColor(float r, float g, float b, float a) {
3969fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    GET_TLS();
3979fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    rsc->mStateFont.setFontColor(r, g, b, a);
3989fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk}
3999fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
400aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
401aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Class implementation
402aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
403aeb094b520d8ea49b74129927578f18f758c873eJason Sams
404aeb094b520d8ea49b74129927578f18f758c873eJason Sams// llvm name mangling ref
405aeb094b520d8ea49b74129927578f18f758c873eJason Sams//  <builtin-type> ::= v  # void
406aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= b  # bool
407aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= c  # char
408aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= a  # signed char
409aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= h  # unsigned char
410aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= s  # short
411aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= t  # unsigned short
412aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= i  # int
413aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= j  # unsigned int
414aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= l  # long
415aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= m  # unsigned long
416aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= x  # long long, __int64
417aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= y  # unsigned long long, __int64
418aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= f  # float
419aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= d  # double
420aeb094b520d8ea49b74129927578f18f758c873eJason Sams
421aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic ScriptCState::SymbolTable_t gSyms[] = {
4226bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_bindProgramFragment, false },
4236bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_bindProgramStore, false },
4246bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_bindProgramVertex, false },
4256bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_bindProgramRaster, false },
4266bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_bindSampler, false },
4276bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_bindTexture, false },
42822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4296bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadProjectionMatrix, false },
4306bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadModelMatrix, false },
4316bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadTextureMatrix, false },
43222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4336bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_vpGetProjectionMatrix, false },
43495333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
4356bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_pfConstantColor, false },
4366445e5210c6d7f8689e94be9026153d017c9545bJason Sams
4376bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgGetWidthv", (void *)&SC_getWidth, false },
4386bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z12rsgGetHeightv", (void *)&SC_getHeight, false },
43922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
440b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    { "_Z20rsgAllocationSyncAll13rs_allocation", (void *)&SC_allocationSyncAll, false },
441b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams
4426bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z18rsgUploadToTexture13rs_allocationj", (void *)&SC_uploadToTexture2, false },
4436bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture, false },
4446bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z23rsgUploadToBufferObject13rs_allocation", (void *)&SC_uploadToBufferObject, false },
44522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4466bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawRectfffff", (void *)&SC_drawRect, false },
4476bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_drawQuad, false },
4486bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_drawQuadTexCoords, false },
4496bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_drawSpriteScreenspace, false },
45022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4516bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_drawMesh, false },
4526bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_drawMeshPrimitive, false },
4536bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_drawMeshPrimitiveRange, false },
4546bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_meshComputeBoundingBox, false },
4554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
4566bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false },
4576bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false },
45822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4596bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText, false },
4606bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc, false },
4616bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgMeasureTextPKcPiS1_S1_S1_", (void *)&SC_MeasureText, false },
4626bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgMeasureText13rs_allocationPiS0_S0_S0_", (void *)&SC_MeasureTextAlloc, false },
463d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
4646bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont, false },
4656bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z12rsgFontColorffff", (void *)&SC_FontColor, false },
466d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
467aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // misc
4686bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z5colorffff", (void *)&SC_color, false },
469aeb094b520d8ea49b74129927578f18f758c873eJason Sams
4706bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { NULL, NULL, false }
471aeb094b520d8ea49b74129927578f18f758c873eJason Sams};
472aeb094b520d8ea49b74129927578f18f758c873eJason Sams
473afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukconst ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolGL(const char *sym) {
474aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ScriptCState::SymbolTable_t *syms = gSyms;
475aeb094b520d8ea49b74129927578f18f758c873eJason Sams
476aeb094b520d8ea49b74129927578f18f758c873eJason Sams    while (syms->mPtr) {
477aeb094b520d8ea49b74129927578f18f758c873eJason Sams        if (!strcmp(syms->mName, sym)) {
478aeb094b520d8ea49b74129927578f18f758c873eJason Sams            return syms;
479aeb094b520d8ea49b74129927578f18f758c873eJason Sams        }
480aeb094b520d8ea49b74129927578f18f758c873eJason Sams        syms++;
481aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
482aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return NULL;
483aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
484aeb094b520d8ea49b74129927578f18f758c873eJason Sams
485