rsScriptC_LibGL.cpp revision 976846c738848218b8b6948ea9f75633fe595a0f
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "rsContext.h"
18#include "rsScriptC.h"
19#include "rsMatrix.h"
20
21#include "acc/acc.h"
22#include "utils/Timers.h"
23
24#define GL_GLEXT_PROTOTYPES
25
26#include <GLES/gl.h>
27#include <GLES/glext.h>
28#include <GLES2/gl2.h>
29#include <GLES2/gl2ext.h>
30
31#include <time.h>
32
33using namespace android;
34using namespace android::renderscript;
35
36#define GET_TLS()  Context::ScriptTLSStruct * tls = \
37    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
38    Context * rsc = tls->mContext; \
39    ScriptC * sc = (ScriptC *) tls->mScript
40
41
42//////////////////////////////////////////////////////////////////////////////
43// IO routines
44//////////////////////////////////////////////////////////////////////////////
45
46static void SC_updateSimpleMesh(RsSimpleMesh mesh)
47{
48    GET_TLS();
49    SimpleMesh *sm = static_cast<SimpleMesh *>(mesh);
50    sm->uploadAll(rsc);
51}
52
53
54//////////////////////////////////////////////////////////////////////////////
55// Context
56//////////////////////////////////////////////////////////////////////////////
57
58static void SC_bindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
59{
60    GET_TLS();
61    rsi_ProgramBindTexture(rsc,
62                           static_cast<ProgramFragment *>(vpf),
63                           slot,
64                           static_cast<Allocation *>(va));
65
66}
67
68static void SC_bindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
69{
70    GET_TLS();
71    rsi_ProgramBindSampler(rsc,
72                           static_cast<ProgramFragment *>(vpf),
73                           slot,
74                           static_cast<Sampler *>(vs));
75
76}
77
78static void SC_bindProgramStore(RsProgramStore pfs)
79{
80    GET_TLS();
81    rsi_ContextBindProgramStore(rsc, pfs);
82}
83
84static void SC_bindProgramFragment(RsProgramFragment pf)
85{
86    GET_TLS();
87    rsi_ContextBindProgramFragment(rsc, pf);
88}
89
90static void SC_bindProgramVertex(RsProgramVertex pv)
91{
92    GET_TLS();
93    rsi_ContextBindProgramVertex(rsc, pv);
94}
95
96static void SC_bindProgramRaster(RsProgramRaster pv)
97{
98    GET_TLS();
99    rsi_ContextBindProgramRaster(rsc, pv);
100}
101
102//////////////////////////////////////////////////////////////////////////////
103// VP
104//////////////////////////////////////////////////////////////////////////////
105
106static void SC_vpLoadModelMatrix(const rsc_Matrix *m)
107{
108    GET_TLS();
109    rsc->getVertex()->setModelviewMatrix(m);
110}
111
112static void SC_vpLoadTextureMatrix(const rsc_Matrix *m)
113{
114    GET_TLS();
115    rsc->getVertex()->setTextureMatrix(m);
116}
117
118
119
120//////////////////////////////////////////////////////////////////////////////
121// Drawing
122//////////////////////////////////////////////////////////////////////////////
123
124static void SC_drawQuadTexCoords(float x1, float y1, float z1,
125                                 float u1, float v1,
126                                 float x2, float y2, float z2,
127                                 float u2, float v2,
128                                 float x3, float y3, float z3,
129                                 float u3, float v3,
130                                 float x4, float y4, float z4,
131                                 float u4, float v4)
132{
133    GET_TLS();
134    if (!rsc->setupCheck()) {
135        return;
136    }
137
138    //LOGE("Quad");
139    //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
140    //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
141    //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
142    //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
143
144    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
145    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
146
147    VertexArray va;
148    va.add(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "position");
149    va.add(GL_FLOAT, 2, 8, false, (uint32_t)tex, "texture0");
150    va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
151
152    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
153}
154
155static void SC_drawQuad(float x1, float y1, float z1,
156                        float x2, float y2, float z2,
157                        float x3, float y3, float z3,
158                        float x4, float y4, float z4)
159{
160    SC_drawQuadTexCoords(x1, y1, z1, 0, 1,
161                         x2, y2, z2, 1, 1,
162                         x3, y3, z3, 1, 0,
163                         x4, y4, z4, 0, 0);
164}
165
166static void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h)
167{
168    GET_TLS();
169    ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex());
170    rsc->setVertex(rsc->getDefaultProgramVertex());
171    //rsc->setupCheck();
172
173    //GLint crop[4] = {0, h, w, -h};
174
175    float sh = rsc->getHeight();
176
177    SC_drawQuad(x,   sh - y,     z,
178                x+w, sh - y,     z,
179                x+w, sh - (y+h), z,
180                x,   sh - (y+h), z);
181    rsc->setVertex((ProgramVertex *)tmp.get());
182}
183/*
184static void SC_drawSprite(float x, float y, float z, float w, float h)
185{
186    GET_TLS();
187    float vin[3] = {x, y, z};
188    float vout[4];
189
190    //LOGE("ds  in %f %f %f", x, y, z);
191    rsc->getVertex()->transformToScreen(rsc, vout, vin);
192    //LOGE("ds  out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]);
193    vout[0] /= vout[3];
194    vout[1] /= vout[3];
195    vout[2] /= vout[3];
196
197    vout[0] *= rsc->getWidth() / 2;
198    vout[1] *= rsc->getHeight() / 2;
199    vout[0] += rsc->getWidth() / 2;
200    vout[1] += rsc->getHeight() / 2;
201
202    vout[0] -= w/2;
203    vout[1] -= h/2;
204
205    //LOGE("ds  out2 %f %f %f", vout[0], vout[1], vout[2]);
206
207    // U, V, W, H
208    SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w);
209    //rsc->setupCheck();
210}
211*/
212
213static void SC_drawRect(float x1, float y1,
214                        float x2, float y2, float z)
215{
216    //LOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
217    SC_drawQuad(x1, y2, z,
218                x2, y2, z,
219                x2, y1, z,
220                x1, y1, z);
221}
222
223static void SC_drawSimpleMesh(RsSimpleMesh vsm)
224{
225    GET_TLS();
226    SimpleMesh *sm = static_cast<SimpleMesh *>(vsm);
227    if (!rsc->setupCheck()) {
228        return;
229    }
230    sm->render(rsc);
231}
232
233static void SC_drawSimpleMeshRange(RsSimpleMesh vsm, uint32_t start, uint32_t len)
234{
235    GET_TLS();
236    SimpleMesh *sm = static_cast<SimpleMesh *>(vsm);
237    if (!rsc->setupCheck()) {
238        return;
239    }
240    sm->renderRange(rsc, start, len);
241}
242
243
244//////////////////////////////////////////////////////////////////////////////
245//
246//////////////////////////////////////////////////////////////////////////////
247
248
249static void SC_color(float r, float g, float b, float a)
250{
251    GET_TLS();
252    rsc->mStateVertex.color[0] = r;
253    rsc->mStateVertex.color[1] = g;
254    rsc->mStateVertex.color[2] = b;
255    rsc->mStateVertex.color[3] = a;
256    if (!rsc->checkVersion2_0()) {
257        glColor4f(r, g, b, a);
258    }
259}
260
261static void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel)
262{
263    GET_TLS();
264    rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
265}
266static void SC_uploadToTexture(RsAllocation va)
267{
268    GET_TLS();
269    rsi_AllocationUploadToTexture(rsc, va, false, 0);
270}
271
272static void SC_uploadToBufferObject(RsAllocation va)
273{
274    GET_TLS();
275    rsi_AllocationUploadToBufferObject(rsc, va);
276}
277
278static void SC_ClearColor(float r, float g, float b, float a)
279{
280    GET_TLS();
281    if (!rsc->setupCheck()) {
282        return;
283    }
284
285    glClearColor(r, g, b, a);
286    glClear(GL_COLOR_BUFFER_BIT);
287}
288
289static void SC_ClearDepth(float v)
290{
291    GET_TLS();
292    if (!rsc->setupCheck()) {
293        return;
294    }
295
296    glClearDepthf(v);
297    glClear(GL_DEPTH_BUFFER_BIT);
298}
299
300static uint32_t SC_getWidth()
301{
302    GET_TLS();
303    return rsc->getWidth();
304}
305
306static uint32_t SC_getHeight()
307{
308    GET_TLS();
309    return rsc->getHeight();
310}
311
312
313//////////////////////////////////////////////////////////////////////////////
314// Class implementation
315//////////////////////////////////////////////////////////////////////////////
316
317// llvm name mangling ref
318//  <builtin-type> ::= v  # void
319//                 ::= b  # bool
320//                 ::= c  # char
321//                 ::= a  # signed char
322//                 ::= h  # unsigned char
323//                 ::= s  # short
324//                 ::= t  # unsigned short
325//                 ::= i  # int
326//                 ::= j  # unsigned int
327//                 ::= l  # long
328//                 ::= m  # unsigned long
329//                 ::= x  # long long, __int64
330//                 ::= y  # unsigned long long, __int64
331//                 ::= f  # float
332//                 ::= d  # double
333
334static ScriptCState::SymbolTable_t gSyms[] = {
335    { "rsgBindProgramFragment", (void *)&SC_bindProgramFragment },
336    { "rsgBindProgramStore", (void *)&SC_bindProgramStore },
337    { "rsgBindProgramVertex", (void *)&SC_bindProgramVertex },
338    { "rsgBindProgramRaster", (void *)&SC_bindProgramRaster },
339    { "rsgBindSampler", (void *)&SC_bindSampler },
340    { "rsgBindTexture", (void *)&SC_bindTexture },
341
342    { "rsgProgramVertexLoadModelMatrix", (void *)&SC_vpLoadModelMatrix },
343    { "rsgProgramVertexLoadTextureMatrix", (void *)&SC_vpLoadTextureMatrix },
344
345    { "rsgGetWidth", (void *)&SC_getWidth },
346    { "rsgGetHeight", (void *)&SC_getHeight },
347
348    { "_Z18rsgUploadToTexture13rs_allocationi", (void *)&SC_uploadToTexture2 },
349    { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture },
350    { "rsgUploadToBufferObject", (void *)&SC_uploadToBufferObject },
351
352    { "rsgDrawRect", (void *)&SC_drawRect },
353    { "rsgDrawQuad", (void *)&SC_drawQuad },
354    { "rsgDrawQuadTexCoords", (void *)&SC_drawQuadTexCoords },
355    //{ "drawSprite", (void *)&SC_drawSprite },
356    { "rsgDrawSpriteScreenspace", (void *)&SC_drawSpriteScreenspace },
357    { "_Z17rsgDrawSimpleMesh7rs_mesh", (void *)&SC_drawSimpleMesh },
358    { "_Z17rsgDrawSimpleMesh7rs_meshii", (void *)&SC_drawSimpleMeshRange },
359
360    { "rsgClearColor", (void *)&SC_ClearColor },
361    { "rsgClearDepth", (void *)&SC_ClearDepth },
362
363
364    //////////////////////////////////////
365    // IO
366    { "updateSimpleMesh", (void *)&SC_updateSimpleMesh },
367
368    // misc
369    { "color", (void *)&SC_color },
370
371    { NULL, NULL }
372};
373
374const ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolGL(const char *sym)
375{
376    ScriptCState::SymbolTable_t *syms = gSyms;
377
378    while (syms->mPtr) {
379        if (!strcmp(syms->mName, sym)) {
380            return syms;
381        }
382        syms++;
383    }
384    return NULL;
385}
386
387