blob: e9fc4d079b9c188d0cd42c90b585c5c007cd2736 [file] [log] [blame]
Jason Samsd19f10d2009-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 Palevichec5a20b2009-05-28 15:53:04 -070021#include "acc/acc.h"
Jason Samsd5680f92009-06-10 18:39:40 -070022#include "utils/String8.h"
Jack Palevichec5a20b2009-05-28 15:53:04 -070023
Jason Sams4b962e52009-06-22 17:15:15 -070024#include <GLES/gl.h>
25#include <GLES/glext.h>
26
Jason Samsd19f10d2009-05-22 14:03:28 -070027using namespace android;
28using namespace android::renderscript;
29
Jason Sams462d11b2009-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 Samsd19f10d2009-05-22 14:03:28 -070035
36ScriptC::ScriptC()
37{
Jack Palevichec5a20b2009-05-28 15:53:04 -070038 mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -070039 memset(&mProgram, 0, sizeof(mProgram));
Jason Samsd19f10d2009-05-22 14:03:28 -070040}
41
42ScriptC::~ScriptC()
43{
Jack Palevichec5a20b2009-05-28 15:53:04 -070044 if (mAccScript) {
45 accDeleteScript(mAccScript);
46 }
Jason Samsd19f10d2009-05-22 14:03:28 -070047}
48
Jason Samsaf49c742009-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 Sams462d11b2009-06-19 16:03:18 -070059extern "C" void matrixLoadIdentity(rsc_Matrix *mat)
Jason Samsd19f10d2009-05-22 14:03:28 -070060{
61 Matrix *m = reinterpret_cast<Matrix *>(mat);
62 m->loadIdentity();
63}
64
Jason Sams462d11b2009-06-19 16:03:18 -070065extern "C" void matrixLoadFloat(rsc_Matrix *mat, const float *f)
Jason Samsd19f10d2009-05-22 14:03:28 -070066{
67 Matrix *m = reinterpret_cast<Matrix *>(mat);
68 m->load(f);
69}
70
Jason Sams462d11b2009-06-19 16:03:18 -070071extern "C" void matrixLoadMat(rsc_Matrix *mat, const rsc_Matrix *newmat)
Jason Samsd19f10d2009-05-22 14:03:28 -070072{
73 Matrix *m = reinterpret_cast<Matrix *>(mat);
74 m->load(reinterpret_cast<const Matrix *>(newmat));
75}
76
Jason Sams462d11b2009-06-19 16:03:18 -070077extern "C" void matrixLoadRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070078{
79 Matrix *m = reinterpret_cast<Matrix *>(mat);
80 m->loadRotate(rot, x, y, z);
81}
82
Jason Sams462d11b2009-06-19 16:03:18 -070083extern "C" void matrixLoadScale(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070084{
85 Matrix *m = reinterpret_cast<Matrix *>(mat);
86 m->loadScale(x, y, z);
87}
88
Jason Sams462d11b2009-06-19 16:03:18 -070089extern "C" void matrixLoadTranslate(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070090{
91 Matrix *m = reinterpret_cast<Matrix *>(mat);
92 m->loadTranslate(x, y, z);
93}
94
Jason Sams462d11b2009-06-19 16:03:18 -070095extern "C" void matrixLoadMultiply(rsc_Matrix *mat, const rsc_Matrix *lhs, const rsc_Matrix *rhs)
Jason Samsd19f10d2009-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 Sams462d11b2009-06-19 16:03:18 -0700102extern "C" void matrixMultiply(rsc_Matrix *mat, const rsc_Matrix *rhs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700103{
104 Matrix *m = reinterpret_cast<Matrix *>(mat);
105 m->multiply(reinterpret_cast<const Matrix *>(rhs));
106}
107
Jason Sams462d11b2009-06-19 16:03:18 -0700108extern "C" void matrixRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -0700109{
110 Matrix *m = reinterpret_cast<Matrix *>(mat);
111 m->rotate(rot, x, y, z);
112}
113
Jason Sams462d11b2009-06-19 16:03:18 -0700114extern "C" void matrixScale(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -0700115{
116 Matrix *m = reinterpret_cast<Matrix *>(mat);
117 m->scale(x, y, z);
118}
119
Jason Sams462d11b2009-06-19 16:03:18 -0700120extern "C" void matrixTranslate(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -0700121{
122 Matrix *m = reinterpret_cast<Matrix *>(mat);
123 m->translate(x, y, z);
124}
125
126
Jason Sams462d11b2009-06-19 16:03:18 -0700127extern "C" const void * loadVp(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700128{
Jason Sams462d11b2009-06-19 16:03:18 -0700129 GET_TLS();
130 return &static_cast<const uint8_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700131}
132
Jason Sams54440a02009-07-16 15:08:06 -0700133static float SC_loadF(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700134{
Jason Sams462d11b2009-06-19 16:03:18 -0700135 GET_TLS();
Jason Samsc75a2572009-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 Samsd19f10d2009-05-22 14:03:28 -0700139}
140
Jason Sams54440a02009-07-16 15:08:06 -0700141static int32_t SC_loadI32(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700142{
Jason Sams462d11b2009-06-19 16:03:18 -0700143 GET_TLS();
Jason Samsc75a2572009-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 Samsd19f10d2009-05-22 14:03:28 -0700147}
148
Jason Sams54440a02009-07-16 15:08:06 -0700149static uint32_t SC_loadU32(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700150{
Jason Sams462d11b2009-06-19 16:03:18 -0700151 GET_TLS();
152 return static_cast<const uint32_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700153}
154
Jason Sams462d11b2009-06-19 16:03:18 -0700155extern "C" void loadEnvVec4(uint32_t bank, uint32_t offset, rsc_Vector4 *v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700156{
Jason Sams462d11b2009-06-19 16:03:18 -0700157 GET_TLS();
158 memcpy(v, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Vector4));
Jason Samsd19f10d2009-05-22 14:03:28 -0700159}
160
Jason Sams462d11b2009-06-19 16:03:18 -0700161extern "C" void loadEnvMatrix(uint32_t bank, uint32_t offset, rsc_Matrix *m)
Jason Samsd19f10d2009-05-22 14:03:28 -0700162{
Jason Sams462d11b2009-06-19 16:03:18 -0700163 GET_TLS();
164 memcpy(m, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Matrix));
Jason Samsd19f10d2009-05-22 14:03:28 -0700165}
166
167
Jason Sams54440a02009-07-16 15:08:06 -0700168static void SC_storeF(uint32_t bank, uint32_t offset, float v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700169{
Jason Samsc75a2572009-07-15 18:35:54 -0700170 //LOGE("storeF %i %i %f", bank, offset, v);
Jason Sams462d11b2009-06-19 16:03:18 -0700171 GET_TLS();
172 static_cast<float *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700173}
174
Jason Sams54440a02009-07-16 15:08:06 -0700175static void SC_storeI32(uint32_t bank, uint32_t offset, int32_t v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700176{
Jason Sams462d11b2009-06-19 16:03:18 -0700177 GET_TLS();
178 static_cast<int32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700179}
180
Jason Sams54440a02009-07-16 15:08:06 -0700181static void SC_storeU32(uint32_t bank, uint32_t offset, uint32_t v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700182{
Jason Sams462d11b2009-06-19 16:03:18 -0700183 GET_TLS();
184 static_cast<uint32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700185}
186
Jason Sams462d11b2009-06-19 16:03:18 -0700187extern "C" void storeEnvVec4(uint32_t bank, uint32_t offset, const rsc_Vector4 *v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700188{
Jason Sams462d11b2009-06-19 16:03:18 -0700189 GET_TLS();
190 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], v, sizeof(rsc_Vector4));
Jason Samsd19f10d2009-05-22 14:03:28 -0700191}
192
Jason Sams462d11b2009-06-19 16:03:18 -0700193extern "C" void storeEnvMatrix(uint32_t bank, uint32_t offset, const rsc_Matrix *m)
Jason Samsd19f10d2009-05-22 14:03:28 -0700194{
Jason Sams462d11b2009-06-19 16:03:18 -0700195 GET_TLS();
196 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], m, sizeof(rsc_Matrix));
Jason Samsd19f10d2009-05-22 14:03:28 -0700197}
198
199
Jason Samse6c8e9b2009-07-17 17:29:09 -0700200static void SC_color(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700201{
Jason Samsd19f10d2009-05-22 14:03:28 -0700202 glColor4f(r, g, b, a);
203}
204
Jason Sams462d11b2009-06-19 16:03:18 -0700205extern "C" void renderTriangleMesh(RsTriangleMesh mesh)
Jason Samsd19f10d2009-05-22 14:03:28 -0700206{
Jason Sams462d11b2009-06-19 16:03:18 -0700207 GET_TLS();
208 rsi_TriangleMeshRender(rsc, mesh);
Jason Samsd19f10d2009-05-22 14:03:28 -0700209}
210
Jason Sams462d11b2009-06-19 16:03:18 -0700211extern "C" void renderTriangleMeshRange(RsTriangleMesh mesh, uint32_t start, uint32_t count)
Jason Samsd19f10d2009-05-22 14:03:28 -0700212{
Jason Sams462d11b2009-06-19 16:03:18 -0700213 GET_TLS();
214 rsi_TriangleMeshRenderRange(rsc, mesh, start, count);
Jason Samsd19f10d2009-05-22 14:03:28 -0700215}
216
Jason Sams462d11b2009-06-19 16:03:18 -0700217extern "C" void materialDiffuse(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700218{
Jason Samsd19f10d2009-05-22 14:03:28 -0700219 float v[] = {r, g, b, a};
220 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, v);
221}
222
Jason Sams462d11b2009-06-19 16:03:18 -0700223extern "C" void materialSpecular(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700224{
Jason Samsd19f10d2009-05-22 14:03:28 -0700225 float v[] = {r, g, b, a};
226 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, v);
227}
228
Jason Sams462d11b2009-06-19 16:03:18 -0700229extern "C" void lightPosition(float x, float y, float z, float w)
Jason Samsd19f10d2009-05-22 14:03:28 -0700230{
Jason Samsd19f10d2009-05-22 14:03:28 -0700231 float v[] = {x, y, z, w};
232 glLightfv(GL_LIGHT0, GL_POSITION, v);
233}
234
Jason Sams462d11b2009-06-19 16:03:18 -0700235extern "C" void materialShininess(float s)
Jason Samsd19f10d2009-05-22 14:03:28 -0700236{
Jason Samsd19f10d2009-05-22 14:03:28 -0700237 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &s);
238}
239
Jason Sams462d11b2009-06-19 16:03:18 -0700240extern "C" void uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
Jason Samsd19f10d2009-05-22 14:03:28 -0700241{
Jason Sams462d11b2009-06-19 16:03:18 -0700242 GET_TLS();
243 rsi_AllocationUploadToTexture(rsc, va, baseMipLevel);
Jason Samsd19f10d2009-05-22 14:03:28 -0700244}
245
Jason Sams462d11b2009-06-19 16:03:18 -0700246extern "C" void enable(uint32_t p)
Jason Samsd19f10d2009-05-22 14:03:28 -0700247{
Jason Samsd19f10d2009-05-22 14:03:28 -0700248 glEnable(p);
249}
250
Jason Sams462d11b2009-06-19 16:03:18 -0700251extern "C" void disable(uint32_t p)
Jason Samsd19f10d2009-05-22 14:03:28 -0700252{
Jason Samsd19f10d2009-05-22 14:03:28 -0700253 glDisable(p);
254}
255
Jason Samse6c8e9b2009-07-17 17:29:09 -0700256static float SC_randf(float max)
Jason Samsd19f10d2009-05-22 14:03:28 -0700257{
Jason Samse6c8e9b2009-07-17 17:29:09 -0700258 float r = (float)rand();
259 return r / RAND_MAX * max;
Jason Samsd19f10d2009-05-22 14:03:28 -0700260}
261
262// Assumes (GL_FIXED) x,y,z (GL_UNSIGNED_BYTE)r,g,b,a
Jason Samse6c8e9b2009-07-17 17:29:09 -0700263static void SC_drawTriangleArray(int ialloc, uint32_t count)
Jason Samsd19f10d2009-05-22 14:03:28 -0700264{
Jason Sams462d11b2009-06-19 16:03:18 -0700265 GET_TLS();
Jason Samse6c8e9b2009-07-17 17:29:09 -0700266 RsAllocation alloc = (RsAllocation)ialloc;
Jason Sams462d11b2009-06-19 16:03:18 -0700267
Jason Samsd19f10d2009-05-22 14:03:28 -0700268 const Allocation *a = (const Allocation *)alloc;
269 const uint32_t *ptr = (const uint32_t *)a->getPtr();
270
Jason Sams462d11b2009-06-19 16:03:18 -0700271 rsc->setupCheck();
Jason Samsd19f10d2009-05-22 14:03:28 -0700272
273 glBindBuffer(GL_ARRAY_BUFFER, 0);
274 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
275
276 glEnableClientState(GL_VERTEX_ARRAY);
277 glDisableClientState(GL_NORMAL_ARRAY);
278 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
279 glEnableClientState(GL_COLOR_ARRAY);
280
281 glVertexPointer(2, GL_FIXED, 12, ptr + 1);
282 //glTexCoordPointer(2, GL_FIXED, 24, ptr + 1);
283 glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
284
285 glDrawArrays(GL_TRIANGLES, 0, count * 3);
286}
287
Jason Sams462d11b2009-06-19 16:03:18 -0700288extern "C" void drawRect(int32_t x1, int32_t x2, int32_t y1, int32_t y2)
Jason Samsfe08d992009-05-27 14:45:32 -0700289{
Jason Sams462d11b2009-06-19 16:03:18 -0700290 GET_TLS();
Jason Samsfe08d992009-05-27 14:45:32 -0700291 x1 = (x1 << 16);
292 x2 = (x2 << 16);
293 y1 = (y1 << 16);
294 y2 = (y2 << 16);
295
296 int32_t vtx[] = {x1,y1, x1,y2, x2,y1, x2,y2};
297 static const int32_t tex[] = {0,0, 0,0x10000, 0x10000,0, 0x10000,0x10000};
298
299
Jason Sams462d11b2009-06-19 16:03:18 -0700300 rsc->setupCheck();
Jason Samsfe08d992009-05-27 14:45:32 -0700301
302 glBindBuffer(GL_ARRAY_BUFFER, 0);
303 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
304
305 glEnableClientState(GL_VERTEX_ARRAY);
306 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
307 glDisableClientState(GL_NORMAL_ARRAY);
308 glDisableClientState(GL_COLOR_ARRAY);
309
310 glVertexPointer(2, GL_FIXED, 8, vtx);
311 glTexCoordPointer(2, GL_FIXED, 8, tex);
312 //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
313
314 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
315}
316
Jason Sams54440a02009-07-16 15:08:06 -0700317static void SC_drawQuad(float x1, float y1, float z1,
318 float x2, float y2, float z2,
319 float x3, float y3, float z3,
320 float x4, float y4, float z4)
Jason Samsc75a2572009-07-15 18:35:54 -0700321{
322 GET_TLS();
323
324 //LOGE("Quad");
325 //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
326 //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
327 //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
328 //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
329
330 float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
Jason Samsc1ea9482009-07-16 19:09:33 -0700331 static const float tex[] = {0,1, 1,1, 1,0, 0,0};
Jason Samsc75a2572009-07-15 18:35:54 -0700332
333
334 rsc->setupCheck();
335
336 glBindBuffer(GL_ARRAY_BUFFER, 0);
337 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
338
339 glEnableClientState(GL_VERTEX_ARRAY);
340 glVertexPointer(3, GL_FLOAT, 0, vtx);
341
342 glClientActiveTexture(GL_TEXTURE0);
343 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
344 glTexCoordPointer(2, GL_FLOAT, 0, tex);
345 glClientActiveTexture(GL_TEXTURE1);
346 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
347 glTexCoordPointer(2, GL_FLOAT, 0, tex);
348 glClientActiveTexture(GL_TEXTURE0);
349
350 glDisableClientState(GL_NORMAL_ARRAY);
351 glDisableClientState(GL_COLOR_ARRAY);
352
353 //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
354
355 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
356}
357
Jason Samsc75a2572009-07-15 18:35:54 -0700358extern "C" void pfClearColor(float r, float g, float b, float a)
359{
360 //LOGE("c %f %f %f %f", r, g, b, a);
361 GET_TLS();
362 sc->mEnviroment.mClearColor[0] = r;
363 sc->mEnviroment.mClearColor[1] = g;
364 sc->mEnviroment.mClearColor[2] = b;
365 sc->mEnviroment.mClearColor[3] = a;
366}
367
Jason Sams462d11b2009-06-19 16:03:18 -0700368extern "C" void pfBindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
Jason Samsd19f10d2009-05-22 14:03:28 -0700369{
Jason Sams462d11b2009-06-19 16:03:18 -0700370 GET_TLS();
371 rsi_ProgramFragmentBindTexture(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700372 static_cast<ProgramFragment *>(vpf),
373 slot,
374 static_cast<Allocation *>(va));
375
376}
377
Jason Sams462d11b2009-06-19 16:03:18 -0700378extern "C" void pfBindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700379{
Jason Sams462d11b2009-06-19 16:03:18 -0700380 GET_TLS();
381 rsi_ProgramFragmentBindSampler(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700382 static_cast<ProgramFragment *>(vpf),
383 slot,
384 static_cast<Sampler *>(vs));
385
386}
387
Jason Sams462d11b2009-06-19 16:03:18 -0700388extern "C" void contextBindProgramFragmentStore(RsProgramFragmentStore pfs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700389{
Jason Sams462d11b2009-06-19 16:03:18 -0700390 GET_TLS();
391 rsi_ContextBindProgramFragmentStore(rsc, pfs);
Jason Samsd19f10d2009-05-22 14:03:28 -0700392
393}
394
Jason Sams462d11b2009-06-19 16:03:18 -0700395extern "C" void contextBindProgramFragment(RsProgramFragment pf)
Jason Samsd19f10d2009-05-22 14:03:28 -0700396{
Jason Sams462d11b2009-06-19 16:03:18 -0700397 GET_TLS();
398 rsi_ContextBindProgramFragment(rsc, pf);
Jason Samsd19f10d2009-05-22 14:03:28 -0700399
400}
401
402
Jason Samse6c8e9b2009-07-17 17:29:09 -0700403static rsc_FunctionTable scriptCPtrTable;
404/* = {
Jason Samsd19f10d2009-05-22 14:03:28 -0700405 loadVp,
Jason Sams54440a02009-07-16 15:08:06 -0700406 SC_loadF,
407 SC_loadI32,
408 SC_loadU32,
Jason Samsd19f10d2009-05-22 14:03:28 -0700409 loadEnvVec4,
410 loadEnvMatrix,
411
Jason Sams54440a02009-07-16 15:08:06 -0700412 SC_storeF,
413 SC_storeI32,
414 SC_storeU32,
Jason Samsd19f10d2009-05-22 14:03:28 -0700415 storeEnvVec4,
416 storeEnvMatrix,
417
418 matrixLoadIdentity,
419 matrixLoadFloat,
420 matrixLoadMat,
421 matrixLoadRotate,
422 matrixLoadScale,
423 matrixLoadTranslate,
424 matrixLoadMultiply,
425 matrixMultiply,
426 matrixRotate,
427 matrixScale,
428 matrixTranslate,
429
Jason Samse6c8e9b2009-07-17 17:29:09 -0700430 SC_color,
Jason Samsd19f10d2009-05-22 14:03:28 -0700431
432 pfBindTexture,
433 pfBindSampler,
434
435 materialDiffuse,
436 materialSpecular,
437 lightPosition,
438 materialShininess,
439 uploadToTexture,
440 enable,
441 disable,
442
Jason Samse6c8e9b2009-07-17 17:29:09 -0700443 SC_randf,
Jason Samsd19f10d2009-05-22 14:03:28 -0700444 contextBindProgramFragment,
Jason Samsfe08d992009-05-27 14:45:32 -0700445 contextBindProgramFragmentStore,
446
447
448 renderTriangleMesh,
449 renderTriangleMeshRange,
450
Jason Samse6c8e9b2009-07-17 17:29:09 -0700451 SC_drawTriangleArray,
Jason Samsfe08d992009-05-27 14:45:32 -0700452 drawRect
453
Jason Samsd19f10d2009-05-22 14:03:28 -0700454};
Jason Samse6c8e9b2009-07-17 17:29:09 -0700455*/
Jason Samsd19f10d2009-05-22 14:03:28 -0700456
Jason Sams462d11b2009-06-19 16:03:18 -0700457bool ScriptC::run(Context *rsc, uint32_t launchIndex)
Jason Samsd19f10d2009-05-22 14:03:28 -0700458{
Jason Sams462d11b2009-06-19 16:03:18 -0700459 Context::ScriptTLSStruct * tls =
460 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
Jason Sams3eaa3382009-06-10 15:04:38 -0700461
462 if (mEnviroment.mFragmentStore.get()) {
463 rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
464 }
465 if (mEnviroment.mFragment.get()) {
466 rsc->setFragment(mEnviroment.mFragment.get());
467 }
Jason Sams9c54bdb2009-06-17 16:52:59 -0700468 if (mEnviroment.mVertex.get()) {
469 rsc->setVertex(mEnviroment.mVertex.get());
470 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700471
Jason Sams462d11b2009-06-19 16:03:18 -0700472 tls->mScript = this;
473 return mProgram.mScript(launchIndex, &scriptCPtrTable) != 0;
474 tls->mScript = NULL;
Jason Samsd19f10d2009-05-22 14:03:28 -0700475}
476
477ScriptCState::ScriptCState()
478{
479 clear();
480}
481
482ScriptCState::~ScriptCState()
483{
Jack Palevichec5a20b2009-05-28 15:53:04 -0700484 if (mAccScript) {
485 accDeleteScript(mAccScript);
486 }
Jason Samsd19f10d2009-05-22 14:03:28 -0700487}
488
489void ScriptCState::clear()
490{
Jason Sams3a833d82009-06-08 15:20:31 -0700491 memset(&mProgram, 0, sizeof(mProgram));
492
Jason Samsd19f10d2009-05-22 14:03:28 -0700493 mConstantBufferTypes.clear();
Jason Sams3a833d82009-06-08 15:20:31 -0700494
495 memset(&mEnviroment, 0, sizeof(mEnviroment));
496 mEnviroment.mClearColor[0] = 0;
497 mEnviroment.mClearColor[1] = 0;
498 mEnviroment.mClearColor[2] = 0;
499 mEnviroment.mClearColor[3] = 1;
500 mEnviroment.mClearDepth = 1;
501 mEnviroment.mClearStencil = 0;
502 mEnviroment.mIsRoot = false;
Jason Sams3a833d82009-06-08 15:20:31 -0700503
Jack Palevichec5a20b2009-05-28 15:53:04 -0700504 mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700505
Jason Sams39ddc9502009-06-05 17:35:09 -0700506}
507
Jason Sams54440a02009-07-16 15:08:06 -0700508ScriptCState::SymbolTable_t ScriptCState::gSyms[] = {
Jason Samse6c8e9b2009-07-17 17:29:09 -0700509 // IO
Jason Sams54440a02009-07-16 15:08:06 -0700510 { "loadI32", (void *)&SC_loadI32, "int loadI32(int, int)" },
Jason Samse6c8e9b2009-07-17 17:29:09 -0700511 //{ "loadU32", (void *)&SC_loadU32, "unsigned int loadU32(int, int)" },
Jason Sams54440a02009-07-16 15:08:06 -0700512 { "loadF", (void *)&SC_loadF, "float loadF(int, int)" },
513 { "storeI32", (void *)&SC_storeI32, "void storeI32(int, int, int)" },
Jason Samse6c8e9b2009-07-17 17:29:09 -0700514 //{ "storeU32", (void *)&SC_storeU32, "void storeU32(int, int, unsigned int)" },
Jason Sams54440a02009-07-16 15:08:06 -0700515 { "storeF", (void *)&SC_storeF, "void storeF(int, int, float)" },
Jason Samse6c8e9b2009-07-17 17:29:09 -0700516
517 // math
Jason Sams54440a02009-07-16 15:08:06 -0700518 { "sinf", (void *)&sinf, "float sinf(float)" },
519 { "cosf", (void *)&cosf, "float cosf(float)" },
Jason Samsc1ea9482009-07-16 19:09:33 -0700520 { "fabs", (void *)&fabs, "float fabs(float)" },
Jason Samse6c8e9b2009-07-17 17:29:09 -0700521 { "randf", (void *)&SC_randf, "float randf(float)" },
522
523 // context
524 { "drawQuad", (void *)&SC_drawQuad, "void 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)" },
Jason Sams764205c2009-07-16 17:47:40 -0700525 { "contextBindProgramFragmentStore", (void *)&contextBindProgramFragmentStore, "void contextBindProgramFragmentStore(int)" },
526 { "pfClearColor", (void *)&pfClearColor, "void pfClearColor(float, float, float, float)" },
527 { "pfBindTexture", (void *)&pfBindTexture, "void pfBindTexture(int, int, int)" },
Jason Sams54440a02009-07-16 15:08:06 -0700528
Jason Samse6c8e9b2009-07-17 17:29:09 -0700529 { "color", (void *)&SC_color, "void color(float, float, float, float)" },
530 { "drawTriangleArray", (void *)&SC_drawTriangleArray, "void drawTriangleArray(int ialloc, int count)" },
531
Jason Sams54440a02009-07-16 15:08:06 -0700532
533 { NULL, NULL, NULL }
534};
535
536const ScriptCState::SymbolTable_t * ScriptCState::lookupSymbol(const char *sym)
537{
538 ScriptCState::SymbolTable_t *syms = gSyms;
539
540 while (syms->mPtr) {
541 if (!strcmp(syms->mName, sym)) {
542 return syms;
543 }
544 syms++;
545 }
546 return NULL;
547}
548
549static ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name)
550{
551 const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
552
553 if (sym) {
554 return sym->mPtr;
555 }
556
557 LOGE("ScriptC sym lookup failed for %s", name);
558
559 // Default to calling dlsym to allow any global symbol:
560 return NULL;
561}
Jason Samsd5680f92009-06-10 18:39:40 -0700562
Jason Sams764205c2009-07-16 17:47:40 -0700563void ScriptCState::appendDecls(String8 *str)
564{
565 ScriptCState::SymbolTable_t *syms = gSyms;
566 while (syms->mPtr) {
567 str->append(syms->mDecl);
568 str->append(";\n");
569 syms++;
570 }
571}
572
Jason Sams3eaa3382009-06-10 15:04:38 -0700573void ScriptCState::runCompiler(Context *rsc)
Jason Sams39ddc9502009-06-05 17:35:09 -0700574{
575 mAccScript = accCreateScript();
Jason Samsd5680f92009-06-10 18:39:40 -0700576 String8 tmp;
Jason Sams39ddc9502009-06-05 17:35:09 -0700577
Jason Samsd5680f92009-06-10 18:39:40 -0700578 rsc->appendNameDefines(&tmp);
Jason Sams764205c2009-07-16 17:47:40 -0700579 appendDecls(&tmp);
580 //tmp.append("#line 1\n");
Jason Samsd5680f92009-06-10 18:39:40 -0700581
582 const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
583 int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
584 accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
Jason Sams54440a02009-07-16 15:08:06 -0700585 accRegisterSymbolCallback(mAccScript, symbolLookup, NULL);
Jason Sams39ddc9502009-06-05 17:35:09 -0700586 accCompileScript(mAccScript);
Jason Sams3a833d82009-06-08 15:20:31 -0700587 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Samsda423d82009-06-09 12:15:30 -0700588 rsAssert(mProgram.mScript);
589
Jason Sams764205c2009-07-16 17:47:40 -0700590 if (!mProgram.mScript) {
591 ACCchar buf[4096];
592 ACCsizei len;
593 accGetScriptInfoLog(mAccScript, sizeof(buf), &len, buf);
594 LOGE(buf);
595
596 }
597
Jason Sams9c54bdb2009-06-17 16:52:59 -0700598 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
599 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
600 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsd5680f92009-06-10 18:39:40 -0700601
Jason Samsda423d82009-06-09 12:15:30 -0700602 if (mProgram.mScript) {
603 const static int pragmaMax = 16;
604 ACCsizei pragmaCount;
605 ACCchar * str[pragmaMax];
606 accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
607
Jason Samsda423d82009-06-09 12:15:30 -0700608 for (int ct=0; ct < pragmaCount; ct+=2) {
Jason Samsda423d82009-06-09 12:15:30 -0700609 if (!strcmp(str[ct], "version")) {
610 continue;
Jason Samsda423d82009-06-09 12:15:30 -0700611 }
612
Jason Samsda423d82009-06-09 12:15:30 -0700613 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700614 if (!strcmp(str[ct+1], "default")) {
615 continue;
616 }
617 if (!strcmp(str[ct+1], "parent")) {
618 mEnviroment.mVertex.clear();
619 continue;
620 }
621 ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
622 if (pv != NULL) {
623 mEnviroment.mVertex.set(pv);
624 continue;
625 }
Jason Samsda423d82009-06-09 12:15:30 -0700626 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
627 }
628
629 if (!strcmp(str[ct], "stateRaster")) {
Jason Samsda423d82009-06-09 12:15:30 -0700630 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
631 }
632
633 if (!strcmp(str[ct], "stateFragment")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700634 if (!strcmp(str[ct+1], "default")) {
635 continue;
636 }
637 if (!strcmp(str[ct+1], "parent")) {
638 mEnviroment.mFragment.clear();
639 continue;
640 }
641 ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
Jason Sams3eaa3382009-06-10 15:04:38 -0700642 if (pf != NULL) {
643 mEnviroment.mFragment.set(pf);
Jason Samsda423d82009-06-09 12:15:30 -0700644 continue;
645 }
646 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
647 }
648
649 if (!strcmp(str[ct], "stateFragmentStore")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700650 if (!strcmp(str[ct+1], "default")) {
651 continue;
652 }
653 if (!strcmp(str[ct+1], "parent")) {
654 mEnviroment.mFragmentStore.clear();
655 continue;
656 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700657 ProgramFragmentStore * pfs =
658 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
659 if (pfs != NULL) {
660 mEnviroment.mFragmentStore.set(pfs);
Jason Samsda423d82009-06-09 12:15:30 -0700661 continue;
662 }
Jason Samsda423d82009-06-09 12:15:30 -0700663 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
664 }
665
666 }
667
668
669 } else {
670 // Deal with an error.
671 }
672
Jason Samsd19f10d2009-05-22 14:03:28 -0700673}
674
675namespace android {
676namespace renderscript {
677
678void rsi_ScriptCBegin(Context * rsc)
679{
680 ScriptCState *ss = &rsc->mScriptC;
681 ss->clear();
682}
683
684void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
685{
686 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700687 ss->mEnviroment.mClearColor[0] = r;
688 ss->mEnviroment.mClearColor[1] = g;
689 ss->mEnviroment.mClearColor[2] = b;
690 ss->mEnviroment.mClearColor[3] = a;
Jason Samsd19f10d2009-05-22 14:03:28 -0700691}
692
693void rsi_ScriptCSetClearDepth(Context * rsc, float v)
694{
695 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700696 ss->mEnviroment.mClearDepth = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700697}
698
699void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
700{
701 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700702 ss->mEnviroment.mClearStencil = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700703}
704
705void rsi_ScriptCAddType(Context * rsc, RsType vt)
706{
707 ScriptCState *ss = &rsc->mScriptC;
708 ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
709}
710
Jason Sams3a833d82009-06-08 15:20:31 -0700711void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Samsd19f10d2009-05-22 14:03:28 -0700712{
713 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700714 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Samsd19f10d2009-05-22 14:03:28 -0700715}
716
717void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
718{
719 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700720 ss->mEnviroment.mIsRoot = isRoot;
Jason Samsd19f10d2009-05-22 14:03:28 -0700721}
722
Jason Sams39ddc9502009-06-05 17:35:09 -0700723void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
724{
725 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700726 ss->mProgram.mScriptText = text;
727 ss->mProgram.mScriptTextLength = len;
Jason Sams39ddc9502009-06-05 17:35:09 -0700728}
729
730
Jason Samsd19f10d2009-05-22 14:03:28 -0700731RsScript rsi_ScriptCCreate(Context * rsc)
732{
733 ScriptCState *ss = &rsc->mScriptC;
734
Jason Sams3eaa3382009-06-10 15:04:38 -0700735 ss->runCompiler(rsc);
Jason Sams39ddc9502009-06-05 17:35:09 -0700736
Jason Samsd19f10d2009-05-22 14:03:28 -0700737 ScriptC *s = new ScriptC();
Jason Sams3a833d82009-06-08 15:20:31 -0700738 s->incRef();
Jack Palevichec5a20b2009-05-28 15:53:04 -0700739 s->mAccScript = ss->mAccScript;
740 ss->mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700741 s->mEnviroment = ss->mEnviroment;
742 s->mProgram = ss->mProgram;
743 ss->clear();
Jason Samsda423d82009-06-09 12:15:30 -0700744
Jason Samsd19f10d2009-05-22 14:03:28 -0700745 return s;
746}
747
748}
749}
750
751