rsScriptC_LibGL.cpp revision 383e5b1f68c321a77bfd7466fa1171a9bfab4a6f
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
45aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
46aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
47aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
48aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ProgramBindTexture(rsc,
49aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<ProgramFragment *>(vpf),
50aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           slot,
51aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<Allocation *>(va));
52aeb094b520d8ea49b74129927578f18f758c873eJason Sams
53aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
54aeb094b520d8ea49b74129927578f18f758c873eJason Sams
55aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
56aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
57aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
58aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ProgramBindSampler(rsc,
59aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<ProgramFragment *>(vpf),
60aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           slot,
61aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<Sampler *>(vs));
62aeb094b520d8ea49b74129927578f18f758c873eJason Sams
63aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
64aeb094b520d8ea49b74129927578f18f758c873eJason Sams
65aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramStore(RsProgramStore pfs)
66aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
67aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
68aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramStore(rsc, pfs);
69aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
70aeb094b520d8ea49b74129927578f18f758c873eJason Sams
71aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramFragment(RsProgramFragment pf)
72aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
73aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
74aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramFragment(rsc, pf);
75aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
76aeb094b520d8ea49b74129927578f18f758c873eJason Sams
77aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramVertex(RsProgramVertex pv)
78aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
79aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
80aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramVertex(rsc, pv);
81aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
82aeb094b520d8ea49b74129927578f18f758c873eJason Sams
83aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramRaster(RsProgramRaster pv)
84aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
85aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
86aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramRaster(rsc, pv);
87aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
88aeb094b520d8ea49b74129927578f18f758c873eJason Sams
89aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
90aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP
91aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
92aeb094b520d8ea49b74129927578f18f758c873eJason Sams
93a490f1003a76286e0f00606adff4ef85fdd78b02Jim Millerstatic void SC_vpLoadProjectionMatrix(const rsc_Matrix *m)
94a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller{
95a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller    GET_TLS();
96383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    rsc->getVertex()->setProjectionMatrix(rsc, m);
97a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller}
98a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller
99aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_vpLoadModelMatrix(const rsc_Matrix *m)
100aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
101aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
102383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    rsc->getVertex()->setModelviewMatrix(rsc, m);
103aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
104aeb094b520d8ea49b74129927578f18f758c873eJason Sams
105aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_vpLoadTextureMatrix(const rsc_Matrix *m)
106aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
107aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
108383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    rsc->getVertex()->setTextureMatrix(rsc, m);
109aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
110aeb094b520d8ea49b74129927578f18f758c873eJason Sams
111aeb094b520d8ea49b74129927578f18f758c873eJason Sams
1126445e5210c6d7f8689e94be9026153d017c9545bJason Samsstatic void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, float a)
1136445e5210c6d7f8689e94be9026153d017c9545bJason Sams{
114383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    GET_TLS();
1156445e5210c6d7f8689e94be9026153d017c9545bJason Sams    ProgramFragment *pf = static_cast<ProgramFragment *>(vpf);
116383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
1176445e5210c6d7f8689e94be9026153d017c9545bJason Sams}
1186445e5210c6d7f8689e94be9026153d017c9545bJason Sams
11995333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchoukstatic void SC_vpGetProjectionMatrix(rsc_Matrix *m)
12095333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk{
12195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk    GET_TLS();
122383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    rsc->getVertex()->getProjectionMatrix(rsc, m);
12395333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk}
12495333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
125aeb094b520d8ea49b74129927578f18f758c873eJason Sams
126aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
127aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing
128aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
129aeb094b520d8ea49b74129927578f18f758c873eJason Sams
130aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuadTexCoords(float x1, float y1, float z1,
131aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u1, float v1,
132aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x2, float y2, float z2,
133aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u2, float v2,
134aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x3, float y3, float z3,
135aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u3, float v3,
136aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x4, float y4, float z4,
137aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u4, float v4)
138aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
139aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
140aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
141aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
142aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
143aeb094b520d8ea49b74129927578f18f758c873eJason Sams
144aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("Quad");
145aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
146aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
147aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
148aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
149aeb094b520d8ea49b74129927578f18f758c873eJason Sams
150aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
151aeb094b520d8ea49b74129927578f18f758c873eJason Sams    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
152aeb094b520d8ea49b74129927578f18f758c873eJason Sams
153aeb094b520d8ea49b74129927578f18f758c873eJason Sams    VertexArray va;
15479f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.add(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "position");
15579f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.add(GL_FLOAT, 2, 8, false, (uint32_t)tex, "texture0");
15679f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
157aeb094b520d8ea49b74129927578f18f758c873eJason Sams
158aeb094b520d8ea49b74129927578f18f758c873eJason Sams    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
159aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
160aeb094b520d8ea49b74129927578f18f758c873eJason Sams
161aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuad(float x1, float y1, float z1,
162aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x2, float y2, float z2,
163aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x3, float y3, float z3,
164aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x4, float y4, float z4)
165aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
166aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuadTexCoords(x1, y1, z1, 0, 1,
167aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x2, y2, z2, 1, 1,
168aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x3, y3, z3, 1, 0,
169aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x4, y4, z4, 0, 0);
170aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
171aeb094b520d8ea49b74129927578f18f758c873eJason Sams
172aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h)
173aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
174aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
175aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex());
176aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->setVertex(rsc->getDefaultProgramVertex());
177aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
178aeb094b520d8ea49b74129927578f18f758c873eJason Sams
179aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //GLint crop[4] = {0, h, w, -h};
180aeb094b520d8ea49b74129927578f18f758c873eJason Sams
181aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float sh = rsc->getHeight();
182aeb094b520d8ea49b74129927578f18f758c873eJason Sams
183aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x,   sh - y,     z,
184aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - y,     z,
185aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - (y+h), z,
186aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x,   sh - (y+h), z);
187aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->setVertex((ProgramVertex *)tmp.get());
188aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
189bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams/*
190aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSprite(float x, float y, float z, float w, float h)
191aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
192aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
193aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vin[3] = {x, y, z};
194aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vout[4];
195aeb094b520d8ea49b74129927578f18f758c873eJason Sams
196aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  in %f %f %f", x, y, z);
197aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->getVertex()->transformToScreen(rsc, vout, vin);
198aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]);
199aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] /= vout[3];
200aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] /= vout[3];
201aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[2] /= vout[3];
202aeb094b520d8ea49b74129927578f18f758c873eJason Sams
203aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] *= rsc->getWidth() / 2;
204aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] *= rsc->getHeight() / 2;
205aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] += rsc->getWidth() / 2;
206aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] += rsc->getHeight() / 2;
207aeb094b520d8ea49b74129927578f18f758c873eJason Sams
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] -= w/2;
209aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] -= h/2;
210aeb094b520d8ea49b74129927578f18f758c873eJason Sams
211aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out2 %f %f %f", vout[0], vout[1], vout[2]);
212aeb094b520d8ea49b74129927578f18f758c873eJason Sams
213aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // U, V, W, H
214aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w);
215aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
216aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
217bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams*/
218aeb094b520d8ea49b74129927578f18f758c873eJason Sams
219aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawRect(float x1, float y1,
220aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x2, float y2, float z)
221aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
222aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
223aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x1, y2, z,
224aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y2, z,
225aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y1, z,
226aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x1, y1, z);
227aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
228aeb094b520d8ea49b74129927578f18f758c873eJason Sams
2294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMesh(RsMesh vsm)
2304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{
2314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
233aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
234aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
235aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
236aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->render(rsc);
237aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
238aeb094b520d8ea49b74129927578f18f758c873eJason Sams
2394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitive(RsMesh vsm, uint32_t primIndex)
240aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
241aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
2424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
243aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
244aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
245aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
2464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, primIndex);
2474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
2494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitiveRange(RsMesh vsm, uint32_t primIndex, uint32_t start, uint32_t len)
2504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{
2514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
2534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, primIndex, start, len);
257aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
258aeb094b520d8ea49b74129927578f18f758c873eJason Sams
259ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukstatic void SC_meshComputeBoundingBox(RsMesh vsm, float *minX, float *minY, float *minZ,
260ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk                                                     float *maxX, float *maxY, float *maxZ)
261ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk{
262ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    GET_TLS();
263ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
264ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    sm->computeBBox();
265ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minX = sm->mBBoxMin[0];
266ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minY = sm->mBBoxMin[1];
267ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minZ = sm->mBBoxMin[2];
268ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxX = sm->mBBoxMax[0];
269ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxY = sm->mBBoxMax[1];
270ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxZ = sm->mBBoxMax[2];
271ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk}
272ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk
273aeb094b520d8ea49b74129927578f18f758c873eJason Sams
274aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
275aeb094b520d8ea49b74129927578f18f758c873eJason Sams//
276aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
277aeb094b520d8ea49b74129927578f18f758c873eJason Sams
278aeb094b520d8ea49b74129927578f18f758c873eJason Sams
279aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_color(float r, float g, float b, float a)
280aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
281aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
2826445e5210c6d7f8689e94be9026153d017c9545bJason Sams    ProgramFragment *pf = (ProgramFragment *)rsc->getFragment();
283383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
284aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
285aeb094b520d8ea49b74129927578f18f758c873eJason Sams
28622fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel)
287aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
288aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
289aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
290aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
29122fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture(RsAllocation va)
29222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{
29322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    GET_TLS();
29422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    rsi_AllocationUploadToTexture(rsc, va, false, 0);
29522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
296aeb094b520d8ea49b74129927578f18f758c873eJason Sams
297aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_uploadToBufferObject(RsAllocation va)
298aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
299aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
300aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToBufferObject(rsc, va);
301aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
302aeb094b520d8ea49b74129927578f18f758c873eJason Sams
30322fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearColor(float r, float g, float b, float a)
304aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
305aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
30622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    if (!rsc->setupCheck()) {
30722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        return;
30822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    }
309aeb094b520d8ea49b74129927578f18f758c873eJason Sams
31022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearColor(r, g, b, a);
31122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_COLOR_BUFFER_BIT);
312aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
313aeb094b520d8ea49b74129927578f18f758c873eJason Sams
31422fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearDepth(float v)
315aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
316aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
31722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    if (!rsc->setupCheck()) {
31822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        return;
31922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    }
32022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
32122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearDepthf(v);
32222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_DEPTH_BUFFER_BIT);
323aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
324aeb094b520d8ea49b74129927578f18f758c873eJason Sams
325aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getWidth()
326aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
327aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
328aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
329aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
330aeb094b520d8ea49b74129927578f18f758c873eJason Sams
331aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getHeight()
332aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
333aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
334aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
335aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
336aeb094b520d8ea49b74129927578f18f758c873eJason Sams
337d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawTextAlloc(RsAllocation va, int x, int y)
338d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
339d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
340d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Allocation *alloc = static_cast<Allocation *>(va);
341d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsc->mStateFont.renderText(alloc, x, y);
342d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
343d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
344d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawText(const char *text, int x, int y)
345d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
346d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
347d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsc->mStateFont.renderText(text, x, y);
348d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
349d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
350d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_BindFont(RsFont font)
351d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
352d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
353d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
354d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
355aeb094b520d8ea49b74129927578f18f758c873eJason Sams
3569fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchoukstatic void SC_FontColor(float r, float g, float b, float a)
3579fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk{
3589fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    GET_TLS();
3599fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    rsc->mStateFont.setFontColor(r, g, b, a);
3609fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk}
3619fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
362aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
363aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Class implementation
364aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
365aeb094b520d8ea49b74129927578f18f758c873eJason Sams
366aeb094b520d8ea49b74129927578f18f758c873eJason Sams// llvm name mangling ref
367aeb094b520d8ea49b74129927578f18f758c873eJason Sams//  <builtin-type> ::= v  # void
368aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= b  # bool
369aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= c  # char
370aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= a  # signed char
371aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= h  # unsigned char
372aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= s  # short
373aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= t  # unsigned short
374aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= i  # int
375aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= j  # unsigned int
376aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= l  # long
377aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= m  # unsigned long
378aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= x  # long long, __int64
379aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= y  # unsigned long long, __int64
380aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= f  # float
381aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= d  # double
382aeb094b520d8ea49b74129927578f18f758c873eJason Sams
383aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic ScriptCState::SymbolTable_t gSyms[] = {
3847349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_bindProgramFragment },
3857349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_bindProgramStore },
3867349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_bindProgramVertex },
3877349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_bindProgramRaster },
3887349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_bindSampler },
3897349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_bindTexture },
39022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
3917349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadProjectionMatrix },
3927349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadModelMatrix },
3937349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadTextureMatrix },
39422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
39595333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk    { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_vpGetProjectionMatrix },
39695333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
3976445e5210c6d7f8689e94be9026153d017c9545bJason Sams    { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_pfConstantColor },
3986445e5210c6d7f8689e94be9026153d017c9545bJason Sams
3997349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgGetWidthv", (void *)&SC_getWidth },
4007349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z12rsgGetHeightv", (void *)&SC_getHeight },
40122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4027349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z18rsgUploadToTexture13rs_allocationj", (void *)&SC_uploadToTexture2 },
4038c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams    { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture },
4047349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z23rsgUploadToBufferObject13rs_allocation", (void *)&SC_uploadToBufferObject },
40522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4067349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgDrawRectfffff", (void *)&SC_drawRect },
4077349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_drawQuad },
4087349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_drawQuadTexCoords },
4097349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_drawSpriteScreenspace },
41022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_drawMesh },
4127349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_drawMeshPrimitive },
4137349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_drawMeshPrimitiveRange },
414ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_meshComputeBoundingBox },
4154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
4167349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z13rsgClearColorffff", (void *)&SC_ClearColor },
4177349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth },
41822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
419d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText },
420d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc },
421d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
4227349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont },
4239fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    { "_Z12rsgFontColorffff", (void *)&SC_FontColor },
424d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
425aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // misc
4267349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z5colorffff", (void *)&SC_color },
427aeb094b520d8ea49b74129927578f18f758c873eJason Sams
428aeb094b520d8ea49b74129927578f18f758c873eJason Sams    { NULL, NULL }
429aeb094b520d8ea49b74129927578f18f758c873eJason Sams};
430aeb094b520d8ea49b74129927578f18f758c873eJason Sams
431aeb094b520d8ea49b74129927578f18f758c873eJason Samsconst ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolGL(const char *sym)
432aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
433aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ScriptCState::SymbolTable_t *syms = gSyms;
434aeb094b520d8ea49b74129927578f18f758c873eJason Sams
435aeb094b520d8ea49b74129927578f18f758c873eJason Sams    while (syms->mPtr) {
436aeb094b520d8ea49b74129927578f18f758c873eJason Sams        if (!strcmp(syms->mName, sym)) {
437aeb094b520d8ea49b74129927578f18f758c873eJason Sams            return syms;
438aeb094b520d8ea49b74129927578f18f758c873eJason Sams        }
439aeb094b520d8ea49b74129927578f18f758c873eJason Sams        syms++;
440aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
441aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return NULL;
442aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
443aeb094b520d8ea49b74129927578f18f758c873eJason Sams
444