blob: 21d792cb10a32c34e1f182bfa31f86f5b35d67cf [file] [log] [blame]
Jason Sams326e0dd2009-05-22 14:03:28 -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"
20
Jack Palevich1ef8b802009-05-28 15:53:04 -070021#include "acc/acc.h"
Jason Samsa4a54e42009-06-10 18:39:40 -070022#include "utils/String8.h"
Jack Palevich1ef8b802009-05-28 15:53:04 -070023
Jason Sams1aa5a4e2009-06-22 17:15:15 -070024#include <GLES/gl.h>
25#include <GLES/glext.h>
26
Jason Sams326e0dd2009-05-22 14:03:28 -070027using namespace android;
28using namespace android::renderscript;
29
Jason Samse5769102009-06-19 16:03:18 -070030#define GET_TLS() Context::ScriptTLSStruct * tls = \
31 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
32 Context * rsc = tls->mContext; \
33 ScriptC * sc = (ScriptC *) tls->mScript
34
Jason Sams326e0dd2009-05-22 14:03:28 -070035
36ScriptC::ScriptC()
37{
Jack Palevich1ef8b802009-05-28 15:53:04 -070038 mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -070039 memset(&mProgram, 0, sizeof(mProgram));
Jason Sams326e0dd2009-05-22 14:03:28 -070040}
41
42ScriptC::~ScriptC()
43{
Jack Palevich1ef8b802009-05-28 15:53:04 -070044 if (mAccScript) {
45 accDeleteScript(mAccScript);
46 }
Jason Sams326e0dd2009-05-22 14:03:28 -070047}
48
Jason Sams36e0bc42009-06-19 18:33:44 -070049extern "C" float fixedToFloat(int32_t f)
50{
51 return ((float)f) / 0x10000;
52}
53
54extern "C" float intToFloat(int32_t f)
55{
56 return (float)f;
57}
58
Jason Samse5769102009-06-19 16:03:18 -070059extern "C" void matrixLoadIdentity(rsc_Matrix *mat)
Jason Sams326e0dd2009-05-22 14:03:28 -070060{
61 Matrix *m = reinterpret_cast<Matrix *>(mat);
62 m->loadIdentity();
63}
64
Jason Samse5769102009-06-19 16:03:18 -070065extern "C" void matrixLoadFloat(rsc_Matrix *mat, const float *f)
Jason Sams326e0dd2009-05-22 14:03:28 -070066{
67 Matrix *m = reinterpret_cast<Matrix *>(mat);
68 m->load(f);
69}
70
Jason Samse5769102009-06-19 16:03:18 -070071extern "C" void matrixLoadMat(rsc_Matrix *mat, const rsc_Matrix *newmat)
Jason Sams326e0dd2009-05-22 14:03:28 -070072{
73 Matrix *m = reinterpret_cast<Matrix *>(mat);
74 m->load(reinterpret_cast<const Matrix *>(newmat));
75}
76
Jason Samse5769102009-06-19 16:03:18 -070077extern "C" void matrixLoadRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070078{
79 Matrix *m = reinterpret_cast<Matrix *>(mat);
80 m->loadRotate(rot, x, y, z);
81}
82
Jason Samse5769102009-06-19 16:03:18 -070083extern "C" void matrixLoadScale(rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070084{
85 Matrix *m = reinterpret_cast<Matrix *>(mat);
86 m->loadScale(x, y, z);
87}
88
Jason Samse5769102009-06-19 16:03:18 -070089extern "C" void matrixLoadTranslate(rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070090{
91 Matrix *m = reinterpret_cast<Matrix *>(mat);
92 m->loadTranslate(x, y, z);
93}
94
Jason Samse5769102009-06-19 16:03:18 -070095extern "C" void matrixLoadMultiply(rsc_Matrix *mat, const rsc_Matrix *lhs, const rsc_Matrix *rhs)
Jason Sams326e0dd2009-05-22 14:03:28 -070096{
97 Matrix *m = reinterpret_cast<Matrix *>(mat);
98 m->loadMultiply(reinterpret_cast<const Matrix *>(lhs),
99 reinterpret_cast<const Matrix *>(rhs));
100}
101
Jason Samse5769102009-06-19 16:03:18 -0700102extern "C" void matrixMultiply(rsc_Matrix *mat, const rsc_Matrix *rhs)
Jason Sams326e0dd2009-05-22 14:03:28 -0700103{
104 Matrix *m = reinterpret_cast<Matrix *>(mat);
105 m->multiply(reinterpret_cast<const Matrix *>(rhs));
106}
107
Jason Samse5769102009-06-19 16:03:18 -0700108extern "C" void matrixRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -0700109{
110 Matrix *m = reinterpret_cast<Matrix *>(mat);
111 m->rotate(rot, x, y, z);
112}
113
Jason Samse5769102009-06-19 16:03:18 -0700114extern "C" void matrixScale(rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -0700115{
116 Matrix *m = reinterpret_cast<Matrix *>(mat);
117 m->scale(x, y, z);
118}
119
Jason Samse5769102009-06-19 16:03:18 -0700120extern "C" void matrixTranslate(rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -0700121{
122 Matrix *m = reinterpret_cast<Matrix *>(mat);
123 m->translate(x, y, z);
124}
125
126
Jason Samse5769102009-06-19 16:03:18 -0700127extern "C" const void * loadVp(uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-05-22 14:03:28 -0700128{
Jason Samse5769102009-06-19 16:03:18 -0700129 GET_TLS();
130 return &static_cast<const uint8_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Sams326e0dd2009-05-22 14:03:28 -0700131}
132
Jason Sams29df66f2009-07-16 15:08:06 -0700133static float SC_loadF(uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-05-22 14:03:28 -0700134{
Jason Samse5769102009-06-19 16:03:18 -0700135 GET_TLS();
Jason Samsfd10b712009-07-15 18:35:54 -0700136 float f = static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset];
137 //LOGE("loadF %i %i = %f %x", bank, offset, f, ((int *)&f)[0]);
138 return f;
Jason Sams326e0dd2009-05-22 14:03:28 -0700139}
140
Jason Sams29df66f2009-07-16 15:08:06 -0700141static int32_t SC_loadI32(uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-05-22 14:03:28 -0700142{
Jason Samse5769102009-06-19 16:03:18 -0700143 GET_TLS();
Jason Samsfd10b712009-07-15 18:35:54 -0700144 int32_t t = static_cast<const int32_t *>(sc->mSlots[bank]->getPtr())[offset];
145 //LOGE("loadI32 %i %i = %i", bank, offset, t);
146 return t;
Jason Sams326e0dd2009-05-22 14:03:28 -0700147}
148
Jason Sams29df66f2009-07-16 15:08:06 -0700149static uint32_t SC_loadU32(uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-05-22 14:03:28 -0700150{
Jason Samse5769102009-06-19 16:03:18 -0700151 GET_TLS();
152 return static_cast<const uint32_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Sams326e0dd2009-05-22 14:03:28 -0700153}
154
Jason Samse5769102009-06-19 16:03:18 -0700155extern "C" void loadEnvVec4(uint32_t bank, uint32_t offset, rsc_Vector4 *v)
Jason Sams326e0dd2009-05-22 14:03:28 -0700156{
Jason Samse5769102009-06-19 16:03:18 -0700157 GET_TLS();
158 memcpy(v, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Vector4));
Jason Sams326e0dd2009-05-22 14:03:28 -0700159}
160
Jason Samse5769102009-06-19 16:03:18 -0700161extern "C" void loadEnvMatrix(uint32_t bank, uint32_t offset, rsc_Matrix *m)
Jason Sams326e0dd2009-05-22 14:03:28 -0700162{
Jason Samse5769102009-06-19 16:03:18 -0700163 GET_TLS();
164 memcpy(m, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Matrix));
Jason Sams326e0dd2009-05-22 14:03:28 -0700165}
166
167
Jason Sams29df66f2009-07-16 15:08:06 -0700168static void SC_storeF(uint32_t bank, uint32_t offset, float v)
Jason Sams326e0dd2009-05-22 14:03:28 -0700169{
Jason Samsfd10b712009-07-15 18:35:54 -0700170 //LOGE("storeF %i %i %f", bank, offset, v);
Jason Samse5769102009-06-19 16:03:18 -0700171 GET_TLS();
172 static_cast<float *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700173}
174
Jason Sams29df66f2009-07-16 15:08:06 -0700175static void SC_storeI32(uint32_t bank, uint32_t offset, int32_t v)
Jason Sams326e0dd2009-05-22 14:03:28 -0700176{
Jason Samse5769102009-06-19 16:03:18 -0700177 GET_TLS();
178 static_cast<int32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700179}
180
Jason Sams29df66f2009-07-16 15:08:06 -0700181static void SC_storeU32(uint32_t bank, uint32_t offset, uint32_t v)
Jason Sams326e0dd2009-05-22 14:03:28 -0700182{
Jason Samse5769102009-06-19 16:03:18 -0700183 GET_TLS();
184 static_cast<uint32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700185}
186
Jason Samse5769102009-06-19 16:03:18 -0700187extern "C" void storeEnvVec4(uint32_t bank, uint32_t offset, const rsc_Vector4 *v)
Jason Sams326e0dd2009-05-22 14:03:28 -0700188{
Jason Samse5769102009-06-19 16:03:18 -0700189 GET_TLS();
190 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], v, sizeof(rsc_Vector4));
Jason Sams326e0dd2009-05-22 14:03:28 -0700191}
192
Jason Samse5769102009-06-19 16:03:18 -0700193extern "C" void storeEnvMatrix(uint32_t bank, uint32_t offset, const rsc_Matrix *m)
Jason Sams326e0dd2009-05-22 14:03:28 -0700194{
Jason Samse5769102009-06-19 16:03:18 -0700195 GET_TLS();
196 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], m, sizeof(rsc_Matrix));
Jason Sams326e0dd2009-05-22 14:03:28 -0700197}
198
199
Jason Samse5769102009-06-19 16:03:18 -0700200extern "C" void color(float r, float g, float b, float a)
Jason Sams326e0dd2009-05-22 14:03:28 -0700201{
Jason Sams326e0dd2009-05-22 14:03:28 -0700202 glColor4f(r, g, b, a);
203}
204
Jason Samse5769102009-06-19 16:03:18 -0700205extern "C" void renderTriangleMesh(RsTriangleMesh mesh)
Jason Sams326e0dd2009-05-22 14:03:28 -0700206{
Jason Samse5769102009-06-19 16:03:18 -0700207 GET_TLS();
208 rsi_TriangleMeshRender(rsc, mesh);
Jason Sams326e0dd2009-05-22 14:03:28 -0700209}
210
Jason Samse5769102009-06-19 16:03:18 -0700211extern "C" void renderTriangleMeshRange(RsTriangleMesh mesh, uint32_t start, uint32_t count)
Jason Sams326e0dd2009-05-22 14:03:28 -0700212{
Jason Samse5769102009-06-19 16:03:18 -0700213 GET_TLS();
214 rsi_TriangleMeshRenderRange(rsc, mesh, start, count);
Jason Sams326e0dd2009-05-22 14:03:28 -0700215}
216
Jason Samse5769102009-06-19 16:03:18 -0700217extern "C" void materialDiffuse(float r, float g, float b, float a)
Jason Sams326e0dd2009-05-22 14:03:28 -0700218{
Jason Sams326e0dd2009-05-22 14:03:28 -0700219 float v[] = {r, g, b, a};
220 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, v);
221}
222
Jason Samse5769102009-06-19 16:03:18 -0700223extern "C" void materialSpecular(float r, float g, float b, float a)
Jason Sams326e0dd2009-05-22 14:03:28 -0700224{
Jason Sams326e0dd2009-05-22 14:03:28 -0700225 float v[] = {r, g, b, a};
226 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, v);
227}
228
Jason Samse5769102009-06-19 16:03:18 -0700229extern "C" void lightPosition(float x, float y, float z, float w)
Jason Sams326e0dd2009-05-22 14:03:28 -0700230{
Jason Sams326e0dd2009-05-22 14:03:28 -0700231 float v[] = {x, y, z, w};
232 glLightfv(GL_LIGHT0, GL_POSITION, v);
233}
234
Jason Samse5769102009-06-19 16:03:18 -0700235extern "C" void materialShininess(float s)
Jason Sams326e0dd2009-05-22 14:03:28 -0700236{
Jason Sams326e0dd2009-05-22 14:03:28 -0700237 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &s);
238}
239
Jason Samse5769102009-06-19 16:03:18 -0700240extern "C" void uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
Jason Sams326e0dd2009-05-22 14:03:28 -0700241{
Jason Samse5769102009-06-19 16:03:18 -0700242 GET_TLS();
243 rsi_AllocationUploadToTexture(rsc, va, baseMipLevel);
Jason Sams326e0dd2009-05-22 14:03:28 -0700244}
245
Jason Samse5769102009-06-19 16:03:18 -0700246extern "C" void enable(uint32_t p)
Jason Sams326e0dd2009-05-22 14:03:28 -0700247{
Jason Sams326e0dd2009-05-22 14:03:28 -0700248 glEnable(p);
249}
250
Jason Samse5769102009-06-19 16:03:18 -0700251extern "C" void disable(uint32_t p)
Jason Sams326e0dd2009-05-22 14:03:28 -0700252{
Jason Sams326e0dd2009-05-22 14:03:28 -0700253 glDisable(p);
254}
255
Jason Samse5769102009-06-19 16:03:18 -0700256extern "C" uint32_t scriptRand(uint32_t max)
Jason Sams326e0dd2009-05-22 14:03:28 -0700257{
258 return (uint32_t)(((float)rand()) * max / RAND_MAX);
259}
260
261// Assumes (GL_FIXED) x,y,z (GL_UNSIGNED_BYTE)r,g,b,a
Jason Samse5769102009-06-19 16:03:18 -0700262extern "C" void drawTriangleArray(RsAllocation alloc, uint32_t count)
Jason Sams326e0dd2009-05-22 14:03:28 -0700263{
Jason Samse5769102009-06-19 16:03:18 -0700264 GET_TLS();
265
Jason Sams326e0dd2009-05-22 14:03:28 -0700266 const Allocation *a = (const Allocation *)alloc;
267 const uint32_t *ptr = (const uint32_t *)a->getPtr();
268
Jason Samse5769102009-06-19 16:03:18 -0700269 rsc->setupCheck();
Jason Sams326e0dd2009-05-22 14:03:28 -0700270
271 glBindBuffer(GL_ARRAY_BUFFER, 0);
272 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
273
274 glEnableClientState(GL_VERTEX_ARRAY);
275 glDisableClientState(GL_NORMAL_ARRAY);
276 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
277 glEnableClientState(GL_COLOR_ARRAY);
278
279 glVertexPointer(2, GL_FIXED, 12, ptr + 1);
280 //glTexCoordPointer(2, GL_FIXED, 24, ptr + 1);
281 glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
282
283 glDrawArrays(GL_TRIANGLES, 0, count * 3);
284}
285
Jason Samse5769102009-06-19 16:03:18 -0700286extern "C" void drawRect(int32_t x1, int32_t x2, int32_t y1, int32_t y2)
Jason Sams6678e9b2009-05-27 14:45:32 -0700287{
Jason Samse5769102009-06-19 16:03:18 -0700288 GET_TLS();
Jason Sams6678e9b2009-05-27 14:45:32 -0700289 x1 = (x1 << 16);
290 x2 = (x2 << 16);
291 y1 = (y1 << 16);
292 y2 = (y2 << 16);
293
294 int32_t vtx[] = {x1,y1, x1,y2, x2,y1, x2,y2};
295 static const int32_t tex[] = {0,0, 0,0x10000, 0x10000,0, 0x10000,0x10000};
296
297
Jason Samse5769102009-06-19 16:03:18 -0700298 rsc->setupCheck();
Jason Sams6678e9b2009-05-27 14:45:32 -0700299
300 glBindBuffer(GL_ARRAY_BUFFER, 0);
301 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
302
303 glEnableClientState(GL_VERTEX_ARRAY);
304 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
305 glDisableClientState(GL_NORMAL_ARRAY);
306 glDisableClientState(GL_COLOR_ARRAY);
307
308 glVertexPointer(2, GL_FIXED, 8, vtx);
309 glTexCoordPointer(2, GL_FIXED, 8, tex);
310 //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
311
312 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
313}
314
Jason Sams29df66f2009-07-16 15:08:06 -0700315static void SC_drawQuad(float x1, float y1, float z1,
316 float x2, float y2, float z2,
317 float x3, float y3, float z3,
318 float x4, float y4, float z4)
Jason Samsfd10b712009-07-15 18:35:54 -0700319{
320 GET_TLS();
321
322 //LOGE("Quad");
323 //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
324 //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
325 //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
326 //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
327
328 float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
329 static const float tex[] = {0,0, 0,1, 1,1, 1,0};
330
331
332 rsc->setupCheck();
333
334 glBindBuffer(GL_ARRAY_BUFFER, 0);
335 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
336
337 glEnableClientState(GL_VERTEX_ARRAY);
338 glVertexPointer(3, GL_FLOAT, 0, vtx);
339
340 glClientActiveTexture(GL_TEXTURE0);
341 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
342 glTexCoordPointer(2, GL_FLOAT, 0, tex);
343 glClientActiveTexture(GL_TEXTURE1);
344 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
345 glTexCoordPointer(2, GL_FLOAT, 0, tex);
346 glClientActiveTexture(GL_TEXTURE0);
347
348 glDisableClientState(GL_NORMAL_ARRAY);
349 glDisableClientState(GL_COLOR_ARRAY);
350
351 //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
352
353 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
354}
355
Jason Samsf94ca512009-07-01 16:41:34 -0700356extern "C" void drawQuad(int32_t x1, int32_t y1, int32_t z1,
357 int32_t x2, int32_t y2, int32_t z2,
358 int32_t x3, int32_t y3, int32_t z3,
359 int32_t x4, int32_t y4, int32_t z4)
360{
361 GET_TLS();
362 //x1 = (x1 << 16);
363 //x2 = (x2 << 16);
364 //y1 = (y1 << 16);
365 //y2 = (y2 << 16);
366
367 //LOGE("Quad");
368 //LOGE("0x%08x, 0x%08x, 0x%08x", x1, y1, z1);
369 //LOGE("0x%08x, 0x%08x, 0x%08x", x2, y2, z2);
370 //LOGE("0x%08x, 0x%08x, 0x%08x", x3, y3, z3);
371 //LOGE("0x%08x, 0x%08x, 0x%08x", x4, y4, z4);
372
Jason Samsb9fb9002009-07-01 20:17:07 -0700373 int32_t vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
374 static const int32_t tex[] = {0,0, 0,0x10000, 0x10000,0x10000, 0x10000,0};
Jason Samsf94ca512009-07-01 16:41:34 -0700375
376
377 rsc->setupCheck();
378
379 glBindBuffer(GL_ARRAY_BUFFER, 0);
380 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
381
382 glEnableClientState(GL_VERTEX_ARRAY);
Jason Sams334fd9a2009-07-02 15:09:27 -0700383 glVertexPointer(3, GL_FIXED, 0, vtx);
384
385 glClientActiveTexture(GL_TEXTURE0);
Jason Samsf94ca512009-07-01 16:41:34 -0700386 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
Jason Sams334fd9a2009-07-02 15:09:27 -0700387 glTexCoordPointer(2, GL_FIXED, 0, tex);
388 glClientActiveTexture(GL_TEXTURE1);
389 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
390 glTexCoordPointer(2, GL_FIXED, 0, tex);
391 glClientActiveTexture(GL_TEXTURE0);
392
Jason Samsf94ca512009-07-01 16:41:34 -0700393 glDisableClientState(GL_NORMAL_ARRAY);
394 glDisableClientState(GL_COLOR_ARRAY);
395
Jason Samsf94ca512009-07-01 16:41:34 -0700396 //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
397
398 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
399}
400
401extern "C" int32_t sinx(int32_t angle)
402{
403 float a = ((float)angle) / 0x10000;
404 a *= 3.14f / 180.f;
405 float s = (float)sin(a);
406 return int32_t(s * 0x10000);
407}
408
409extern "C" int32_t cosx(int32_t angle)
410{
411 float a = ((float)angle) / 0x10000;
412 a *= 3.14f / 180.f;
413 float s = (float)cos(a);
414 return int32_t(s * 0x10000);
415}
416
Jason Samsfd10b712009-07-15 18:35:54 -0700417extern "C" float sinf(float angle)
418{
419 float s = (float)sin(angle);
420 return s;
421}
422
423extern "C" float cosf(float angle)
424{
425 float s = (float)cos(angle);
426 return s;
427}
428
429extern "C" void pfClearColor(float r, float g, float b, float a)
430{
431 //LOGE("c %f %f %f %f", r, g, b, a);
432 GET_TLS();
433 sc->mEnviroment.mClearColor[0] = r;
434 sc->mEnviroment.mClearColor[1] = g;
435 sc->mEnviroment.mClearColor[2] = b;
436 sc->mEnviroment.mClearColor[3] = a;
437}
438
Jason Samse5769102009-06-19 16:03:18 -0700439extern "C" void pfBindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
Jason Sams326e0dd2009-05-22 14:03:28 -0700440{
Jason Samse5769102009-06-19 16:03:18 -0700441 GET_TLS();
442 rsi_ProgramFragmentBindTexture(rsc,
Jason Sams326e0dd2009-05-22 14:03:28 -0700443 static_cast<ProgramFragment *>(vpf),
444 slot,
445 static_cast<Allocation *>(va));
446
447}
448
Jason Samse5769102009-06-19 16:03:18 -0700449extern "C" void pfBindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
Jason Sams326e0dd2009-05-22 14:03:28 -0700450{
Jason Samse5769102009-06-19 16:03:18 -0700451 GET_TLS();
452 rsi_ProgramFragmentBindSampler(rsc,
Jason Sams326e0dd2009-05-22 14:03:28 -0700453 static_cast<ProgramFragment *>(vpf),
454 slot,
455 static_cast<Sampler *>(vs));
456
457}
458
Jason Samse5769102009-06-19 16:03:18 -0700459extern "C" void contextBindProgramFragmentStore(RsProgramFragmentStore pfs)
Jason Sams326e0dd2009-05-22 14:03:28 -0700460{
Jason Samse5769102009-06-19 16:03:18 -0700461 GET_TLS();
462 rsi_ContextBindProgramFragmentStore(rsc, pfs);
Jason Sams326e0dd2009-05-22 14:03:28 -0700463
464}
465
Jason Samse5769102009-06-19 16:03:18 -0700466extern "C" void contextBindProgramFragment(RsProgramFragment pf)
Jason Sams326e0dd2009-05-22 14:03:28 -0700467{
Jason Samse5769102009-06-19 16:03:18 -0700468 GET_TLS();
469 rsi_ContextBindProgramFragment(rsc, pf);
Jason Sams326e0dd2009-05-22 14:03:28 -0700470
471}
472
473
474static rsc_FunctionTable scriptCPtrTable = {
475 loadVp,
Jason Sams29df66f2009-07-16 15:08:06 -0700476 SC_loadF,
477 SC_loadI32,
478 SC_loadU32,
Jason Sams326e0dd2009-05-22 14:03:28 -0700479 loadEnvVec4,
480 loadEnvMatrix,
481
Jason Sams29df66f2009-07-16 15:08:06 -0700482 SC_storeF,
483 SC_storeI32,
484 SC_storeU32,
Jason Sams326e0dd2009-05-22 14:03:28 -0700485 storeEnvVec4,
486 storeEnvMatrix,
487
488 matrixLoadIdentity,
489 matrixLoadFloat,
490 matrixLoadMat,
491 matrixLoadRotate,
492 matrixLoadScale,
493 matrixLoadTranslate,
494 matrixLoadMultiply,
495 matrixMultiply,
496 matrixRotate,
497 matrixScale,
498 matrixTranslate,
499
500 color,
Jason Sams326e0dd2009-05-22 14:03:28 -0700501
502 pfBindTexture,
503 pfBindSampler,
504
505 materialDiffuse,
506 materialSpecular,
507 lightPosition,
508 materialShininess,
509 uploadToTexture,
510 enable,
511 disable,
512
513 scriptRand,
Jason Sams326e0dd2009-05-22 14:03:28 -0700514 contextBindProgramFragment,
Jason Sams6678e9b2009-05-27 14:45:32 -0700515 contextBindProgramFragmentStore,
516
517
518 renderTriangleMesh,
519 renderTriangleMeshRange,
520
521 drawTriangleArray,
522 drawRect
523
Jason Sams326e0dd2009-05-22 14:03:28 -0700524};
525
526
Jason Samse5769102009-06-19 16:03:18 -0700527bool ScriptC::run(Context *rsc, uint32_t launchIndex)
Jason Sams326e0dd2009-05-22 14:03:28 -0700528{
Jason Samse5769102009-06-19 16:03:18 -0700529 Context::ScriptTLSStruct * tls =
530 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700531
532 if (mEnviroment.mFragmentStore.get()) {
533 rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
534 }
535 if (mEnviroment.mFragment.get()) {
536 rsc->setFragment(mEnviroment.mFragment.get());
537 }
Jason Sams8ce125b2009-06-17 16:52:59 -0700538 if (mEnviroment.mVertex.get()) {
539 rsc->setVertex(mEnviroment.mVertex.get());
540 }
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700541
Jason Samse5769102009-06-19 16:03:18 -0700542 tls->mScript = this;
543 return mProgram.mScript(launchIndex, &scriptCPtrTable) != 0;
544 tls->mScript = NULL;
Jason Sams326e0dd2009-05-22 14:03:28 -0700545}
546
547ScriptCState::ScriptCState()
548{
549 clear();
550}
551
552ScriptCState::~ScriptCState()
553{
Jack Palevich1ef8b802009-05-28 15:53:04 -0700554 if (mAccScript) {
555 accDeleteScript(mAccScript);
556 }
Jason Sams326e0dd2009-05-22 14:03:28 -0700557}
558
559void ScriptCState::clear()
560{
Jason Samsefb8de12009-06-08 15:20:31 -0700561 memset(&mProgram, 0, sizeof(mProgram));
562
Jason Sams326e0dd2009-05-22 14:03:28 -0700563 mConstantBufferTypes.clear();
Jason Samsefb8de12009-06-08 15:20:31 -0700564
565 memset(&mEnviroment, 0, sizeof(mEnviroment));
566 mEnviroment.mClearColor[0] = 0;
567 mEnviroment.mClearColor[1] = 0;
568 mEnviroment.mClearColor[2] = 0;
569 mEnviroment.mClearColor[3] = 1;
570 mEnviroment.mClearDepth = 1;
571 mEnviroment.mClearStencil = 0;
572 mEnviroment.mIsRoot = false;
Jason Samsefb8de12009-06-08 15:20:31 -0700573
Jack Palevich1ef8b802009-05-28 15:53:04 -0700574 mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -0700575
Jason Sams1f526332009-06-05 17:35:09 -0700576}
577
Jason Sams29df66f2009-07-16 15:08:06 -0700578ScriptCState::SymbolTable_t ScriptCState::gSyms[] = {
579 { "loadI32", (void *)&SC_loadI32, "int loadI32(int, int)" },
580 { "loadF", (void *)&SC_loadF, "float loadF(int, int)" },
581 { "storeI32", (void *)&SC_storeI32, "void storeI32(int, int, int)" },
582 { "storeF", (void *)&SC_storeF, "void storeF(int, int, float)" },
583 { "drawQuad", (void *)&SC_drawQuad, "drawQuad(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4)" },
584 { "sinf", (void *)&sinf, "float sinf(float)" },
585 { "cosf", (void *)&cosf, "float cosf(float)" },
586 { "contextBindProgramFragmentStore", (void *)&contextBindProgramFragmentStore, "" },
587 { "pfClearColor", (void *)&pfClearColor, "" },
588 { "pfBindTexture", (void *)&pfBindTexture, "" },
589
590
591 { NULL, NULL, NULL }
592};
593
594const ScriptCState::SymbolTable_t * ScriptCState::lookupSymbol(const char *sym)
595{
596 ScriptCState::SymbolTable_t *syms = gSyms;
597
598 while (syms->mPtr) {
599 if (!strcmp(syms->mName, sym)) {
600 return syms;
601 }
602 syms++;
603 }
604 return NULL;
605}
606
607static ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name)
608{
609 const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
610
611 if (sym) {
612 return sym->mPtr;
613 }
614
615 LOGE("ScriptC sym lookup failed for %s", name);
616
617 // Default to calling dlsym to allow any global symbol:
618 return NULL;
619}
Jason Samsa4a54e42009-06-10 18:39:40 -0700620
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700621void ScriptCState::runCompiler(Context *rsc)
Jason Sams1f526332009-06-05 17:35:09 -0700622{
623 mAccScript = accCreateScript();
Jason Samsa4a54e42009-06-10 18:39:40 -0700624 String8 tmp;
Jason Sams1f526332009-06-05 17:35:09 -0700625
Jason Samsa4a54e42009-06-10 18:39:40 -0700626 rsc->appendNameDefines(&tmp);
627
628 const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
629 int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
630 accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
Jason Sams29df66f2009-07-16 15:08:06 -0700631 accRegisterSymbolCallback(mAccScript, symbolLookup, NULL);
Jason Sams1f526332009-06-05 17:35:09 -0700632 accCompileScript(mAccScript);
Jason Samsefb8de12009-06-08 15:20:31 -0700633 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Sams10308932009-06-09 12:15:30 -0700634 rsAssert(mProgram.mScript);
635
Jason Sams8ce125b2009-06-17 16:52:59 -0700636 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
637 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
638 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsa4a54e42009-06-10 18:39:40 -0700639
Jason Sams10308932009-06-09 12:15:30 -0700640 if (mProgram.mScript) {
641 const static int pragmaMax = 16;
642 ACCsizei pragmaCount;
643 ACCchar * str[pragmaMax];
644 accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
645
Jason Sams10308932009-06-09 12:15:30 -0700646 for (int ct=0; ct < pragmaCount; ct+=2) {
Jason Sams10308932009-06-09 12:15:30 -0700647 if (!strcmp(str[ct], "version")) {
648 continue;
Jason Sams10308932009-06-09 12:15:30 -0700649 }
650
Jason Sams10308932009-06-09 12:15:30 -0700651 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams8ce125b2009-06-17 16:52:59 -0700652 if (!strcmp(str[ct+1], "default")) {
653 continue;
654 }
655 if (!strcmp(str[ct+1], "parent")) {
656 mEnviroment.mVertex.clear();
657 continue;
658 }
659 ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
660 if (pv != NULL) {
661 mEnviroment.mVertex.set(pv);
662 continue;
663 }
Jason Sams10308932009-06-09 12:15:30 -0700664 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
665 }
666
667 if (!strcmp(str[ct], "stateRaster")) {
Jason Sams10308932009-06-09 12:15:30 -0700668 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
669 }
670
671 if (!strcmp(str[ct], "stateFragment")) {
Jason Sams8ce125b2009-06-17 16:52:59 -0700672 if (!strcmp(str[ct+1], "default")) {
673 continue;
674 }
675 if (!strcmp(str[ct+1], "parent")) {
676 mEnviroment.mFragment.clear();
677 continue;
678 }
679 ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700680 if (pf != NULL) {
681 mEnviroment.mFragment.set(pf);
Jason Sams10308932009-06-09 12:15:30 -0700682 continue;
683 }
684 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
685 }
686
687 if (!strcmp(str[ct], "stateFragmentStore")) {
Jason Sams8ce125b2009-06-17 16:52:59 -0700688 if (!strcmp(str[ct+1], "default")) {
689 continue;
690 }
691 if (!strcmp(str[ct+1], "parent")) {
692 mEnviroment.mFragmentStore.clear();
693 continue;
694 }
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700695 ProgramFragmentStore * pfs =
696 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
697 if (pfs != NULL) {
698 mEnviroment.mFragmentStore.set(pfs);
Jason Sams10308932009-06-09 12:15:30 -0700699 continue;
700 }
Jason Sams10308932009-06-09 12:15:30 -0700701 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
702 }
703
704 }
705
706
707 } else {
708 // Deal with an error.
709 }
710
Jason Sams326e0dd2009-05-22 14:03:28 -0700711}
712
713namespace android {
714namespace renderscript {
715
716void rsi_ScriptCBegin(Context * rsc)
717{
718 ScriptCState *ss = &rsc->mScriptC;
719 ss->clear();
720}
721
722void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
723{
724 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700725 ss->mEnviroment.mClearColor[0] = r;
726 ss->mEnviroment.mClearColor[1] = g;
727 ss->mEnviroment.mClearColor[2] = b;
728 ss->mEnviroment.mClearColor[3] = a;
Jason Sams326e0dd2009-05-22 14:03:28 -0700729}
730
731void rsi_ScriptCSetClearDepth(Context * rsc, float v)
732{
733 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700734 ss->mEnviroment.mClearDepth = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700735}
736
737void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
738{
739 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700740 ss->mEnviroment.mClearStencil = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700741}
742
743void rsi_ScriptCAddType(Context * rsc, RsType vt)
744{
745 ScriptCState *ss = &rsc->mScriptC;
746 ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
747}
748
Jason Samsefb8de12009-06-08 15:20:31 -0700749void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Sams326e0dd2009-05-22 14:03:28 -0700750{
751 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700752 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Sams326e0dd2009-05-22 14:03:28 -0700753}
754
755void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
756{
757 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700758 ss->mEnviroment.mIsRoot = isRoot;
Jason Sams326e0dd2009-05-22 14:03:28 -0700759}
760
Jason Sams1f526332009-06-05 17:35:09 -0700761void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
762{
763 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700764 ss->mProgram.mScriptText = text;
765 ss->mProgram.mScriptTextLength = len;
Jason Sams1f526332009-06-05 17:35:09 -0700766}
767
768
Jason Sams326e0dd2009-05-22 14:03:28 -0700769RsScript rsi_ScriptCCreate(Context * rsc)
770{
771 ScriptCState *ss = &rsc->mScriptC;
772
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700773 ss->runCompiler(rsc);
Jason Sams1f526332009-06-05 17:35:09 -0700774
Jason Sams326e0dd2009-05-22 14:03:28 -0700775 ScriptC *s = new ScriptC();
Jason Samsefb8de12009-06-08 15:20:31 -0700776 s->incRef();
Jack Palevich1ef8b802009-05-28 15:53:04 -0700777 s->mAccScript = ss->mAccScript;
778 ss->mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -0700779 s->mEnviroment = ss->mEnviroment;
780 s->mProgram = ss->mProgram;
781 ss->clear();
Jason Sams10308932009-06-09 12:15:30 -0700782
Jason Sams326e0dd2009-05-22 14:03:28 -0700783 return s;
784}
785
786}
787}
788
789