blob: c19f0bb6b9fc78163a69d0f85bd49d00df5e5944 [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 Samse5769102009-06-19 16:03:18 -0700133extern "C" float 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 Samse5769102009-06-19 16:03:18 -0700141extern "C" int32_t 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 Samse5769102009-06-19 16:03:18 -0700149extern "C" uint32_t 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 Samse5769102009-06-19 16:03:18 -0700168extern "C" void 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 Samse5769102009-06-19 16:03:18 -0700175extern "C" void 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 Samse5769102009-06-19 16:03:18 -0700181extern "C" void 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 Samsfd10b712009-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 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,
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 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 Samsa4a54e42009-06-10 18:39:40 -0700578
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700579void ScriptCState::runCompiler(Context *rsc)
Jason Sams1f526332009-06-05 17:35:09 -0700580{
581 mAccScript = accCreateScript();
Jason Samsa4a54e42009-06-10 18:39:40 -0700582 String8 tmp;
Jason Sams1f526332009-06-05 17:35:09 -0700583
Jason Samsa4a54e42009-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 Sams1f526332009-06-05 17:35:09 -0700589 accCompileScript(mAccScript);
Jason Samsefb8de12009-06-08 15:20:31 -0700590 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Sams10308932009-06-09 12:15:30 -0700591 rsAssert(mProgram.mScript);
592
Jason Sams8ce125b2009-06-17 16:52:59 -0700593 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
594 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
595 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsa4a54e42009-06-10 18:39:40 -0700596
Jason Sams10308932009-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 Sams10308932009-06-09 12:15:30 -0700603 for (int ct=0; ct < pragmaCount; ct+=2) {
Jason Sams10308932009-06-09 12:15:30 -0700604 if (!strcmp(str[ct], "version")) {
605 continue;
Jason Sams10308932009-06-09 12:15:30 -0700606 }
607
Jason Sams10308932009-06-09 12:15:30 -0700608 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams8ce125b2009-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 Sams10308932009-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 Sams10308932009-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 Sams8ce125b2009-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 Samsa0a1b6f2009-06-10 15:04:38 -0700637 if (pf != NULL) {
638 mEnviroment.mFragment.set(pf);
Jason Sams10308932009-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 Sams8ce125b2009-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 Samsa0a1b6f2009-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 Sams10308932009-06-09 12:15:30 -0700656 continue;
657 }
Jason Sams10308932009-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 Sams326e0dd2009-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 Samsefb8de12009-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 Sams326e0dd2009-05-22 14:03:28 -0700686}
687
688void rsi_ScriptCSetClearDepth(Context * rsc, float v)
689{
690 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700691 ss->mEnviroment.mClearDepth = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700692}
693
694void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
695{
696 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700697 ss->mEnviroment.mClearStencil = v;
Jason Sams326e0dd2009-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 Samsefb8de12009-06-08 15:20:31 -0700706void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Sams326e0dd2009-05-22 14:03:28 -0700707{
708 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700709 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Sams326e0dd2009-05-22 14:03:28 -0700710}
711
712void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
713{
714 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700715 ss->mEnviroment.mIsRoot = isRoot;
Jason Sams326e0dd2009-05-22 14:03:28 -0700716}
717
Jason Sams1f526332009-06-05 17:35:09 -0700718void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
719{
720 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700721 ss->mProgram.mScriptText = text;
722 ss->mProgram.mScriptTextLength = len;
Jason Sams1f526332009-06-05 17:35:09 -0700723}
724
725
Jason Sams326e0dd2009-05-22 14:03:28 -0700726RsScript rsi_ScriptCCreate(Context * rsc)
727{
728 ScriptCState *ss = &rsc->mScriptC;
729
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700730 ss->runCompiler(rsc);
Jason Sams1f526332009-06-05 17:35:09 -0700731
Jason Sams326e0dd2009-05-22 14:03:28 -0700732 ScriptC *s = new ScriptC();
Jason Samsefb8de12009-06-08 15:20:31 -0700733 s->incRef();
Jack Palevich1ef8b802009-05-28 15:53:04 -0700734 s->mAccScript = ss->mAccScript;
735 ss->mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -0700736 s->mEnviroment = ss->mEnviroment;
737 s->mProgram = ss->mProgram;
738 ss->clear();
Jason Sams10308932009-06-09 12:15:30 -0700739
Jason Sams326e0dd2009-05-22 14:03:28 -0700740 return s;
741}
742
743}
744}
745
746