blob: c19f0bb6b9fc78163a69d0f85bd49d00df5e5944 [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 Sams462d11b2009-06-19 16:03:18 -0700133extern "C" float 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 Sams462d11b2009-06-19 16:03:18 -0700141extern "C" int32_t 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 Sams462d11b2009-06-19 16:03:18 -0700149extern "C" uint32_t 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 Sams462d11b2009-06-19 16:03:18 -0700168extern "C" void 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 Sams462d11b2009-06-19 16:03:18 -0700175extern "C" void 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 Sams462d11b2009-06-19 16:03:18 -0700181extern "C" void 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 Samsc75a2572009-07-15 18:35:54 -0700315extern "C" void drawQuadF(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)
319{
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 Samsfdcc14e2009-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 Samsaabd0092009-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 Samsfdcc14e2009-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 Sams4244afa2009-07-02 15:09:27 -0700383 glVertexPointer(3, GL_FIXED, 0, vtx);
384
385 glClientActiveTexture(GL_TEXTURE0);
Jason Samsfdcc14e2009-07-01 16:41:34 -0700386 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
Jason Sams4244afa2009-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 Samsfdcc14e2009-07-01 16:41:34 -0700393 glDisableClientState(GL_NORMAL_ARRAY);
394 glDisableClientState(GL_COLOR_ARRAY);
395
Jason Samsfdcc14e2009-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 Samsc75a2572009-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 Sams462d11b2009-06-19 16:03:18 -0700439extern "C" void pfBindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
Jason Samsd19f10d2009-05-22 14:03:28 -0700440{
Jason Sams462d11b2009-06-19 16:03:18 -0700441 GET_TLS();
442 rsi_ProgramFragmentBindTexture(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700443 static_cast<ProgramFragment *>(vpf),
444 slot,
445 static_cast<Allocation *>(va));
446
447}
448
Jason Sams462d11b2009-06-19 16:03:18 -0700449extern "C" void pfBindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700450{
Jason Sams462d11b2009-06-19 16:03:18 -0700451 GET_TLS();
452 rsi_ProgramFragmentBindSampler(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700453 static_cast<ProgramFragment *>(vpf),
454 slot,
455 static_cast<Sampler *>(vs));
456
457}
458
Jason Sams462d11b2009-06-19 16:03:18 -0700459extern "C" void contextBindProgramFragmentStore(RsProgramFragmentStore pfs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700460{
Jason Sams462d11b2009-06-19 16:03:18 -0700461 GET_TLS();
462 rsi_ContextBindProgramFragmentStore(rsc, pfs);
Jason Samsd19f10d2009-05-22 14:03:28 -0700463
464}
465
Jason Sams462d11b2009-06-19 16:03:18 -0700466extern "C" void contextBindProgramFragment(RsProgramFragment pf)
Jason Samsd19f10d2009-05-22 14:03:28 -0700467{
Jason Sams462d11b2009-06-19 16:03:18 -0700468 GET_TLS();
469 rsi_ContextBindProgramFragment(rsc, pf);
Jason Samsd19f10d2009-05-22 14:03:28 -0700470
471}
472
473
474static rsc_FunctionTable scriptCPtrTable = {
475 loadVp,
476 loadF,
477 loadI32,
478 loadU32,
479 loadEnvVec4,
480 loadEnvMatrix,
481
482 storeF,
483 storeI32,
484 storeU32,
485 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 Samsd19f10d2009-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 Samsd19f10d2009-05-22 14:03:28 -0700514 contextBindProgramFragment,
Jason Samsfe08d992009-05-27 14:45:32 -0700515 contextBindProgramFragmentStore,
516
517
518 renderTriangleMesh,
519 renderTriangleMeshRange,
520
521 drawTriangleArray,
522 drawRect
523
Jason Samsd19f10d2009-05-22 14:03:28 -0700524};
525
526
Jason Sams462d11b2009-06-19 16:03:18 -0700527bool ScriptC::run(Context *rsc, uint32_t launchIndex)
Jason Samsd19f10d2009-05-22 14:03:28 -0700528{
Jason Sams462d11b2009-06-19 16:03:18 -0700529 Context::ScriptTLSStruct * tls =
530 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
Jason Sams3eaa3382009-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 Sams9c54bdb2009-06-17 16:52:59 -0700538 if (mEnviroment.mVertex.get()) {
539 rsc->setVertex(mEnviroment.mVertex.get());
540 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700541
Jason Sams462d11b2009-06-19 16:03:18 -0700542 tls->mScript = this;
543 return mProgram.mScript(launchIndex, &scriptCPtrTable) != 0;
544 tls->mScript = NULL;
Jason Samsd19f10d2009-05-22 14:03:28 -0700545}
546
547ScriptCState::ScriptCState()
548{
549 clear();
550}
551
552ScriptCState::~ScriptCState()
553{
Jack Palevichec5a20b2009-05-28 15:53:04 -0700554 if (mAccScript) {
555 accDeleteScript(mAccScript);
556 }
Jason Samsd19f10d2009-05-22 14:03:28 -0700557}
558
559void ScriptCState::clear()
560{
Jason Sams3a833d82009-06-08 15:20:31 -0700561 memset(&mProgram, 0, sizeof(mProgram));
562
Jason Samsd19f10d2009-05-22 14:03:28 -0700563 mConstantBufferTypes.clear();
Jason Sams3a833d82009-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 Sams3a833d82009-06-08 15:20:31 -0700573
Jack Palevichec5a20b2009-05-28 15:53:04 -0700574 mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700575
Jason Sams39ddc952009-06-05 17:35:09 -0700576}
577
Jason Samsd5680f92009-06-10 18:39:40 -0700578
Jason Sams3eaa3382009-06-10 15:04:38 -0700579void ScriptCState::runCompiler(Context *rsc)
Jason Sams39ddc952009-06-05 17:35:09 -0700580{
581 mAccScript = accCreateScript();
Jason Samsd5680f92009-06-10 18:39:40 -0700582 String8 tmp;
Jason Sams39ddc952009-06-05 17:35:09 -0700583
Jason Samsd5680f92009-06-10 18:39:40 -0700584 rsc->appendNameDefines(&tmp);
585
586 const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
587 int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
588 accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
Jason Sams39ddc952009-06-05 17:35:09 -0700589 accCompileScript(mAccScript);
Jason Sams3a833d82009-06-08 15:20:31 -0700590 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Samsda423d82009-06-09 12:15:30 -0700591 rsAssert(mProgram.mScript);
592
Jason Sams9c54bdb2009-06-17 16:52:59 -0700593 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
594 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
595 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsd5680f92009-06-10 18:39:40 -0700596
Jason Samsda423d82009-06-09 12:15:30 -0700597 if (mProgram.mScript) {
598 const static int pragmaMax = 16;
599 ACCsizei pragmaCount;
600 ACCchar * str[pragmaMax];
601 accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
602
Jason Samsda423d82009-06-09 12:15:30 -0700603 for (int ct=0; ct < pragmaCount; ct+=2) {
Jason Samsda423d82009-06-09 12:15:30 -0700604 if (!strcmp(str[ct], "version")) {
605 continue;
Jason Samsda423d82009-06-09 12:15:30 -0700606 }
607
Jason Samsda423d82009-06-09 12:15:30 -0700608 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700609 if (!strcmp(str[ct+1], "default")) {
610 continue;
611 }
612 if (!strcmp(str[ct+1], "parent")) {
613 mEnviroment.mVertex.clear();
614 continue;
615 }
616 ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
617 if (pv != NULL) {
618 mEnviroment.mVertex.set(pv);
619 continue;
620 }
Jason Samsda423d82009-06-09 12:15:30 -0700621 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
622 }
623
624 if (!strcmp(str[ct], "stateRaster")) {
Jason Samsda423d82009-06-09 12:15:30 -0700625 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
626 }
627
628 if (!strcmp(str[ct], "stateFragment")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700629 if (!strcmp(str[ct+1], "default")) {
630 continue;
631 }
632 if (!strcmp(str[ct+1], "parent")) {
633 mEnviroment.mFragment.clear();
634 continue;
635 }
636 ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
Jason Sams3eaa3382009-06-10 15:04:38 -0700637 if (pf != NULL) {
638 mEnviroment.mFragment.set(pf);
Jason Samsda423d82009-06-09 12:15:30 -0700639 continue;
640 }
641 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
642 }
643
644 if (!strcmp(str[ct], "stateFragmentStore")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700645 if (!strcmp(str[ct+1], "default")) {
646 continue;
647 }
648 if (!strcmp(str[ct+1], "parent")) {
649 mEnviroment.mFragmentStore.clear();
650 continue;
651 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700652 ProgramFragmentStore * pfs =
653 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
654 if (pfs != NULL) {
655 mEnviroment.mFragmentStore.set(pfs);
Jason Samsda423d82009-06-09 12:15:30 -0700656 continue;
657 }
Jason Samsda423d82009-06-09 12:15:30 -0700658 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
659 }
660
661 }
662
663
664 } else {
665 // Deal with an error.
666 }
667
Jason Samsd19f10d2009-05-22 14:03:28 -0700668}
669
670namespace android {
671namespace renderscript {
672
673void rsi_ScriptCBegin(Context * rsc)
674{
675 ScriptCState *ss = &rsc->mScriptC;
676 ss->clear();
677}
678
679void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
680{
681 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700682 ss->mEnviroment.mClearColor[0] = r;
683 ss->mEnviroment.mClearColor[1] = g;
684 ss->mEnviroment.mClearColor[2] = b;
685 ss->mEnviroment.mClearColor[3] = a;
Jason Samsd19f10d2009-05-22 14:03:28 -0700686}
687
688void rsi_ScriptCSetClearDepth(Context * rsc, float v)
689{
690 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700691 ss->mEnviroment.mClearDepth = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700692}
693
694void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
695{
696 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700697 ss->mEnviroment.mClearStencil = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700698}
699
700void rsi_ScriptCAddType(Context * rsc, RsType vt)
701{
702 ScriptCState *ss = &rsc->mScriptC;
703 ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
704}
705
Jason Sams3a833d82009-06-08 15:20:31 -0700706void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Samsd19f10d2009-05-22 14:03:28 -0700707{
708 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700709 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Samsd19f10d2009-05-22 14:03:28 -0700710}
711
712void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
713{
714 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700715 ss->mEnviroment.mIsRoot = isRoot;
Jason Samsd19f10d2009-05-22 14:03:28 -0700716}
717
Jason Sams39ddc952009-06-05 17:35:09 -0700718void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
719{
720 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700721 ss->mProgram.mScriptText = text;
722 ss->mProgram.mScriptTextLength = len;
Jason Sams39ddc952009-06-05 17:35:09 -0700723}
724
725
Jason Samsd19f10d2009-05-22 14:03:28 -0700726RsScript rsi_ScriptCCreate(Context * rsc)
727{
728 ScriptCState *ss = &rsc->mScriptC;
729
Jason Sams3eaa3382009-06-10 15:04:38 -0700730 ss->runCompiler(rsc);
Jason Sams39ddc952009-06-05 17:35:09 -0700731
Jason Samsd19f10d2009-05-22 14:03:28 -0700732 ScriptC *s = new ScriptC();
Jason Sams3a833d82009-06-08 15:20:31 -0700733 s->incRef();
Jack Palevichec5a20b2009-05-28 15:53:04 -0700734 s->mAccScript = ss->mAccScript;
735 ss->mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700736 s->mEnviroment = ss->mEnviroment;
737 s->mProgram = ss->mProgram;
738 ss->clear();
Jason Samsda423d82009-06-09 12:15:30 -0700739
Jason Samsd19f10d2009-05-22 14:03:28 -0700740 return s;
741}
742
743}
744}
745
746