rsScriptC_LibGL.cpp revision a490f1003a76286e0f00606adff4ef85fdd78b02
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 "acc/acc.h"
22aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "utils/Timers.h"
23aeb094b520d8ea49b74129927578f18f758c873eJason Sams
24aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GL_GLEXT_PROTOTYPES
25aeb094b520d8ea49b74129927578f18f758c873eJason Sams
26aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/gl.h>
27aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/glext.h>
28aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2.h>
29aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2ext.h>
30aeb094b520d8ea49b74129927578f18f758c873eJason Sams
31aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <time.h>
32aeb094b520d8ea49b74129927578f18f758c873eJason Sams
33aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android;
34aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android::renderscript;
35aeb094b520d8ea49b74129927578f18f758c873eJason Sams
36aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GET_TLS()  Context::ScriptTLSStruct * tls = \
37aeb094b520d8ea49b74129927578f18f758c873eJason Sams    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
38aeb094b520d8ea49b74129927578f18f758c873eJason Sams    Context * rsc = tls->mContext; \
39aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ScriptC * sc = (ScriptC *) tls->mScript
40aeb094b520d8ea49b74129927578f18f758c873eJason Sams
41aeb094b520d8ea49b74129927578f18f758c873eJason Sams
42aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
43aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Context
44aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
45aeb094b520d8ea49b74129927578f18f758c873eJason Sams
46aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
47aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
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}
55aeb094b520d8ea49b74129927578f18f758c873eJason Sams
56aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
57aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
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}
65aeb094b520d8ea49b74129927578f18f758c873eJason Sams
66aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramStore(RsProgramStore pfs)
67aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
68aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
69aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramStore(rsc, pfs);
70aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
71aeb094b520d8ea49b74129927578f18f758c873eJason Sams
72aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramFragment(RsProgramFragment pf)
73aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
74aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
75aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramFragment(rsc, pf);
76aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
77aeb094b520d8ea49b74129927578f18f758c873eJason Sams
78aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramVertex(RsProgramVertex pv)
79aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
80aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
81aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramVertex(rsc, pv);
82aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
83aeb094b520d8ea49b74129927578f18f758c873eJason Sams
84aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramRaster(RsProgramRaster pv)
85aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
86aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
87aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramRaster(rsc, pv);
88aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
89aeb094b520d8ea49b74129927578f18f758c873eJason Sams
90aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
91aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP
92aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
93aeb094b520d8ea49b74129927578f18f758c873eJason Sams
94a490f1003a76286e0f00606adff4ef85fdd78b02Jim Millerstatic void SC_vpLoadProjectionMatrix(const rsc_Matrix *m)
95a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller{
96a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller    GET_TLS();
97a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller    rsc->getVertex()->setProjectionMatrix(m);
98a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller}
99a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller
100aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_vpLoadModelMatrix(const rsc_Matrix *m)
101aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
102aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
103aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->getVertex()->setModelviewMatrix(m);
104aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
105aeb094b520d8ea49b74129927578f18f758c873eJason Sams
106aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_vpLoadTextureMatrix(const rsc_Matrix *m)
107aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
108aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
109aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->getVertex()->setTextureMatrix(m);
110aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
111aeb094b520d8ea49b74129927578f18f758c873eJason Sams
112aeb094b520d8ea49b74129927578f18f758c873eJason Sams
113aeb094b520d8ea49b74129927578f18f758c873eJason Sams
114aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
115aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing
116aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
117aeb094b520d8ea49b74129927578f18f758c873eJason Sams
118aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuadTexCoords(float x1, float y1, float z1,
119aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u1, float v1,
120aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x2, float y2, float z2,
121aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u2, float v2,
122aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x3, float y3, float z3,
123aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u3, float v3,
124aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x4, float y4, float z4,
125aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u4, float v4)
126aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
127aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
128aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
129aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
130aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
131aeb094b520d8ea49b74129927578f18f758c873eJason Sams
132aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("Quad");
133aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
134aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
135aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
136aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
137aeb094b520d8ea49b74129927578f18f758c873eJason Sams
138aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
139aeb094b520d8ea49b74129927578f18f758c873eJason Sams    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
140aeb094b520d8ea49b74129927578f18f758c873eJason Sams
141aeb094b520d8ea49b74129927578f18f758c873eJason Sams    VertexArray va;
14279f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.add(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "position");
14379f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.add(GL_FLOAT, 2, 8, false, (uint32_t)tex, "texture0");
14479f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
145aeb094b520d8ea49b74129927578f18f758c873eJason Sams
146aeb094b520d8ea49b74129927578f18f758c873eJason Sams    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
147aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
148aeb094b520d8ea49b74129927578f18f758c873eJason Sams
149aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuad(float x1, float y1, float z1,
150aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x2, float y2, float z2,
151aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x3, float y3, float z3,
152aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x4, float y4, float z4)
153aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
154aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuadTexCoords(x1, y1, z1, 0, 1,
155aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x2, y2, z2, 1, 1,
156aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x3, y3, z3, 1, 0,
157aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x4, y4, z4, 0, 0);
158aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
159aeb094b520d8ea49b74129927578f18f758c873eJason Sams
160aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h)
161aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
162aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
163aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex());
164aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->setVertex(rsc->getDefaultProgramVertex());
165aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
166aeb094b520d8ea49b74129927578f18f758c873eJason Sams
167aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //GLint crop[4] = {0, h, w, -h};
168aeb094b520d8ea49b74129927578f18f758c873eJason Sams
169aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float sh = rsc->getHeight();
170aeb094b520d8ea49b74129927578f18f758c873eJason Sams
171aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x,   sh - y,     z,
172aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - y,     z,
173aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - (y+h), z,
174aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x,   sh - (y+h), z);
175aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->setVertex((ProgramVertex *)tmp.get());
176aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
177bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams/*
178aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSprite(float x, float y, float z, float w, float h)
179aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
180aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
181aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vin[3] = {x, y, z};
182aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vout[4];
183aeb094b520d8ea49b74129927578f18f758c873eJason Sams
184aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  in %f %f %f", x, y, z);
185aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->getVertex()->transformToScreen(rsc, vout, vin);
186aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]);
187aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] /= vout[3];
188aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] /= vout[3];
189aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[2] /= vout[3];
190aeb094b520d8ea49b74129927578f18f758c873eJason Sams
191aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] *= rsc->getWidth() / 2;
192aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] *= rsc->getHeight() / 2;
193aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] += rsc->getWidth() / 2;
194aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] += rsc->getHeight() / 2;
195aeb094b520d8ea49b74129927578f18f758c873eJason Sams
196aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] -= w/2;
197aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] -= h/2;
198aeb094b520d8ea49b74129927578f18f758c873eJason Sams
199aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out2 %f %f %f", vout[0], vout[1], vout[2]);
200aeb094b520d8ea49b74129927578f18f758c873eJason Sams
201aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // U, V, W, H
202aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w);
203aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
204aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
205bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams*/
206aeb094b520d8ea49b74129927578f18f758c873eJason Sams
207aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawRect(float x1, float y1,
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x2, float y2, float z)
209aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
210aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
211aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x1, y2, z,
212aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y2, z,
213aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y1, z,
214aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x1, y1, z);
215aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
216aeb094b520d8ea49b74129927578f18f758c873eJason Sams
2174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMesh(RsMesh vsm)
2184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{
2194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2204e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
221aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
222aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
223aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
224aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->render(rsc);
225aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
226aeb094b520d8ea49b74129927578f18f758c873eJason Sams
2274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitive(RsMesh vsm, uint32_t primIndex)
228aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
229aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
2304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
231aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
232aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
233aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
2344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, primIndex);
2354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
2374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitiveRange(RsMesh vsm, uint32_t primIndex, uint32_t start, uint32_t len)
2384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{
2394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
2414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, primIndex, start, len);
245aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
246aeb094b520d8ea49b74129927578f18f758c873eJason Sams
247aeb094b520d8ea49b74129927578f18f758c873eJason Sams
248aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
249aeb094b520d8ea49b74129927578f18f758c873eJason Sams//
250aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
251aeb094b520d8ea49b74129927578f18f758c873eJason Sams
252aeb094b520d8ea49b74129927578f18f758c873eJason Sams
253aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_color(float r, float g, float b, float a)
254aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
255aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
256aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->mStateVertex.color[0] = r;
257aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->mStateVertex.color[1] = g;
258aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->mStateVertex.color[2] = b;
259aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->mStateVertex.color[3] = a;
260aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->checkVersion2_0()) {
261aeb094b520d8ea49b74129927578f18f758c873eJason Sams        glColor4f(r, g, b, a);
262aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
263aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
264aeb094b520d8ea49b74129927578f18f758c873eJason Sams
26522fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel)
266aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
267aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
268aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
269aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
27022fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture(RsAllocation va)
27122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{
27222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    GET_TLS();
27322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    rsi_AllocationUploadToTexture(rsc, va, false, 0);
27422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
275aeb094b520d8ea49b74129927578f18f758c873eJason Sams
276aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_uploadToBufferObject(RsAllocation va)
277aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
278aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
279aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToBufferObject(rsc, va);
280aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
281aeb094b520d8ea49b74129927578f18f758c873eJason Sams
28222fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearColor(float r, float g, float b, float a)
283aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
284aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
28522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    if (!rsc->setupCheck()) {
28622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        return;
28722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    }
288aeb094b520d8ea49b74129927578f18f758c873eJason Sams
28922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearColor(r, g, b, a);
29022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_COLOR_BUFFER_BIT);
291aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
292aeb094b520d8ea49b74129927578f18f758c873eJason Sams
29322fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearDepth(float v)
294aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
295aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
29622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    if (!rsc->setupCheck()) {
29722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        return;
29822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    }
29922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
30022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearDepthf(v);
30122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_DEPTH_BUFFER_BIT);
302aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
303aeb094b520d8ea49b74129927578f18f758c873eJason Sams
304aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getWidth()
305aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
306aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
307aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
308aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
309aeb094b520d8ea49b74129927578f18f758c873eJason Sams
310aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getHeight()
311aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
312aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
313aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
314aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
315aeb094b520d8ea49b74129927578f18f758c873eJason Sams
316d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawTextAlloc(RsAllocation va, int x, int y)
317d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
318d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
319d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Allocation *alloc = static_cast<Allocation *>(va);
320d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsc->mStateFont.renderText(alloc, x, y);
321d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
322d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
323d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawText(const char *text, int x, int y)
324d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
325d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
326d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsc->mStateFont.renderText(text, x, y);
327d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
328d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
329d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_BindFont(RsFont font)
330d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
331d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
332d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
333d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
334aeb094b520d8ea49b74129927578f18f758c873eJason Sams
335aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
336aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Class implementation
337aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
338aeb094b520d8ea49b74129927578f18f758c873eJason Sams
339aeb094b520d8ea49b74129927578f18f758c873eJason Sams// llvm name mangling ref
340aeb094b520d8ea49b74129927578f18f758c873eJason Sams//  <builtin-type> ::= v  # void
341aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= b  # bool
342aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= c  # char
343aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= a  # signed char
344aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= h  # unsigned char
345aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= s  # short
346aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= t  # unsigned short
347aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= i  # int
348aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= j  # unsigned int
349aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= l  # long
350aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= m  # unsigned long
351aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= x  # long long, __int64
352aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= y  # unsigned long long, __int64
353aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= f  # float
354aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= d  # double
355aeb094b520d8ea49b74129927578f18f758c873eJason Sams
356aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic ScriptCState::SymbolTable_t gSyms[] = {
35722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindProgramFragment", (void *)&SC_bindProgramFragment },
35822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindProgramStore", (void *)&SC_bindProgramStore },
35922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindProgramVertex", (void *)&SC_bindProgramVertex },
36022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindProgramRaster", (void *)&SC_bindProgramRaster },
36122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindSampler", (void *)&SC_bindSampler },
36222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindTexture", (void *)&SC_bindTexture },
36322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
364a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller    { "rsgProgramVertexLoadProjectionMatrix", (void *)&SC_vpLoadProjectionMatrix },
36522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgProgramVertexLoadModelMatrix", (void *)&SC_vpLoadModelMatrix },
36622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgProgramVertexLoadTextureMatrix", (void *)&SC_vpLoadTextureMatrix },
36722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
36822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgGetWidth", (void *)&SC_getWidth },
36922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgGetHeight", (void *)&SC_getHeight },
37022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
3718c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams    { "_Z18rsgUploadToTexture13rs_allocationi", (void *)&SC_uploadToTexture2 },
3728c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams    { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture },
37322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgUploadToBufferObject", (void *)&SC_uploadToBufferObject },
37422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
37522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgDrawRect", (void *)&SC_drawRect },
37622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgDrawQuad", (void *)&SC_drawQuad },
37722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgDrawQuadTexCoords", (void *)&SC_drawQuadTexCoords },
37822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    //{ "drawSprite", (void *)&SC_drawSprite },
37922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgDrawSpriteScreenspace", (void *)&SC_drawSpriteScreenspace },
38022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
3814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_drawMesh },
3824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    { "_Z11rsgDrawMesh7rs_meshi", (void *)&SC_drawMeshPrimitive },
3834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    { "_Z11rsgDrawMesh7rs_meshiii", (void *)&SC_drawMeshPrimitiveRange },
3844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
38522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgClearColor", (void *)&SC_ClearColor },
38622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgClearDepth", (void *)&SC_ClearDepth },
38722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
388d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText },
389d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc },
390d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
391d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    { "rsgBindFont", (void *)&SC_BindFont },
392d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
393aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // misc
394aeb094b520d8ea49b74129927578f18f758c873eJason Sams    { "color", (void *)&SC_color },
395aeb094b520d8ea49b74129927578f18f758c873eJason Sams
396aeb094b520d8ea49b74129927578f18f758c873eJason Sams    { NULL, NULL }
397aeb094b520d8ea49b74129927578f18f758c873eJason Sams};
398aeb094b520d8ea49b74129927578f18f758c873eJason Sams
399aeb094b520d8ea49b74129927578f18f758c873eJason Samsconst ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolGL(const char *sym)
400aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
401aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ScriptCState::SymbolTable_t *syms = gSyms;
402aeb094b520d8ea49b74129927578f18f758c873eJason Sams
403aeb094b520d8ea49b74129927578f18f758c873eJason Sams    while (syms->mPtr) {
404aeb094b520d8ea49b74129927578f18f758c873eJason Sams        if (!strcmp(syms->mName, sym)) {
405aeb094b520d8ea49b74129927578f18f758c873eJason Sams            return syms;
406aeb094b520d8ea49b74129927578f18f758c873eJason Sams        }
407aeb094b520d8ea49b74129927578f18f758c873eJason Sams        syms++;
408aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
409aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return NULL;
410aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
411aeb094b520d8ea49b74129927578f18f758c873eJason Sams
412