rsScriptC_LibGL.cpp revision 7d9c5ffccb7a5e682860f752403e5a03aed587be
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
35cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams#define GET_TLS()  ScriptTLSStruct * tls = \
36cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    (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
897d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukstatic void SC_bindFrameBufferObjectColorTarget(RsAllocation va, uint32_t slot) {
907d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    CHECK_OBJ(va);
917d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    GET_TLS();
927d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.bindColorTarget(rsc, static_cast<Allocation *>(va), slot);
937d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
947d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
957d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukstatic void SC_bindFrameBufferObjectDepthTarget(RsAllocation va) {
967d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    CHECK_OBJ(va);
977d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    GET_TLS();
987d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.bindDepthTarget(rsc, static_cast<Allocation *>(va));
997d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1007d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
1017d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukstatic void SC_clearFrameBufferObjectColorTarget(uint32_t slot) {
1027d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    GET_TLS();
1037d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
1047d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1057d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
1067d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukstatic void SC_clearFrameBufferObjectDepthTarget() {
1077d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    GET_TLS();
1087d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.bindDepthTarget(rsc, NULL);
1097d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1107d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
1117d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukstatic void SC_clearFrameBufferObjectTargets() {
1127d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    GET_TLS();
1137d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.resetAll(rsc);
1147d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1157d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
116aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
117aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP
118aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
119aeb094b520d8ea49b74129927578f18f758c873eJason Sams
120afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_vpLoadProjectionMatrix(const rsc_Matrix *m) {
121a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller    GET_TLS();
12260709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
123a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller}
124a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller
125afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_vpLoadModelMatrix(const rsc_Matrix *m) {
126aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
12760709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
128aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
129aeb094b520d8ea49b74129927578f18f758c873eJason Sams
130afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_vpLoadTextureMatrix(const rsc_Matrix *m) {
131aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
13260709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setTextureMatrix(rsc, m);
133aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
134aeb094b520d8ea49b74129927578f18f758c873eJason Sams
135afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, float a) {
136383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    GET_TLS();
137605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vpf);
1386445e5210c6d7f8689e94be9026153d017c9545bJason Sams    ProgramFragment *pf = static_cast<ProgramFragment *>(vpf);
139383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
1406445e5210c6d7f8689e94be9026153d017c9545bJason Sams}
1416445e5210c6d7f8689e94be9026153d017c9545bJason Sams
142afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_vpGetProjectionMatrix(rsc_Matrix *m) {
14395333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk    GET_TLS();
14460709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
14595333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk}
14695333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
147aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
148aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing
149aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
150aeb094b520d8ea49b74129927578f18f758c873eJason Sams
151aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuadTexCoords(float x1, float y1, float z1,
152aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u1, float v1,
153aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x2, float y2, float z2,
154aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u2, float v2,
155aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x3, float y3, float z3,
156aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u3, float v3,
157aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x4, float y4, float z4,
158afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                 float u4, float v4) {
159aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
160aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
161aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
162aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
163aeb094b520d8ea49b74129927578f18f758c873eJason Sams
164aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("Quad");
165aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
166aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
167aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
168aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
169aeb094b520d8ea49b74129927578f18f758c873eJason Sams
170aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
171aeb094b520d8ea49b74129927578f18f758c873eJason Sams    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
172aeb094b520d8ea49b74129927578f18f758c873eJason Sams
17354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    VertexArray::Attrib attribs[2];
17454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
17554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
17754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    VertexArray va(attribs, 2);
17879f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
179aeb094b520d8ea49b74129927578f18f758c873eJason Sams
180aeb094b520d8ea49b74129927578f18f758c873eJason Sams    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
181aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
182aeb094b520d8ea49b74129927578f18f758c873eJason Sams
183aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuad(float x1, float y1, float z1,
184aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x2, float y2, float z2,
185aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x3, float y3, float z3,
186afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float x4, float y4, float z4) {
187aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuadTexCoords(x1, y1, z1, 0, 1,
188aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x2, y2, z2, 1, 1,
189aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x3, y3, z3, 1, 0,
190aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x4, y4, z4, 0, 0);
191aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
192aeb094b520d8ea49b74129927578f18f758c873eJason Sams
193afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h) {
194aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
19560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
19660709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
197aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
198aeb094b520d8ea49b74129927578f18f758c873eJason Sams
199aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //GLint crop[4] = {0, h, w, -h};
200aeb094b520d8ea49b74129927578f18f758c873eJason Sams
201aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float sh = rsc->getHeight();
202aeb094b520d8ea49b74129927578f18f758c873eJason Sams
203aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x,   sh - y,     z,
204aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - y,     z,
205aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - (y+h), z,
206aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x,   sh - (y+h), z);
20760709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->setProgramVertex((ProgramVertex *)tmp.get());
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
209bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams/*
210aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSprite(float x, float y, float z, float w, float h)
211aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
212aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
213aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vin[3] = {x, y, z};
214aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vout[4];
215aeb094b520d8ea49b74129927578f18f758c873eJason Sams
216aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  in %f %f %f", x, y, z);
217aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->getVertex()->transformToScreen(rsc, vout, vin);
218aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]);
219aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] /= vout[3];
220aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] /= vout[3];
221aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[2] /= vout[3];
222aeb094b520d8ea49b74129927578f18f758c873eJason Sams
223aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] *= rsc->getWidth() / 2;
224aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] *= rsc->getHeight() / 2;
225aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] += rsc->getWidth() / 2;
226aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] += rsc->getHeight() / 2;
227aeb094b520d8ea49b74129927578f18f758c873eJason Sams
228aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] -= w/2;
229aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] -= h/2;
230aeb094b520d8ea49b74129927578f18f758c873eJason Sams
231aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out2 %f %f %f", vout[0], vout[1], vout[2]);
232aeb094b520d8ea49b74129927578f18f758c873eJason Sams
233aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // U, V, W, H
234aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w);
235aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
236aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
237bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams*/
238aeb094b520d8ea49b74129927578f18f758c873eJason Sams
239aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawRect(float x1, float y1,
240afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                        float x2, float y2, float z) {
241aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
242aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x1, y2, z,
243aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y2, z,
244aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y1, z,
245aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x1, y1, z);
246aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
247aeb094b520d8ea49b74129927578f18f758c873eJason Sams
248afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_drawMesh(RsMesh vsm) {
249605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vsm);
2504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
252aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
253aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
254aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
255aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->render(rsc);
256aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
257aeb094b520d8ea49b74129927578f18f758c873eJason Sams
258afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_drawMeshPrimitive(RsMesh vsm, uint32_t primIndex) {
259605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vsm);
260aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
2614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
262aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
263aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
264aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
2654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, primIndex);
2664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
268afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_drawMeshPrimitiveRange(RsMesh vsm, uint32_t primIndex, uint32_t start, uint32_t len) {
269605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vsm);
2704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
2724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, primIndex, start, len);
276aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
277aeb094b520d8ea49b74129927578f18f758c873eJason Sams
278afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_meshComputeBoundingBox(RsMesh vsm,
279afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                      float *minX, float *minY, float *minZ,
280afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                      float *maxX, float *maxY, float *maxZ) {
281605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vsm);
282ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    GET_TLS();
283ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
284ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    sm->computeBBox();
285ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minX = sm->mBBoxMin[0];
286ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minY = sm->mBBoxMin[1];
287ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minZ = sm->mBBoxMin[2];
288ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxX = sm->mBBoxMax[0];
289ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxY = sm->mBBoxMax[1];
290ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxZ = sm->mBBoxMax[2];
291ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk}
292ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk
293aeb094b520d8ea49b74129927578f18f758c873eJason Sams
294aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
295aeb094b520d8ea49b74129927578f18f758c873eJason Sams//
296aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
297aeb094b520d8ea49b74129927578f18f758c873eJason Sams
298aeb094b520d8ea49b74129927578f18f758c873eJason Sams
299afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_color(float r, float g, float b, float a) {
300aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
30160709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    ProgramFragment *pf = (ProgramFragment *)rsc->getProgramFragment();
302383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
303aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
304aeb094b520d8ea49b74129927578f18f758c873eJason Sams
3057d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukstatic void SC_finish() {
3067d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    glFinish();
3077d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
3087d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
309b7e83bda41e66c966b98935b44140692bfe0c4caJason Samsstatic void SC_allocationSyncAll(RsAllocation va) {
310b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    CHECK_OBJ(va);
311b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    GET_TLS();
312b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    static_cast<Allocation *>(va)->syncAll(rsc, RS_ALLOCATION_USAGE_SCRIPT);
313b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams}
314b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams
3156a121811e5d2e56e94747b36d15c7613ab2aedd4Stephen Hines#if 0
316b7e83bda41e66c966b98935b44140692bfe0c4caJason Samsstatic void SC_allocationSyncAll2(RsAllocation va, RsAllocationUsageType source) {
317b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    CHECK_OBJ(va);
318b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    GET_TLS();
319b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    static_cast<Allocation *>(va)->syncAll(rsc, source);
320b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams}
3216a121811e5d2e56e94747b36d15c7613ab2aedd4Stephen Hines#endif
322b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams
323afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_ClearColor(float r, float g, float b, float a) {
324aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
3257d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.setupGL2(rsc);
326889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
327aeb094b520d8ea49b74129927578f18f758c873eJason Sams
32822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearColor(r, g, b, a);
32922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_COLOR_BUFFER_BIT);
330aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
331aeb094b520d8ea49b74129927578f18f758c873eJason Sams
332afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_ClearDepth(float v) {
333aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
3347d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.setupGL2(rsc);
335889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
33622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
33722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearDepthf(v);
33822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_DEPTH_BUFFER_BIT);
339aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
340aeb094b520d8ea49b74129927578f18f758c873eJason Sams
341afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_getWidth() {
342aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
343aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
344aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
345aeb094b520d8ea49b74129927578f18f758c873eJason Sams
346afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_getHeight() {
347aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
348aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
349aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
350aeb094b520d8ea49b74129927578f18f758c873eJason Sams
351afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_DrawTextAlloc(RsAllocation va, int x, int y) {
352605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(va);
353d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
354d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Allocation *alloc = static_cast<Allocation *>(va);
35509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    const char *text = (const char *)alloc->getPtr();
35609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t allocSize = alloc->getType()->getSizeBytes();
35709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, allocSize, x, y);
358d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
359d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
360afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_DrawText(const char *text, int x, int y) {
361d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
36209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
36309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, textLen, x, y);
36409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
36509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
36609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchoukstatic void SC_setMetrics(Font::Rect *metrics,
36709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                          int32_t *left, int32_t *right,
368afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                          int32_t *top, int32_t *bottom) {
369afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (left) {
37009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *left = metrics->left;
37109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
372afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (right) {
37309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *right = metrics->right;
37409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
375afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (top) {
37609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *top = metrics->top;
37709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
378afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (bottom) {
37909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *bottom = metrics->bottom;
38009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
38109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
38209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
38309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchoukstatic void SC_MeasureTextAlloc(RsAllocation va,
38409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                                int32_t *left, int32_t *right,
385afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                int32_t *top, int32_t *bottom) {
38609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    CHECK_OBJ(va);
38709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    GET_TLS();
38809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Allocation *alloc = static_cast<Allocation *>(va);
38909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    const char *text = (const char *)alloc->getPtr();
39009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = alloc->getType()->getSizeBytes();
39109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
39209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
39309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    SC_setMetrics(&metrics, left, right, top, bottom);
39409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
39509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
39609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchoukstatic void SC_MeasureText(const char *text,
39709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk                           int32_t *left, int32_t *right,
398afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                           int32_t *top, int32_t *bottom) {
39909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    GET_TLS();
40009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
40109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
40209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
40309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    SC_setMetrics(&metrics, left, right, top, bottom);
404d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
405d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
406afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_BindFont(RsFont font) {
407605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(font);
408d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
409d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
410d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
411aeb094b520d8ea49b74129927578f18f758c873eJason Sams
412afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void SC_FontColor(float r, float g, float b, float a) {
4139fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    GET_TLS();
4149fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    rsc->mStateFont.setFontColor(r, g, b, a);
4159fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk}
4169fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
417aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
418aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Class implementation
419aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
420aeb094b520d8ea49b74129927578f18f758c873eJason Sams
421aeb094b520d8ea49b74129927578f18f758c873eJason Sams// llvm name mangling ref
422aeb094b520d8ea49b74129927578f18f758c873eJason Sams//  <builtin-type> ::= v  # void
423aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= b  # bool
424aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= c  # char
425aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= a  # signed char
426aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= h  # unsigned char
427aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= s  # short
428aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= t  # unsigned short
429aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= i  # int
430aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= j  # unsigned int
431aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= l  # long
432aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= m  # unsigned long
433aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= x  # long long, __int64
434aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= y  # unsigned long long, __int64
435aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= f  # float
436aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= d  # double
437aeb094b520d8ea49b74129927578f18f758c873eJason Sams
438aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic ScriptCState::SymbolTable_t gSyms[] = {
4396bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_bindProgramFragment, false },
4406bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_bindProgramStore, false },
4416bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_bindProgramVertex, false },
4426bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_bindProgramRaster, false },
4436bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_bindSampler, false },
4446bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_bindTexture, false },
44522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4466bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadProjectionMatrix, false },
4476bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadModelMatrix, false },
4486bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadTextureMatrix, false },
44922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4506bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_vpGetProjectionMatrix, false },
45195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
4526bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_pfConstantColor, false },
4536445e5210c6d7f8689e94be9026153d017c9545bJason Sams
4546bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgGetWidthv", (void *)&SC_getWidth, false },
4556bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z12rsgGetHeightv", (void *)&SC_getHeight, false },
45622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
457b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    { "_Z20rsgAllocationSyncAll13rs_allocation", (void *)&SC_allocationSyncAll, false },
458b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams
4596bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawRectfffff", (void *)&SC_drawRect, false },
4606bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_drawQuad, false },
4616bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_drawQuadTexCoords, false },
4626bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_drawSpriteScreenspace, false },
46322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4646bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_drawMesh, false },
4656bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_drawMeshPrimitive, false },
4666bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_drawMeshPrimitiveRange, false },
4676bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_meshComputeBoundingBox, false },
4684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
4696bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false },
4706bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false },
47122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4726bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText, false },
4736bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc, false },
4746bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgMeasureTextPKcPiS1_S1_S1_", (void *)&SC_MeasureText, false },
4756bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsgMeasureText13rs_allocationPiS0_S0_S0_", (void *)&SC_MeasureTextAlloc, false },
476d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
4776bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont, false },
4786bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z12rsgFontColorffff", (void *)&SC_FontColor, false },
479d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
4807d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    { "_Z18rsgBindColorTarget13rs_allocationj", (void *)&SC_bindFrameBufferObjectColorTarget, false },
4817d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    { "_Z18rsgBindDepthTarget13rs_allocation", (void *)&SC_bindFrameBufferObjectDepthTarget, false },
4827d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    { "_Z19rsgClearColorTargetj", (void *)&SC_clearFrameBufferObjectColorTarget, false },
4837d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    { "_Z19rsgClearDepthTargetv", (void *)&SC_clearFrameBufferObjectDepthTarget, false },
4847d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    { "_Z24rsgClearAllRenderTargetsv", (void *)&SC_clearFrameBufferObjectTargets, false },
4857d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
486aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // misc
4876bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z5colorffff", (void *)&SC_color, false },
4887d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    { "_Z9rsgFinishv", (void *)&SC_finish, false },
489aeb094b520d8ea49b74129927578f18f758c873eJason Sams
4906bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { NULL, NULL, false }
491aeb094b520d8ea49b74129927578f18f758c873eJason Sams};
492aeb094b520d8ea49b74129927578f18f758c873eJason Sams
493afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukconst ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolGL(const char *sym) {
494aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ScriptCState::SymbolTable_t *syms = gSyms;
495aeb094b520d8ea49b74129927578f18f758c873eJason Sams
496aeb094b520d8ea49b74129927578f18f758c873eJason Sams    while (syms->mPtr) {
497aeb094b520d8ea49b74129927578f18f758c873eJason Sams        if (!strcmp(syms->mName, sym)) {
498aeb094b520d8ea49b74129927578f18f758c873eJason Sams            return syms;
499aeb094b520d8ea49b74129927578f18f758c873eJason Sams        }
500aeb094b520d8ea49b74129927578f18f758c873eJason Sams        syms++;
501aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
502aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return NULL;
503aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
504aeb094b520d8ea49b74129927578f18f758c873eJason Sams
505