blob: 82bad7cb84868f0e11c7181559334b146c092166 [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 Sams462d11b2009-06-19 16:03:18 -0700200extern "C" void 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 Sams462d11b2009-06-19 16:03:18 -0700256extern "C" uint32_t scriptRand(uint32_t max)
Jason Samsd19f10d2009-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 Sams462d11b2009-06-19 16:03:18 -0700262extern "C" void drawTriangleArray(RsAllocation alloc, uint32_t count)
Jason Samsd19f10d2009-05-22 14:03:28 -0700263{
Jason Sams462d11b2009-06-19 16:03:18 -0700264 GET_TLS();
265
Jason Samsd19f10d2009-05-22 14:03:28 -0700266 const Allocation *a = (const Allocation *)alloc;
267 const uint32_t *ptr = (const uint32_t *)a->getPtr();
268
Jason Sams462d11b2009-06-19 16:03:18 -0700269 rsc->setupCheck();
Jason Samsd19f10d2009-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 Sams462d11b2009-06-19 16:03:18 -0700286extern "C" void drawRect(int32_t x1, int32_t x2, int32_t y1, int32_t y2)
Jason Samsfe08d992009-05-27 14:45:32 -0700287{
Jason Sams462d11b2009-06-19 16:03:18 -0700288 GET_TLS();
Jason Samsfe08d992009-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 Sams462d11b2009-06-19 16:03:18 -0700298 rsc->setupCheck();
Jason Samsfe08d992009-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 Sams54440a02009-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 Samsc75a2572009-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};
Jason Samsc1ea9482009-07-16 19:09:33 -0700329 static const float tex[] = {0,1, 1,1, 1,0, 0,0};
Jason Samsc75a2572009-07-15 18:35:54 -0700330
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 Samsc75a2572009-07-15 18:35:54 -0700356extern "C" void pfClearColor(float r, float g, float b, float a)
357{
358 //LOGE("c %f %f %f %f", r, g, b, a);
359 GET_TLS();
360 sc->mEnviroment.mClearColor[0] = r;
361 sc->mEnviroment.mClearColor[1] = g;
362 sc->mEnviroment.mClearColor[2] = b;
363 sc->mEnviroment.mClearColor[3] = a;
364}
365
Jason Sams462d11b2009-06-19 16:03:18 -0700366extern "C" void pfBindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
Jason Samsd19f10d2009-05-22 14:03:28 -0700367{
Jason Sams462d11b2009-06-19 16:03:18 -0700368 GET_TLS();
369 rsi_ProgramFragmentBindTexture(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700370 static_cast<ProgramFragment *>(vpf),
371 slot,
372 static_cast<Allocation *>(va));
373
374}
375
Jason Sams462d11b2009-06-19 16:03:18 -0700376extern "C" void pfBindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700377{
Jason Sams462d11b2009-06-19 16:03:18 -0700378 GET_TLS();
379 rsi_ProgramFragmentBindSampler(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700380 static_cast<ProgramFragment *>(vpf),
381 slot,
382 static_cast<Sampler *>(vs));
383
384}
385
Jason Sams462d11b2009-06-19 16:03:18 -0700386extern "C" void contextBindProgramFragmentStore(RsProgramFragmentStore pfs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700387{
Jason Sams462d11b2009-06-19 16:03:18 -0700388 GET_TLS();
389 rsi_ContextBindProgramFragmentStore(rsc, pfs);
Jason Samsd19f10d2009-05-22 14:03:28 -0700390
391}
392
Jason Sams462d11b2009-06-19 16:03:18 -0700393extern "C" void contextBindProgramFragment(RsProgramFragment pf)
Jason Samsd19f10d2009-05-22 14:03:28 -0700394{
Jason Sams462d11b2009-06-19 16:03:18 -0700395 GET_TLS();
396 rsi_ContextBindProgramFragment(rsc, pf);
Jason Samsd19f10d2009-05-22 14:03:28 -0700397
398}
399
400
401static rsc_FunctionTable scriptCPtrTable = {
402 loadVp,
Jason Sams54440a02009-07-16 15:08:06 -0700403 SC_loadF,
404 SC_loadI32,
405 SC_loadU32,
Jason Samsd19f10d2009-05-22 14:03:28 -0700406 loadEnvVec4,
407 loadEnvMatrix,
408
Jason Sams54440a02009-07-16 15:08:06 -0700409 SC_storeF,
410 SC_storeI32,
411 SC_storeU32,
Jason Samsd19f10d2009-05-22 14:03:28 -0700412 storeEnvVec4,
413 storeEnvMatrix,
414
415 matrixLoadIdentity,
416 matrixLoadFloat,
417 matrixLoadMat,
418 matrixLoadRotate,
419 matrixLoadScale,
420 matrixLoadTranslate,
421 matrixLoadMultiply,
422 matrixMultiply,
423 matrixRotate,
424 matrixScale,
425 matrixTranslate,
426
427 color,
Jason Samsd19f10d2009-05-22 14:03:28 -0700428
429 pfBindTexture,
430 pfBindSampler,
431
432 materialDiffuse,
433 materialSpecular,
434 lightPosition,
435 materialShininess,
436 uploadToTexture,
437 enable,
438 disable,
439
440 scriptRand,
Jason Samsd19f10d2009-05-22 14:03:28 -0700441 contextBindProgramFragment,
Jason Samsfe08d992009-05-27 14:45:32 -0700442 contextBindProgramFragmentStore,
443
444
445 renderTriangleMesh,
446 renderTriangleMeshRange,
447
448 drawTriangleArray,
449 drawRect
450
Jason Samsd19f10d2009-05-22 14:03:28 -0700451};
452
453
Jason Sams462d11b2009-06-19 16:03:18 -0700454bool ScriptC::run(Context *rsc, uint32_t launchIndex)
Jason Samsd19f10d2009-05-22 14:03:28 -0700455{
Jason Sams462d11b2009-06-19 16:03:18 -0700456 Context::ScriptTLSStruct * tls =
457 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
Jason Sams3eaa3382009-06-10 15:04:38 -0700458
459 if (mEnviroment.mFragmentStore.get()) {
460 rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
461 }
462 if (mEnviroment.mFragment.get()) {
463 rsc->setFragment(mEnviroment.mFragment.get());
464 }
Jason Sams9c54bdb2009-06-17 16:52:59 -0700465 if (mEnviroment.mVertex.get()) {
466 rsc->setVertex(mEnviroment.mVertex.get());
467 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700468
Jason Sams462d11b2009-06-19 16:03:18 -0700469 tls->mScript = this;
470 return mProgram.mScript(launchIndex, &scriptCPtrTable) != 0;
471 tls->mScript = NULL;
Jason Samsd19f10d2009-05-22 14:03:28 -0700472}
473
474ScriptCState::ScriptCState()
475{
476 clear();
477}
478
479ScriptCState::~ScriptCState()
480{
Jack Palevichec5a20b2009-05-28 15:53:04 -0700481 if (mAccScript) {
482 accDeleteScript(mAccScript);
483 }
Jason Samsd19f10d2009-05-22 14:03:28 -0700484}
485
486void ScriptCState::clear()
487{
Jason Sams3a833d82009-06-08 15:20:31 -0700488 memset(&mProgram, 0, sizeof(mProgram));
489
Jason Samsd19f10d2009-05-22 14:03:28 -0700490 mConstantBufferTypes.clear();
Jason Sams3a833d82009-06-08 15:20:31 -0700491
492 memset(&mEnviroment, 0, sizeof(mEnviroment));
493 mEnviroment.mClearColor[0] = 0;
494 mEnviroment.mClearColor[1] = 0;
495 mEnviroment.mClearColor[2] = 0;
496 mEnviroment.mClearColor[3] = 1;
497 mEnviroment.mClearDepth = 1;
498 mEnviroment.mClearStencil = 0;
499 mEnviroment.mIsRoot = false;
Jason Sams3a833d82009-06-08 15:20:31 -0700500
Jack Palevichec5a20b2009-05-28 15:53:04 -0700501 mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700502
Jason Sams39ddc9502009-06-05 17:35:09 -0700503}
504
Jason Sams54440a02009-07-16 15:08:06 -0700505ScriptCState::SymbolTable_t ScriptCState::gSyms[] = {
506 { "loadI32", (void *)&SC_loadI32, "int loadI32(int, int)" },
507 { "loadF", (void *)&SC_loadF, "float loadF(int, int)" },
508 { "storeI32", (void *)&SC_storeI32, "void storeI32(int, int, int)" },
509 { "storeF", (void *)&SC_storeF, "void storeF(int, int, float)" },
Jason Sams764205c2009-07-16 17:47:40 -0700510 { "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 Sams54440a02009-07-16 15:08:06 -0700511 { "sinf", (void *)&sinf, "float sinf(float)" },
512 { "cosf", (void *)&cosf, "float cosf(float)" },
Jason Samsc1ea9482009-07-16 19:09:33 -0700513 { "fabs", (void *)&fabs, "float fabs(float)" },
Jason Sams764205c2009-07-16 17:47:40 -0700514 { "contextBindProgramFragmentStore", (void *)&contextBindProgramFragmentStore, "void contextBindProgramFragmentStore(int)" },
515 { "pfClearColor", (void *)&pfClearColor, "void pfClearColor(float, float, float, float)" },
516 { "pfBindTexture", (void *)&pfBindTexture, "void pfBindTexture(int, int, int)" },
Jason Sams54440a02009-07-16 15:08:06 -0700517
518
519 { NULL, NULL, NULL }
520};
521
522const ScriptCState::SymbolTable_t * ScriptCState::lookupSymbol(const char *sym)
523{
524 ScriptCState::SymbolTable_t *syms = gSyms;
525
526 while (syms->mPtr) {
527 if (!strcmp(syms->mName, sym)) {
528 return syms;
529 }
530 syms++;
531 }
532 return NULL;
533}
534
535static ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name)
536{
537 const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
538
539 if (sym) {
540 return sym->mPtr;
541 }
542
543 LOGE("ScriptC sym lookup failed for %s", name);
544
545 // Default to calling dlsym to allow any global symbol:
546 return NULL;
547}
Jason Samsd5680f92009-06-10 18:39:40 -0700548
Jason Sams764205c2009-07-16 17:47:40 -0700549void ScriptCState::appendDecls(String8 *str)
550{
551 ScriptCState::SymbolTable_t *syms = gSyms;
552 while (syms->mPtr) {
553 str->append(syms->mDecl);
554 str->append(";\n");
555 syms++;
556 }
557}
558
Jason Sams3eaa3382009-06-10 15:04:38 -0700559void ScriptCState::runCompiler(Context *rsc)
Jason Sams39ddc9502009-06-05 17:35:09 -0700560{
561 mAccScript = accCreateScript();
Jason Samsd5680f92009-06-10 18:39:40 -0700562 String8 tmp;
Jason Sams39ddc9502009-06-05 17:35:09 -0700563
Jason Samsd5680f92009-06-10 18:39:40 -0700564 rsc->appendNameDefines(&tmp);
Jason Sams764205c2009-07-16 17:47:40 -0700565 appendDecls(&tmp);
566 //tmp.append("#line 1\n");
Jason Samsd5680f92009-06-10 18:39:40 -0700567
568 const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
569 int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
570 accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
Jason Sams54440a02009-07-16 15:08:06 -0700571 accRegisterSymbolCallback(mAccScript, symbolLookup, NULL);
Jason Sams39ddc9502009-06-05 17:35:09 -0700572 accCompileScript(mAccScript);
Jason Sams3a833d82009-06-08 15:20:31 -0700573 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Samsda423d82009-06-09 12:15:30 -0700574 rsAssert(mProgram.mScript);
575
Jason Sams764205c2009-07-16 17:47:40 -0700576 if (!mProgram.mScript) {
577 ACCchar buf[4096];
578 ACCsizei len;
579 accGetScriptInfoLog(mAccScript, sizeof(buf), &len, buf);
580 LOGE(buf);
581
582 }
583
Jason Sams9c54bdb2009-06-17 16:52:59 -0700584 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
585 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
586 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsd5680f92009-06-10 18:39:40 -0700587
Jason Samsda423d82009-06-09 12:15:30 -0700588 if (mProgram.mScript) {
589 const static int pragmaMax = 16;
590 ACCsizei pragmaCount;
591 ACCchar * str[pragmaMax];
592 accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
593
Jason Samsda423d82009-06-09 12:15:30 -0700594 for (int ct=0; ct < pragmaCount; ct+=2) {
Jason Samsda423d82009-06-09 12:15:30 -0700595 if (!strcmp(str[ct], "version")) {
596 continue;
Jason Samsda423d82009-06-09 12:15:30 -0700597 }
598
Jason Samsda423d82009-06-09 12:15:30 -0700599 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700600 if (!strcmp(str[ct+1], "default")) {
601 continue;
602 }
603 if (!strcmp(str[ct+1], "parent")) {
604 mEnviroment.mVertex.clear();
605 continue;
606 }
607 ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
608 if (pv != NULL) {
609 mEnviroment.mVertex.set(pv);
610 continue;
611 }
Jason Samsda423d82009-06-09 12:15:30 -0700612 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
613 }
614
615 if (!strcmp(str[ct], "stateRaster")) {
Jason Samsda423d82009-06-09 12:15:30 -0700616 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
617 }
618
619 if (!strcmp(str[ct], "stateFragment")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700620 if (!strcmp(str[ct+1], "default")) {
621 continue;
622 }
623 if (!strcmp(str[ct+1], "parent")) {
624 mEnviroment.mFragment.clear();
625 continue;
626 }
627 ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
Jason Sams3eaa3382009-06-10 15:04:38 -0700628 if (pf != NULL) {
629 mEnviroment.mFragment.set(pf);
Jason Samsda423d82009-06-09 12:15:30 -0700630 continue;
631 }
632 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
633 }
634
635 if (!strcmp(str[ct], "stateFragmentStore")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700636 if (!strcmp(str[ct+1], "default")) {
637 continue;
638 }
639 if (!strcmp(str[ct+1], "parent")) {
640 mEnviroment.mFragmentStore.clear();
641 continue;
642 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700643 ProgramFragmentStore * pfs =
644 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
645 if (pfs != NULL) {
646 mEnviroment.mFragmentStore.set(pfs);
Jason Samsda423d82009-06-09 12:15:30 -0700647 continue;
648 }
Jason Samsda423d82009-06-09 12:15:30 -0700649 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
650 }
651
652 }
653
654
655 } else {
656 // Deal with an error.
657 }
658
Jason Samsd19f10d2009-05-22 14:03:28 -0700659}
660
661namespace android {
662namespace renderscript {
663
664void rsi_ScriptCBegin(Context * rsc)
665{
666 ScriptCState *ss = &rsc->mScriptC;
667 ss->clear();
668}
669
670void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
671{
672 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700673 ss->mEnviroment.mClearColor[0] = r;
674 ss->mEnviroment.mClearColor[1] = g;
675 ss->mEnviroment.mClearColor[2] = b;
676 ss->mEnviroment.mClearColor[3] = a;
Jason Samsd19f10d2009-05-22 14:03:28 -0700677}
678
679void rsi_ScriptCSetClearDepth(Context * rsc, float v)
680{
681 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700682 ss->mEnviroment.mClearDepth = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700683}
684
685void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
686{
687 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700688 ss->mEnviroment.mClearStencil = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700689}
690
691void rsi_ScriptCAddType(Context * rsc, RsType vt)
692{
693 ScriptCState *ss = &rsc->mScriptC;
694 ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
695}
696
Jason Sams3a833d82009-06-08 15:20:31 -0700697void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Samsd19f10d2009-05-22 14:03:28 -0700698{
699 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700700 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Samsd19f10d2009-05-22 14:03:28 -0700701}
702
703void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
704{
705 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700706 ss->mEnviroment.mIsRoot = isRoot;
Jason Samsd19f10d2009-05-22 14:03:28 -0700707}
708
Jason Sams39ddc9502009-06-05 17:35:09 -0700709void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
710{
711 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700712 ss->mProgram.mScriptText = text;
713 ss->mProgram.mScriptTextLength = len;
Jason Sams39ddc9502009-06-05 17:35:09 -0700714}
715
716
Jason Samsd19f10d2009-05-22 14:03:28 -0700717RsScript rsi_ScriptCCreate(Context * rsc)
718{
719 ScriptCState *ss = &rsc->mScriptC;
720
Jason Sams3eaa3382009-06-10 15:04:38 -0700721 ss->runCompiler(rsc);
Jason Sams39ddc9502009-06-05 17:35:09 -0700722
Jason Samsd19f10d2009-05-22 14:03:28 -0700723 ScriptC *s = new ScriptC();
Jason Sams3a833d82009-06-08 15:20:31 -0700724 s->incRef();
Jack Palevichec5a20b2009-05-28 15:53:04 -0700725 s->mAccScript = ss->mAccScript;
726 ss->mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700727 s->mEnviroment = ss->mEnviroment;
728 s->mProgram = ss->mProgram;
729 ss->clear();
Jason Samsda423d82009-06-09 12:15:30 -0700730
Jason Samsd19f10d2009-05-22 14:03:28 -0700731 return s;
732}
733
734}
735}
736
737