rsScriptC_LibGL.cpp revision 95333f998fd4a983f89e5128e85f6f710d200bd9
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
1136445e5210c6d7f8689e94be9026153d017c9545bJason Samsstatic void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, float a)
1146445e5210c6d7f8689e94be9026153d017c9545bJason Sams{
1156445e5210c6d7f8689e94be9026153d017c9545bJason Sams    //GET_TLS();
1166445e5210c6d7f8689e94be9026153d017c9545bJason Sams    ProgramFragment *pf = static_cast<ProgramFragment *>(vpf);
1176445e5210c6d7f8689e94be9026153d017c9545bJason Sams    pf->setConstantColor(r, g, b, a);
1186445e5210c6d7f8689e94be9026153d017c9545bJason Sams}
1196445e5210c6d7f8689e94be9026153d017c9545bJason Sams
12095333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchoukstatic void SC_vpGetProjectionMatrix(rsc_Matrix *m)
12195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk{
12295333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk    GET_TLS();
12395333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk    rsc->getVertex()->getProjectionMatrix(m);
12495333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk}
12595333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
126aeb094b520d8ea49b74129927578f18f758c873eJason Sams
127aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
128aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing
129aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
130aeb094b520d8ea49b74129927578f18f758c873eJason Sams
131aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuadTexCoords(float x1, float y1, float z1,
132aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u1, float v1,
133aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x2, float y2, float z2,
134aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u2, float v2,
135aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x3, float y3, float z3,
136aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u3, float v3,
137aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float x4, float y4, float z4,
138aeb094b520d8ea49b74129927578f18f758c873eJason Sams                                 float u4, float v4)
139aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
140aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
141aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
142aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
143aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
144aeb094b520d8ea49b74129927578f18f758c873eJason Sams
145aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("Quad");
146aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
147aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
148aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
149aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
150aeb094b520d8ea49b74129927578f18f758c873eJason Sams
151aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
152aeb094b520d8ea49b74129927578f18f758c873eJason Sams    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
153aeb094b520d8ea49b74129927578f18f758c873eJason Sams
154aeb094b520d8ea49b74129927578f18f758c873eJason Sams    VertexArray va;
15579f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.add(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "position");
15679f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.add(GL_FLOAT, 2, 8, false, (uint32_t)tex, "texture0");
15779f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams    va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
158aeb094b520d8ea49b74129927578f18f758c873eJason Sams
159aeb094b520d8ea49b74129927578f18f758c873eJason Sams    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
160aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
161aeb094b520d8ea49b74129927578f18f758c873eJason Sams
162aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuad(float x1, float y1, float z1,
163aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x2, float y2, float z2,
164aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x3, float y3, float z3,
165aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x4, float y4, float z4)
166aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
167aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuadTexCoords(x1, y1, z1, 0, 1,
168aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x2, y2, z2, 1, 1,
169aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x3, y3, z3, 1, 0,
170aeb094b520d8ea49b74129927578f18f758c873eJason Sams                         x4, y4, z4, 0, 0);
171aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
172aeb094b520d8ea49b74129927578f18f758c873eJason Sams
173aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h)
174aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
175aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
176aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex());
177aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->setVertex(rsc->getDefaultProgramVertex());
178aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
179aeb094b520d8ea49b74129927578f18f758c873eJason Sams
180aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //GLint crop[4] = {0, h, w, -h};
181aeb094b520d8ea49b74129927578f18f758c873eJason Sams
182aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float sh = rsc->getHeight();
183aeb094b520d8ea49b74129927578f18f758c873eJason Sams
184aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x,   sh - y,     z,
185aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - y,     z,
186aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - (y+h), z,
187aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x,   sh - (y+h), z);
188aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->setVertex((ProgramVertex *)tmp.get());
189aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
190bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams/*
191aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSprite(float x, float y, float z, float w, float h)
192aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
193aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
194aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vin[3] = {x, y, z};
195aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vout[4];
196aeb094b520d8ea49b74129927578f18f758c873eJason Sams
197aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  in %f %f %f", x, y, z);
198aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsc->getVertex()->transformToScreen(rsc, vout, vin);
199aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]);
200aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] /= vout[3];
201aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] /= vout[3];
202aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[2] /= vout[3];
203aeb094b520d8ea49b74129927578f18f758c873eJason Sams
204aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] *= rsc->getWidth() / 2;
205aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] *= rsc->getHeight() / 2;
206aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] += rsc->getWidth() / 2;
207aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] += rsc->getHeight() / 2;
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams
209aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[0] -= w/2;
210aeb094b520d8ea49b74129927578f18f758c873eJason Sams    vout[1] -= h/2;
211aeb094b520d8ea49b74129927578f18f758c873eJason Sams
212aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("ds  out2 %f %f %f", vout[0], vout[1], vout[2]);
213aeb094b520d8ea49b74129927578f18f758c873eJason Sams
214aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // U, V, W, H
215aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w);
216aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
217aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
218bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams*/
219aeb094b520d8ea49b74129927578f18f758c873eJason Sams
220aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawRect(float x1, float y1,
221aeb094b520d8ea49b74129927578f18f758c873eJason Sams                        float x2, float y2, float z)
222aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
223aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
224aeb094b520d8ea49b74129927578f18f758c873eJason Sams    SC_drawQuad(x1, y2, z,
225aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y2, z,
226aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x2, y1, z,
227aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x1, y1, z);
228aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
229aeb094b520d8ea49b74129927578f18f758c873eJason Sams
2304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMesh(RsMesh vsm)
2314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{
2324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2334e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
234aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
235aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
236aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
237aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->render(rsc);
238aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
239aeb094b520d8ea49b74129927578f18f758c873eJason Sams
2404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitive(RsMesh vsm, uint32_t primIndex)
241aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
242aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
2434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
244aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
245aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
246aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
2474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, primIndex);
2484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
2504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitiveRange(RsMesh vsm, uint32_t primIndex, uint32_t start, uint32_t len)
2514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{
2524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    GET_TLS();
2534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
2544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2574e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, primIndex, start, len);
258aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
259aeb094b520d8ea49b74129927578f18f758c873eJason Sams
260ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukstatic void SC_meshComputeBoundingBox(RsMesh vsm, float *minX, float *minY, float *minZ,
261ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk                                                     float *maxX, float *maxY, float *maxZ)
262ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk{
263ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    GET_TLS();
264ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    Mesh *sm = static_cast<Mesh *>(vsm);
265ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    sm->computeBBox();
266ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minX = sm->mBBoxMin[0];
267ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minY = sm->mBBoxMin[1];
268ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minZ = sm->mBBoxMin[2];
269ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxX = sm->mBBoxMax[0];
270ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxY = sm->mBBoxMax[1];
271ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxZ = sm->mBBoxMax[2];
272ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk}
273ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk
274aeb094b520d8ea49b74129927578f18f758c873eJason Sams
275aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
276aeb094b520d8ea49b74129927578f18f758c873eJason Sams//
277aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
278aeb094b520d8ea49b74129927578f18f758c873eJason Sams
279aeb094b520d8ea49b74129927578f18f758c873eJason Sams
280aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_color(float r, float g, float b, float a)
281aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
282aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
2836445e5210c6d7f8689e94be9026153d017c9545bJason Sams    ProgramFragment *pf = (ProgramFragment *)rsc->getFragment();
2846445e5210c6d7f8689e94be9026153d017c9545bJason Sams    pf->setConstantColor(r, g, b, a);
285aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
286aeb094b520d8ea49b74129927578f18f758c873eJason Sams
28722fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel)
288aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
289aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
290aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
291aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
29222fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture(RsAllocation va)
29322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{
29422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    GET_TLS();
29522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    rsi_AllocationUploadToTexture(rsc, va, false, 0);
29622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
297aeb094b520d8ea49b74129927578f18f758c873eJason Sams
298aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_uploadToBufferObject(RsAllocation va)
299aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
300aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
301aeb094b520d8ea49b74129927578f18f758c873eJason Sams    rsi_AllocationUploadToBufferObject(rsc, va);
302aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
303aeb094b520d8ea49b74129927578f18f758c873eJason Sams
30422fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearColor(float r, float g, float b, float a)
305aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
306aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
30722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    if (!rsc->setupCheck()) {
30822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        return;
30922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    }
310aeb094b520d8ea49b74129927578f18f758c873eJason Sams
31122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearColor(r, g, b, a);
31222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_COLOR_BUFFER_BIT);
313aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
314aeb094b520d8ea49b74129927578f18f758c873eJason Sams
31522fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearDepth(float v)
316aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
317aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
31822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    if (!rsc->setupCheck()) {
31922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        return;
32022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    }
32122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
32222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearDepthf(v);
32322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_DEPTH_BUFFER_BIT);
324aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
325aeb094b520d8ea49b74129927578f18f758c873eJason Sams
326aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getWidth()
327aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
328aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
329aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
330aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
331aeb094b520d8ea49b74129927578f18f758c873eJason Sams
332aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getHeight()
333aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
334aeb094b520d8ea49b74129927578f18f758c873eJason Sams    GET_TLS();
335aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
336aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
337aeb094b520d8ea49b74129927578f18f758c873eJason Sams
338d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawTextAlloc(RsAllocation va, int x, int y)
339d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
340d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
341d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    Allocation *alloc = static_cast<Allocation *>(va);
342d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsc->mStateFont.renderText(alloc, x, y);
343d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
344d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
345d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawText(const char *text, int x, int y)
346d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
347d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
348d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsc->mStateFont.renderText(text, x, y);
349d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
350d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
351d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_BindFont(RsFont font)
352d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{
353d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    GET_TLS();
354d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
355d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
356aeb094b520d8ea49b74129927578f18f758c873eJason Sams
3579fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchoukstatic void SC_FontColor(float r, float g, float b, float a)
3589fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk{
3599fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    GET_TLS();
3609fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    rsc->mStateFont.setFontColor(r, g, b, a);
3619fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk}
3629fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
363aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
364aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Class implementation
365aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
366aeb094b520d8ea49b74129927578f18f758c873eJason Sams
367aeb094b520d8ea49b74129927578f18f758c873eJason Sams// llvm name mangling ref
368aeb094b520d8ea49b74129927578f18f758c873eJason Sams//  <builtin-type> ::= v  # void
369aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= b  # bool
370aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= c  # char
371aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= a  # signed char
372aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= h  # unsigned char
373aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= s  # short
374aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= t  # unsigned short
375aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= i  # int
376aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= j  # unsigned int
377aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= l  # long
378aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= m  # unsigned long
379aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= x  # long long, __int64
380aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= y  # unsigned long long, __int64
381aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= f  # float
382aeb094b520d8ea49b74129927578f18f758c873eJason Sams//                 ::= d  # double
383aeb094b520d8ea49b74129927578f18f758c873eJason Sams
384aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic ScriptCState::SymbolTable_t gSyms[] = {
3857349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_bindProgramFragment },
3867349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_bindProgramStore },
3877349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_bindProgramVertex },
3887349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_bindProgramRaster },
3897349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_bindSampler },
3907349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_bindTexture },
39122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
3927349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadProjectionMatrix },
3937349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadModelMatrix },
3947349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadTextureMatrix },
39522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
39695333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk    { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_vpGetProjectionMatrix },
39795333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
3986445e5210c6d7f8689e94be9026153d017c9545bJason Sams    { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_pfConstantColor },
3996445e5210c6d7f8689e94be9026153d017c9545bJason Sams
4007349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgGetWidthv", (void *)&SC_getWidth },
4017349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z12rsgGetHeightv", (void *)&SC_getHeight },
40222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4037349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z18rsgUploadToTexture13rs_allocationj", (void *)&SC_uploadToTexture2 },
4048c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams    { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture },
4057349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z23rsgUploadToBufferObject13rs_allocation", (void *)&SC_uploadToBufferObject },
40622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4077349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgDrawRectfffff", (void *)&SC_drawRect },
4087349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_drawQuad },
4097349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_drawQuadTexCoords },
4107349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_drawSpriteScreenspace },
41122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_drawMesh },
4137349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_drawMeshPrimitive },
4147349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_drawMeshPrimitiveRange },
415ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_meshComputeBoundingBox },
4164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
4177349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z13rsgClearColorffff", (void *)&SC_ClearColor },
4187349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth },
41922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
420d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText },
421d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc },
422d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
4237349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont },
4249fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    { "_Z12rsgFontColorffff", (void *)&SC_FontColor },
425d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
426aeb094b520d8ea49b74129927578f18f758c873eJason Sams    // misc
4277349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z5colorffff", (void *)&SC_color },
428aeb094b520d8ea49b74129927578f18f758c873eJason Sams
429aeb094b520d8ea49b74129927578f18f758c873eJason Sams    { NULL, NULL }
430aeb094b520d8ea49b74129927578f18f758c873eJason Sams};
431aeb094b520d8ea49b74129927578f18f758c873eJason Sams
432aeb094b520d8ea49b74129927578f18f758c873eJason Samsconst ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolGL(const char *sym)
433aeb094b520d8ea49b74129927578f18f758c873eJason Sams{
434aeb094b520d8ea49b74129927578f18f758c873eJason Sams    ScriptCState::SymbolTable_t *syms = gSyms;
435aeb094b520d8ea49b74129927578f18f758c873eJason Sams
436aeb094b520d8ea49b74129927578f18f758c873eJason Sams    while (syms->mPtr) {
437aeb094b520d8ea49b74129927578f18f758c873eJason Sams        if (!strcmp(syms->mName, sym)) {
438aeb094b520d8ea49b74129927578f18f758c873eJason Sams            return syms;
439aeb094b520d8ea49b74129927578f18f758c873eJason Sams        }
440aeb094b520d8ea49b74129927578f18f758c873eJason Sams        syms++;
441aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
442aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return NULL;
443aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
444aeb094b520d8ea49b74129927578f18f758c873eJason Sams
445