rsScriptC_LibGL.cpp revision 4e9a7a8ded109e16b163789274899447cef02642
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// IO routines
44aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
45aeb094b520d8ea49b74129927578f18f758c873eJason Sams
464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_updateSimpleMesh(RsMesh mesh)
47aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
48aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(mesh);
50aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->uploadAll(rsc);
51aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
52aeb094b520d8ea49b74129927578f18f758c873eJason Sams
53aeb094b520d8ea49b74129927578f18f758c873eJason Sams
54aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
55aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Context
56aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
57aeb094b520d8ea49b74129927578f18f758c873eJason Sams
58aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
59aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
60aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
61aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ProgramBindTexture(rsc,
62aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<ProgramFragment *>(vpf),
63aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           slot,
64aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<Allocation *>(va));
65aeb094b520d8ea49b74129927578f18f758c873eJason Sams
66aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
67aeb094b520d8ea49b74129927578f18f758c873eJason Sams
68aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
69aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
70aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
71aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ProgramBindSampler(rsc,
72aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<ProgramFragment *>(vpf),
73aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           slot,
74aeb094b520d8ea49b74129927578f18f758c873eJason Sams                           static_cast<Sampler *>(vs));
75aeb094b520d8ea49b74129927578f18f758c873eJason Sams
76aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
77aeb094b520d8ea49b74129927578f18f758c873eJason Sams
78aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramStore(RsProgramStore pfs)
79aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
80aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
81aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramStore(rsc, pfs);
82aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
83aeb094b520d8ea49b74129927578f18f758c873eJason Sams
84aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramFragment(RsProgramFragment pf)
85aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
86aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
87aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramFragment(rsc, pf);
88aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
89aeb094b520d8ea49b74129927578f18f758c873eJason Sams
90aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramVertex(RsProgramVertex pv)
91aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
92aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
93aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramVertex(rsc, pv);
94aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
95aeb094b520d8ea49b74129927578f18f758c873eJason Sams
96aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramRaster(RsProgramRaster pv)
97aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
98aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
99aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_ContextBindProgramRaster(rsc, pv);
100aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
101aeb094b520d8ea49b74129927578f18f758c873eJason Sams
102aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
103aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP
104aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
105aeb094b520d8ea49b74129927578f18f758c873eJason Sams
106aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_vpLoadModelMatrix(const rsc_Matrix *m)
107aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
108aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
109aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->getVertex()->setModelviewMatrix(m);
110aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
111aeb094b520d8ea49b74129927578f18f758c873eJason Sams
112aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_vpLoadTextureMatrix(const rsc_Matrix *m)
113aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
114aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
115aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->getVertex()->setTextureMatrix(m);
116aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
117aeb094b520d8ea49b74129927578f18f758c873eJason Sams
118aeb094b520d8ea49b74129927578f18f758c873eJason Sams
119aeb094b520d8ea49b74129927578f18f758c873eJason Sams
120aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
121aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing
122aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
123aeb094b520d8ea49b74129927578f18f758c873eJason Sams
124aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuadTexCoords(float x1, float y1, float z1,
125aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u1, float v1,
126aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x2, float y2, float z2,
127aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u2, float v2,
128aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x3, float y3, float z3,
129aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u3, float v3,
130aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x4, float y4, float z4,
131aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u4, float v4)
132aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
133aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
134aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
135aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
136aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
137aeb094b520d8ea49b74129927578f18f758c873eJason Sams
138aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("Quad");
139aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
140aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
141aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
142aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
143aeb094b520d8ea49b74129927578f18f758c873eJason Sams
144aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
145aeb094b520d8ea49b74129927578f18f758c873eJason Sams    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
146aeb094b520d8ea49b74129927578f18f758c873eJason Sams
147aeb094b520d8ea49b74129927578f18f758c873eJason Sams    VertexArray va;
14879f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.add(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "position");
14979f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.add(GL_FLOAT, 2, 8, false, (uint32_t)tex, "texture0");
15079f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
151aeb094b520d8ea49b74129927578f18f758c873eJason Sams
152aeb094b520d8ea49b74129927578f18f758c873eJason Sams    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
153aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
154aeb094b520d8ea49b74129927578f18f758c873eJason Sams
155aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuad(float x1, float y1, float z1,
156aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x2, float y2, float z2,
157aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x3, float y3, float z3,
158aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x4, float y4, float z4)
159aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
160aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuadTexCoords(x1, y1, z1, 0, 1,
161aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x2, y2, z2, 1, 1,
162aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x3, y3, z3, 1, 0,
163aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x4, y4, z4, 0, 0);
164aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
165aeb094b520d8ea49b74129927578f18f758c873eJason Sams
166aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h)
167aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
168aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
169aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex());
170aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->setVertex(rsc->getDefaultProgramVertex());
171aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
172aeb094b520d8ea49b74129927578f18f758c873eJason Sams
173aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //GLint crop[4] = {0, h, w, -h};
174aeb094b520d8ea49b74129927578f18f758c873eJason Sams
175aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float sh = rsc->getHeight();
176aeb094b520d8ea49b74129927578f18f758c873eJason Sams
177aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x,   sh - y,     z,
178aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - y,     z,
179aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - (y+h), z,
180aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x,   sh - (y+h), z);
181aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->setVertex((ProgramVertex *)tmp.get());
182aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
183bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams/*
184aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSprite(float x, float y, float z, float w, float h)
185aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
186aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
187aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vin[3] = {x, y, z};
188aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vout[4];
189aeb094b520d8ea49b74129927578f18f758c873eJason Sams
190aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  in %f %f %f", x, y, z);
191aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->getVertex()->transformToScreen(rsc, vout, vin);
192aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]);
193aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] /= vout[3];
194aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] /= vout[3];
195aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[2] /= vout[3];
196aeb094b520d8ea49b74129927578f18f758c873eJason Sams
197aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] *= rsc->getWidth() / 2;
198aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] *= rsc->getHeight() / 2;
199aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] += rsc->getWidth() / 2;
200aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] += rsc->getHeight() / 2;
201aeb094b520d8ea49b74129927578f18f758c873eJason Sams
202aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] -= w/2;
203aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] -= h/2;
204aeb094b520d8ea49b74129927578f18f758c873eJason Sams
205aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out2 %f %f %f", vout[0], vout[1], vout[2]);
206aeb094b520d8ea49b74129927578f18f758c873eJason Sams
207aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // U, V, W, H
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w);
209aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
210aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
211bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams*/
212aeb094b520d8ea49b74129927578f18f758c873eJason Sams
213aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawRect(float x1, float y1,
214aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x2, float y2, float z)
215aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
216aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
217aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x1, y2, z,
218aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y2, z,
219aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y1, z,
220aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x1, y1, z);
221aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
222aeb094b520d8ea49b74129927578f18f758c873eJason Sams
2234e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawSimpleMesh(RsMesh vsm)
224aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
225aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
2264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
2274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2284e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, 0);
2314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
2334e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawSimpleMeshRange(RsMesh vsm, uint32_t start, uint32_t len)
2344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{
2354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
2374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, 0, start, len);
2414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
2434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMesh(RsMesh vsm)
2444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{
2454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
247aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
248aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
249aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
250aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->render(rsc);
251aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
252aeb094b520d8ea49b74129927578f18f758c873eJason Sams
2534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitive(RsMesh vsm, uint32_t primIndex)
254aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
255aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
2564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
257aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
258aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
259aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
2604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, primIndex);
2614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
2634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitiveRange(RsMesh vsm, uint32_t primIndex, uint32_t start, uint32_t len)
2644e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{
2654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
2674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, primIndex, start, len);
271aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
272aeb094b520d8ea49b74129927578f18f758c873eJason Sams
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();
282aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->mStateVertex.color[0] = r;
283aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->mStateVertex.color[1] = g;
284aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->mStateVertex.color[2] = b;
285aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->mStateVertex.color[3] = a;
286aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->checkVersion2_0()) {
287aeb094b520d8ea49b74129927578f18f758c873eJason Sams        glColor4f(r, g, b, a);
288aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
289aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
290aeb094b520d8ea49b74129927578f18f758c873eJason Sams
29122fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel)
292aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
293aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
294aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
295aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
29622fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture(RsAllocation va)
29722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{
29822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    GET_TLS();
29922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    rsi_AllocationUploadToTexture(rsc, va, false, 0);
30022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
301aeb094b520d8ea49b74129927578f18f758c873eJason Sams
302aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_uploadToBufferObject(RsAllocation va)
303aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
304aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
305aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToBufferObject(rsc, va);
306aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
307aeb094b520d8ea49b74129927578f18f758c873eJason Sams
30822fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearColor(float r, float g, float b, float a)
309aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
310aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
31122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    if (!rsc->setupCheck()) {
31222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        return;
31322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    }
314aeb094b520d8ea49b74129927578f18f758c873eJason Sams
31522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearColor(r, g, b, a);
31622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_COLOR_BUFFER_BIT);
317aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
318aeb094b520d8ea49b74129927578f18f758c873eJason Sams
31922fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearDepth(float v)
320aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
321aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
32222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    if (!rsc->setupCheck()) {
32322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        return;
32422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    }
32522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
32622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearDepthf(v);
32722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_DEPTH_BUFFER_BIT);
328aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
329aeb094b520d8ea49b74129927578f18f758c873eJason Sams
330aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getWidth()
331aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
332aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
333aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
334aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
335aeb094b520d8ea49b74129927578f18f758c873eJason Sams
336aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getHeight()
337aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
338aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
339aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
340aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
341aeb094b520d8ea49b74129927578f18f758c873eJason Sams
342d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawTextAlloc(RsAllocation va, int x, int y)
343d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
344d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
345d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Allocation *alloc = static_cast<Allocation *>(va);
346d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsc->mStateFont.renderText(alloc, x, y);
347d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
348d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
349d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawText(const char *text, int x, int y)
350d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
351d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
352d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsc->mStateFont.renderText(text, x, y);
353d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
354d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
355d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_BindFont(RsFont font)
356d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
357d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
358d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
359d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
360aeb094b520d8ea49b74129927578f18f758c873eJason Sams
361aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
362aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Class implementation
363aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
364aeb094b520d8ea49b74129927578f18f758c873eJason Sams
365aeb094b520d8ea49b74129927578f18f758c873eJason Sams// llvm name mangling ref
366aeb094b520d8ea49b74129927578f18f758c873eJason Sams//  <builtin-type> ::= v  # void
367aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= b  # bool
368aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= c  # char
369aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= a  # signed char
370aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= h  # unsigned char
371aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= s  # short
372aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= t  # unsigned short
373aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= i  # int
374aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= j  # unsigned int
375aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= l  # long
376aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= m  # unsigned long
377aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= x  # long long, __int64
378aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= y  # unsigned long long, __int64
379aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= f  # float
380aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= d  # double
381aeb094b520d8ea49b74129927578f18f758c873eJason Sams
382aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic ScriptCState::SymbolTable_t gSyms[] = {
38322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindProgramFragment", (void *)&SC_bindProgramFragment },
38422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindProgramStore", (void *)&SC_bindProgramStore },
38522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindProgramVertex", (void *)&SC_bindProgramVertex },
38622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindProgramRaster", (void *)&SC_bindProgramRaster },
38722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindSampler", (void *)&SC_bindSampler },
38822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgBindTexture", (void *)&SC_bindTexture },
38922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
39022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgProgramVertexLoadModelMatrix", (void *)&SC_vpLoadModelMatrix },
39122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgProgramVertexLoadTextureMatrix", (void *)&SC_vpLoadTextureMatrix },
39222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
39322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgGetWidth", (void *)&SC_getWidth },
39422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgGetHeight", (void *)&SC_getHeight },
39522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
3968c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams    { "_Z18rsgUploadToTexture13rs_allocationi", (void *)&SC_uploadToTexture2 },
3978c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams    { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture },
39822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgUploadToBufferObject", (void *)&SC_uploadToBufferObject },
39922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
40022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgDrawRect", (void *)&SC_drawRect },
40122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgDrawQuad", (void *)&SC_drawQuad },
40222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgDrawQuadTexCoords", (void *)&SC_drawQuadTexCoords },
40322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    //{ "drawSprite", (void *)&SC_drawSprite },
40422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgDrawSpriteScreenspace", (void *)&SC_drawSpriteScreenspace },
4058c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams    { "_Z17rsgDrawSimpleMesh7rs_mesh", (void *)&SC_drawSimpleMesh },
4068c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams    { "_Z17rsgDrawSimpleMesh7rs_meshii", (void *)&SC_drawSimpleMeshRange },
40722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_drawMesh },
4094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    { "_Z11rsgDrawMesh7rs_meshi", (void *)&SC_drawMeshPrimitive },
4104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    { "_Z11rsgDrawMesh7rs_meshiii", (void *)&SC_drawMeshPrimitiveRange },
4114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
41222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgClearColor", (void *)&SC_ClearColor },
41322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "rsgClearDepth", (void *)&SC_ClearDepth },
41422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
415d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText },
416d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc },
417d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
418d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    { "rsgBindFont", (void *)&SC_BindFont },
419d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
42022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
42122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    //////////////////////////////////////
422aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // IO
423aeb094b520d8ea49b74129927578f18f758c873eJason Sams    { "updateSimpleMesh", (void *)&SC_updateSimpleMesh },
424aeb094b520d8ea49b74129927578f18f758c873eJason Sams
425aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // misc
426aeb094b520d8ea49b74129927578f18f758c873eJason Sams    { "color", (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