blob: 7185009b7a34f746725cf3e39171fdc116fb1a9d [file] [log] [blame]
Jason Samsaeb094b2010-05-18 13:35:45 -07001/*
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"
Jason Samsaeb094b2010-05-18 13:35:45 -070020
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
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -070046static void SC_updateSimpleMesh(RsMesh mesh)
Jason Samsaeb094b2010-05-18 13:35:45 -070047{
48 GET_TLS();
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -070049 Mesh *sm = static_cast<Mesh *>(mesh);
Jason Samsaeb094b2010-05-18 13:35:45 -070050 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
Jason Samsaeb094b2010-05-18 13:35:45 -0700124static 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;
Jason Sams79f52df2010-06-01 15:47:01 -0700148 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);
Jason Samsaeb094b2010-05-18 13:35:45 -0700151
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}
Jason Samsbdb04602010-06-17 18:05:38 -0700183/*
Jason Samsaeb094b2010-05-18 13:35:45 -0700184static 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}
Jason Samsbdb04602010-06-17 18:05:38 -0700211*/
Jason Samsaeb094b2010-05-18 13:35:45 -0700212
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
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700223static void SC_drawSimpleMesh(RsMesh vsm)
Jason Samsaeb094b2010-05-18 13:35:45 -0700224{
225 GET_TLS();
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700226 Mesh *sm = static_cast<Mesh *>(vsm);
227 if (!rsc->setupCheck()) {
228 return;
229 }
230 sm->renderPrimitive(rsc, 0);
231}
232
233static void SC_drawSimpleMeshRange(RsMesh vsm, uint32_t start, uint32_t len)
234{
235 GET_TLS();
236 Mesh *sm = static_cast<Mesh *>(vsm);
237 if (!rsc->setupCheck()) {
238 return;
239 }
240 sm->renderPrimitiveRange(rsc, 0, start, len);
241}
242
243static void SC_drawMesh(RsMesh vsm)
244{
245 GET_TLS();
246 Mesh *sm = static_cast<Mesh *>(vsm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700247 if (!rsc->setupCheck()) {
248 return;
249 }
250 sm->render(rsc);
251}
252
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700253static void SC_drawMeshPrimitive(RsMesh vsm, uint32_t primIndex)
Jason Samsaeb094b2010-05-18 13:35:45 -0700254{
255 GET_TLS();
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700256 Mesh *sm = static_cast<Mesh *>(vsm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700257 if (!rsc->setupCheck()) {
258 return;
259 }
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700260 sm->renderPrimitive(rsc, primIndex);
261}
262
263static void SC_drawMeshPrimitiveRange(RsMesh vsm, uint32_t primIndex, uint32_t start, uint32_t len)
264{
265 GET_TLS();
266 Mesh *sm = static_cast<Mesh *>(vsm);
267 if (!rsc->setupCheck()) {
268 return;
269 }
270 sm->renderPrimitiveRange(rsc, primIndex, start, len);
Jason Samsaeb094b2010-05-18 13:35:45 -0700271}
272
273
274//////////////////////////////////////////////////////////////////////////////
275//
276//////////////////////////////////////////////////////////////////////////////
277
278
279static void SC_color(float r, float g, float b, float a)
280{
281 GET_TLS();
282 rsc->mStateVertex.color[0] = r;
283 rsc->mStateVertex.color[1] = g;
284 rsc->mStateVertex.color[2] = b;
285 rsc->mStateVertex.color[3] = a;
286 if (!rsc->checkVersion2_0()) {
287 glColor4f(r, g, b, a);
288 }
289}
290
Jason Sams22fa3712010-05-19 17:22:57 -0700291static void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel)
Jason Samsaeb094b2010-05-18 13:35:45 -0700292{
293 GET_TLS();
294 rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
295}
Jason Sams22fa3712010-05-19 17:22:57 -0700296static void SC_uploadToTexture(RsAllocation va)
297{
298 GET_TLS();
299 rsi_AllocationUploadToTexture(rsc, va, false, 0);
300}
Jason Samsaeb094b2010-05-18 13:35:45 -0700301
302static void SC_uploadToBufferObject(RsAllocation va)
303{
304 GET_TLS();
305 rsi_AllocationUploadToBufferObject(rsc, va);
306}
307
Jason Samsaeb094b2010-05-18 13:35:45 -0700308static void SC_ClearColor(float r, float g, float b, float a)
309{
Jason Samsaeb094b2010-05-18 13:35:45 -0700310 GET_TLS();
Jason Sams22fa3712010-05-19 17:22:57 -0700311 if (!rsc->setupCheck()) {
312 return;
313 }
314
315 glClearColor(r, g, b, a);
316 glClear(GL_COLOR_BUFFER_BIT);
317}
318
319static void SC_ClearDepth(float v)
320{
321 GET_TLS();
322 if (!rsc->setupCheck()) {
323 return;
324 }
325
326 glClearDepthf(v);
327 glClear(GL_DEPTH_BUFFER_BIT);
Jason Samsaeb094b2010-05-18 13:35:45 -0700328}
329
330static uint32_t SC_getWidth()
331{
332 GET_TLS();
333 return rsc->getWidth();
334}
335
336static uint32_t SC_getHeight()
337{
338 GET_TLS();
339 return rsc->getHeight();
340}
341
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700342static void SC_DrawTextAlloc(RsAllocation va, int x, int y)
343{
344 GET_TLS();
345 Allocation *alloc = static_cast<Allocation *>(va);
346 rsc->mStateFont.renderText(alloc, x, y);
347}
348
349static void SC_DrawText(const char *text, int x, int y)
350{
351 GET_TLS();
352 rsc->mStateFont.renderText(text, x, y);
353}
354
355static void SC_BindFont(RsFont font)
356{
357 GET_TLS();
358 rsi_ContextBindFont(rsc, font);
359}
Jason Samsaeb094b2010-05-18 13:35:45 -0700360
361//////////////////////////////////////////////////////////////////////////////
362// Class implementation
363//////////////////////////////////////////////////////////////////////////////
364
365// llvm name mangling ref
366// <builtin-type> ::= v # void
367// ::= b # bool
368// ::= c # char
369// ::= a # signed char
370// ::= h # unsigned char
371// ::= s # short
372// ::= t # unsigned short
373// ::= i # int
374// ::= j # unsigned int
375// ::= l # long
376// ::= m # unsigned long
377// ::= x # long long, __int64
378// ::= y # unsigned long long, __int64
379// ::= f # float
380// ::= d # double
381
382static ScriptCState::SymbolTable_t gSyms[] = {
Jason Sams22fa3712010-05-19 17:22:57 -0700383 { "rsgBindProgramFragment", (void *)&SC_bindProgramFragment },
384 { "rsgBindProgramStore", (void *)&SC_bindProgramStore },
385 { "rsgBindProgramVertex", (void *)&SC_bindProgramVertex },
386 { "rsgBindProgramRaster", (void *)&SC_bindProgramRaster },
387 { "rsgBindSampler", (void *)&SC_bindSampler },
388 { "rsgBindTexture", (void *)&SC_bindTexture },
389
390 { "rsgProgramVertexLoadModelMatrix", (void *)&SC_vpLoadModelMatrix },
391 { "rsgProgramVertexLoadTextureMatrix", (void *)&SC_vpLoadTextureMatrix },
392
393 { "rsgGetWidth", (void *)&SC_getWidth },
394 { "rsgGetHeight", (void *)&SC_getHeight },
395
Jason Sams8c880902010-06-15 12:15:57 -0700396 { "_Z18rsgUploadToTexture13rs_allocationi", (void *)&SC_uploadToTexture2 },
397 { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture },
Jason Sams22fa3712010-05-19 17:22:57 -0700398 { "rsgUploadToBufferObject", (void *)&SC_uploadToBufferObject },
399
400 { "rsgDrawRect", (void *)&SC_drawRect },
401 { "rsgDrawQuad", (void *)&SC_drawQuad },
402 { "rsgDrawQuadTexCoords", (void *)&SC_drawQuadTexCoords },
403 //{ "drawSprite", (void *)&SC_drawSprite },
404 { "rsgDrawSpriteScreenspace", (void *)&SC_drawSpriteScreenspace },
Jason Sams8c880902010-06-15 12:15:57 -0700405 { "_Z17rsgDrawSimpleMesh7rs_mesh", (void *)&SC_drawSimpleMesh },
406 { "_Z17rsgDrawSimpleMesh7rs_meshii", (void *)&SC_drawSimpleMeshRange },
Jason Sams22fa3712010-05-19 17:22:57 -0700407
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700408 { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_drawMesh },
409 { "_Z11rsgDrawMesh7rs_meshi", (void *)&SC_drawMeshPrimitive },
410 { "_Z11rsgDrawMesh7rs_meshiii", (void *)&SC_drawMeshPrimitiveRange },
411
Jason Sams22fa3712010-05-19 17:22:57 -0700412 { "rsgClearColor", (void *)&SC_ClearColor },
413 { "rsgClearDepth", (void *)&SC_ClearDepth },
414
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700415 { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText },
416 { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc },
417
418 { "rsgBindFont", (void *)&SC_BindFont },
419
Jason Sams22fa3712010-05-19 17:22:57 -0700420
421 //////////////////////////////////////
Jason Samsaeb094b2010-05-18 13:35:45 -0700422 // IO
423 { "updateSimpleMesh", (void *)&SC_updateSimpleMesh },
424
Jason Samsaeb094b2010-05-18 13:35:45 -0700425 // misc
Jason Samsaeb094b2010-05-18 13:35:45 -0700426 { "color", (void *)&SC_color },
Jason Samsaeb094b2010-05-18 13:35:45 -0700427
Jason Samsaeb094b2010-05-18 13:35:45 -0700428 { NULL, NULL }
429};
430
431const ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolGL(const char *sym)
432{
433 ScriptCState::SymbolTable_t *syms = gSyms;
434
435 while (syms->mPtr) {
436 if (!strcmp(syms->mName, sym)) {
437 return syms;
438 }
439 syms++;
440 }
441 return NULL;
442}
443