blob: 522ed00b79a1bc936e7ccd6bce7a23bba4ec3dcb [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();
136 return static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700137}
138
Jason Sams462d11b2009-06-19 16:03:18 -0700139extern "C" int32_t loadI32(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700140{
Jason Sams462d11b2009-06-19 16:03:18 -0700141 GET_TLS();
142 return static_cast<const int32_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700143}
144
Jason Sams462d11b2009-06-19 16:03:18 -0700145extern "C" uint32_t loadU32(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700146{
Jason Sams462d11b2009-06-19 16:03:18 -0700147 GET_TLS();
148 return static_cast<const uint32_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700149}
150
Jason Sams462d11b2009-06-19 16:03:18 -0700151extern "C" void loadEnvVec4(uint32_t bank, uint32_t offset, rsc_Vector4 *v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700152{
Jason Sams462d11b2009-06-19 16:03:18 -0700153 GET_TLS();
154 memcpy(v, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Vector4));
Jason Samsd19f10d2009-05-22 14:03:28 -0700155}
156
Jason Sams462d11b2009-06-19 16:03:18 -0700157extern "C" void loadEnvMatrix(uint32_t bank, uint32_t offset, rsc_Matrix *m)
Jason Samsd19f10d2009-05-22 14:03:28 -0700158{
Jason Sams462d11b2009-06-19 16:03:18 -0700159 GET_TLS();
160 memcpy(m, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Matrix));
Jason Samsd19f10d2009-05-22 14:03:28 -0700161}
162
163
Jason Sams462d11b2009-06-19 16:03:18 -0700164extern "C" void storeF(uint32_t bank, uint32_t offset, float v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700165{
Jason Sams462d11b2009-06-19 16:03:18 -0700166 GET_TLS();
167 static_cast<float *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700168}
169
Jason Sams462d11b2009-06-19 16:03:18 -0700170extern "C" void storeI32(uint32_t bank, uint32_t offset, int32_t v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700171{
Jason Sams462d11b2009-06-19 16:03:18 -0700172 GET_TLS();
173 static_cast<int32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700174}
175
Jason Sams462d11b2009-06-19 16:03:18 -0700176extern "C" void storeU32(uint32_t bank, uint32_t offset, uint32_t v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700177{
Jason Sams462d11b2009-06-19 16:03:18 -0700178 GET_TLS();
179 static_cast<uint32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700180}
181
Jason Sams462d11b2009-06-19 16:03:18 -0700182extern "C" void storeEnvVec4(uint32_t bank, uint32_t offset, const rsc_Vector4 *v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700183{
Jason Sams462d11b2009-06-19 16:03:18 -0700184 GET_TLS();
185 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], v, sizeof(rsc_Vector4));
Jason Samsd19f10d2009-05-22 14:03:28 -0700186}
187
Jason Sams462d11b2009-06-19 16:03:18 -0700188extern "C" void storeEnvMatrix(uint32_t bank, uint32_t offset, const rsc_Matrix *m)
Jason Samsd19f10d2009-05-22 14:03:28 -0700189{
Jason Sams462d11b2009-06-19 16:03:18 -0700190 GET_TLS();
191 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], m, sizeof(rsc_Matrix));
Jason Samsd19f10d2009-05-22 14:03:28 -0700192}
193
194
Jason Sams462d11b2009-06-19 16:03:18 -0700195extern "C" void color(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700196{
Jason Samsd19f10d2009-05-22 14:03:28 -0700197 glColor4f(r, g, b, a);
198}
199
Jason Sams462d11b2009-06-19 16:03:18 -0700200extern "C" void renderTriangleMesh(RsTriangleMesh mesh)
Jason Samsd19f10d2009-05-22 14:03:28 -0700201{
Jason Sams462d11b2009-06-19 16:03:18 -0700202 GET_TLS();
203 rsi_TriangleMeshRender(rsc, mesh);
Jason Samsd19f10d2009-05-22 14:03:28 -0700204}
205
Jason Sams462d11b2009-06-19 16:03:18 -0700206extern "C" void renderTriangleMeshRange(RsTriangleMesh mesh, uint32_t start, uint32_t count)
Jason Samsd19f10d2009-05-22 14:03:28 -0700207{
Jason Sams462d11b2009-06-19 16:03:18 -0700208 GET_TLS();
209 rsi_TriangleMeshRenderRange(rsc, mesh, start, count);
Jason Samsd19f10d2009-05-22 14:03:28 -0700210}
211
Jason Sams462d11b2009-06-19 16:03:18 -0700212extern "C" void materialDiffuse(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700213{
Jason Samsd19f10d2009-05-22 14:03:28 -0700214 float v[] = {r, g, b, a};
215 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, v);
216}
217
Jason Sams462d11b2009-06-19 16:03:18 -0700218extern "C" void materialSpecular(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700219{
Jason Samsd19f10d2009-05-22 14:03:28 -0700220 float v[] = {r, g, b, a};
221 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, v);
222}
223
Jason Sams462d11b2009-06-19 16:03:18 -0700224extern "C" void lightPosition(float x, float y, float z, float w)
Jason Samsd19f10d2009-05-22 14:03:28 -0700225{
Jason Samsd19f10d2009-05-22 14:03:28 -0700226 float v[] = {x, y, z, w};
227 glLightfv(GL_LIGHT0, GL_POSITION, v);
228}
229
Jason Sams462d11b2009-06-19 16:03:18 -0700230extern "C" void materialShininess(float s)
Jason Samsd19f10d2009-05-22 14:03:28 -0700231{
Jason Samsd19f10d2009-05-22 14:03:28 -0700232 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &s);
233}
234
Jason Sams462d11b2009-06-19 16:03:18 -0700235extern "C" void uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
Jason Samsd19f10d2009-05-22 14:03:28 -0700236{
Jason Sams462d11b2009-06-19 16:03:18 -0700237 GET_TLS();
238 rsi_AllocationUploadToTexture(rsc, va, baseMipLevel);
Jason Samsd19f10d2009-05-22 14:03:28 -0700239}
240
Jason Sams462d11b2009-06-19 16:03:18 -0700241extern "C" void enable(uint32_t p)
Jason Samsd19f10d2009-05-22 14:03:28 -0700242{
Jason Samsd19f10d2009-05-22 14:03:28 -0700243 glEnable(p);
244}
245
Jason Sams462d11b2009-06-19 16:03:18 -0700246extern "C" void disable(uint32_t p)
Jason Samsd19f10d2009-05-22 14:03:28 -0700247{
Jason Samsd19f10d2009-05-22 14:03:28 -0700248 glDisable(p);
249}
250
Jason Sams462d11b2009-06-19 16:03:18 -0700251extern "C" uint32_t scriptRand(uint32_t max)
Jason Samsd19f10d2009-05-22 14:03:28 -0700252{
253 return (uint32_t)(((float)rand()) * max / RAND_MAX);
254}
255
256// Assumes (GL_FIXED) x,y,z (GL_UNSIGNED_BYTE)r,g,b,a
Jason Sams462d11b2009-06-19 16:03:18 -0700257extern "C" void drawTriangleArray(RsAllocation alloc, uint32_t count)
Jason Samsd19f10d2009-05-22 14:03:28 -0700258{
Jason Sams462d11b2009-06-19 16:03:18 -0700259 GET_TLS();
260
Jason Samsd19f10d2009-05-22 14:03:28 -0700261 const Allocation *a = (const Allocation *)alloc;
262 const uint32_t *ptr = (const uint32_t *)a->getPtr();
263
Jason Sams462d11b2009-06-19 16:03:18 -0700264 rsc->setupCheck();
Jason Samsd19f10d2009-05-22 14:03:28 -0700265
266 glBindBuffer(GL_ARRAY_BUFFER, 0);
267 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
268
269 glEnableClientState(GL_VERTEX_ARRAY);
270 glDisableClientState(GL_NORMAL_ARRAY);
271 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
272 glEnableClientState(GL_COLOR_ARRAY);
273
274 glVertexPointer(2, GL_FIXED, 12, ptr + 1);
275 //glTexCoordPointer(2, GL_FIXED, 24, ptr + 1);
276 glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
277
278 glDrawArrays(GL_TRIANGLES, 0, count * 3);
279}
280
Jason Sams462d11b2009-06-19 16:03:18 -0700281extern "C" void drawRect(int32_t x1, int32_t x2, int32_t y1, int32_t y2)
Jason Samsfe08d992009-05-27 14:45:32 -0700282{
Jason Sams462d11b2009-06-19 16:03:18 -0700283 GET_TLS();
Jason Samsfe08d992009-05-27 14:45:32 -0700284 x1 = (x1 << 16);
285 x2 = (x2 << 16);
286 y1 = (y1 << 16);
287 y2 = (y2 << 16);
288
289 int32_t vtx[] = {x1,y1, x1,y2, x2,y1, x2,y2};
290 static const int32_t tex[] = {0,0, 0,0x10000, 0x10000,0, 0x10000,0x10000};
291
292
Jason Sams462d11b2009-06-19 16:03:18 -0700293 rsc->setupCheck();
Jason Samsfe08d992009-05-27 14:45:32 -0700294
295 glBindBuffer(GL_ARRAY_BUFFER, 0);
296 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
297
298 glEnableClientState(GL_VERTEX_ARRAY);
299 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
300 glDisableClientState(GL_NORMAL_ARRAY);
301 glDisableClientState(GL_COLOR_ARRAY);
302
303 glVertexPointer(2, GL_FIXED, 8, vtx);
304 glTexCoordPointer(2, GL_FIXED, 8, tex);
305 //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
306
307 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
308}
309
Jason Sams462d11b2009-06-19 16:03:18 -0700310extern "C" void pfBindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
Jason Samsd19f10d2009-05-22 14:03:28 -0700311{
Jason Sams462d11b2009-06-19 16:03:18 -0700312 GET_TLS();
313 rsi_ProgramFragmentBindTexture(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700314 static_cast<ProgramFragment *>(vpf),
315 slot,
316 static_cast<Allocation *>(va));
317
318}
319
Jason Sams462d11b2009-06-19 16:03:18 -0700320extern "C" void pfBindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700321{
Jason Sams462d11b2009-06-19 16:03:18 -0700322 GET_TLS();
323 rsi_ProgramFragmentBindSampler(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700324 static_cast<ProgramFragment *>(vpf),
325 slot,
326 static_cast<Sampler *>(vs));
327
328}
329
Jason Sams462d11b2009-06-19 16:03:18 -0700330extern "C" void contextBindProgramFragmentStore(RsProgramFragmentStore pfs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700331{
Jason Sams462d11b2009-06-19 16:03:18 -0700332 GET_TLS();
333 rsi_ContextBindProgramFragmentStore(rsc, pfs);
Jason Samsd19f10d2009-05-22 14:03:28 -0700334
335}
336
Jason Sams462d11b2009-06-19 16:03:18 -0700337extern "C" void contextBindProgramFragment(RsProgramFragment pf)
Jason Samsd19f10d2009-05-22 14:03:28 -0700338{
Jason Sams462d11b2009-06-19 16:03:18 -0700339 GET_TLS();
340 rsi_ContextBindProgramFragment(rsc, pf);
Jason Samsd19f10d2009-05-22 14:03:28 -0700341
342}
343
344
345static rsc_FunctionTable scriptCPtrTable = {
346 loadVp,
347 loadF,
348 loadI32,
349 loadU32,
350 loadEnvVec4,
351 loadEnvMatrix,
352
353 storeF,
354 storeI32,
355 storeU32,
356 storeEnvVec4,
357 storeEnvMatrix,
358
359 matrixLoadIdentity,
360 matrixLoadFloat,
361 matrixLoadMat,
362 matrixLoadRotate,
363 matrixLoadScale,
364 matrixLoadTranslate,
365 matrixLoadMultiply,
366 matrixMultiply,
367 matrixRotate,
368 matrixScale,
369 matrixTranslate,
370
371 color,
Jason Samsd19f10d2009-05-22 14:03:28 -0700372
373 pfBindTexture,
374 pfBindSampler,
375
376 materialDiffuse,
377 materialSpecular,
378 lightPosition,
379 materialShininess,
380 uploadToTexture,
381 enable,
382 disable,
383
384 scriptRand,
Jason Samsd19f10d2009-05-22 14:03:28 -0700385 contextBindProgramFragment,
Jason Samsfe08d992009-05-27 14:45:32 -0700386 contextBindProgramFragmentStore,
387
388
389 renderTriangleMesh,
390 renderTriangleMeshRange,
391
392 drawTriangleArray,
393 drawRect
394
Jason Samsd19f10d2009-05-22 14:03:28 -0700395};
396
397
Jason Sams462d11b2009-06-19 16:03:18 -0700398bool ScriptC::run(Context *rsc, uint32_t launchIndex)
Jason Samsd19f10d2009-05-22 14:03:28 -0700399{
Jason Sams462d11b2009-06-19 16:03:18 -0700400 Context::ScriptTLSStruct * tls =
401 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
Jason Sams3eaa3382009-06-10 15:04:38 -0700402
403 if (mEnviroment.mFragmentStore.get()) {
404 rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
405 }
406 if (mEnviroment.mFragment.get()) {
407 rsc->setFragment(mEnviroment.mFragment.get());
408 }
Jason Sams9c54bdb2009-06-17 16:52:59 -0700409 if (mEnviroment.mVertex.get()) {
410 rsc->setVertex(mEnviroment.mVertex.get());
411 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700412
Jason Sams462d11b2009-06-19 16:03:18 -0700413 tls->mScript = this;
414 return mProgram.mScript(launchIndex, &scriptCPtrTable) != 0;
415 tls->mScript = NULL;
Jason Samsd19f10d2009-05-22 14:03:28 -0700416}
417
418ScriptCState::ScriptCState()
419{
420 clear();
421}
422
423ScriptCState::~ScriptCState()
424{
Jack Palevichec5a20b2009-05-28 15:53:04 -0700425 if (mAccScript) {
426 accDeleteScript(mAccScript);
427 }
Jason Samsd19f10d2009-05-22 14:03:28 -0700428}
429
430void ScriptCState::clear()
431{
Jason Sams3a833d82009-06-08 15:20:31 -0700432 memset(&mProgram, 0, sizeof(mProgram));
433
Jason Samsd19f10d2009-05-22 14:03:28 -0700434 mConstantBufferTypes.clear();
Jason Sams3a833d82009-06-08 15:20:31 -0700435
436 memset(&mEnviroment, 0, sizeof(mEnviroment));
437 mEnviroment.mClearColor[0] = 0;
438 mEnviroment.mClearColor[1] = 0;
439 mEnviroment.mClearColor[2] = 0;
440 mEnviroment.mClearColor[3] = 1;
441 mEnviroment.mClearDepth = 1;
442 mEnviroment.mClearStencil = 0;
443 mEnviroment.mIsRoot = false;
Jason Sams3a833d82009-06-08 15:20:31 -0700444
Jack Palevichec5a20b2009-05-28 15:53:04 -0700445 mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700446
Jason Sams39ddc9502009-06-05 17:35:09 -0700447}
448
Jason Samsd5680f92009-06-10 18:39:40 -0700449
Jason Sams3eaa3382009-06-10 15:04:38 -0700450void ScriptCState::runCompiler(Context *rsc)
Jason Sams39ddc9502009-06-05 17:35:09 -0700451{
452 mAccScript = accCreateScript();
Jason Samsd5680f92009-06-10 18:39:40 -0700453 String8 tmp;
Jason Sams39ddc9502009-06-05 17:35:09 -0700454
Jason Samsd5680f92009-06-10 18:39:40 -0700455 rsc->appendNameDefines(&tmp);
456
457 const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
458 int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
459 accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
Jason Sams39ddc9502009-06-05 17:35:09 -0700460 accCompileScript(mAccScript);
Jason Sams3a833d82009-06-08 15:20:31 -0700461 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Samsda423d82009-06-09 12:15:30 -0700462 rsAssert(mProgram.mScript);
463
Jason Sams9c54bdb2009-06-17 16:52:59 -0700464 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
465 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
466 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsd5680f92009-06-10 18:39:40 -0700467
Jason Samsda423d82009-06-09 12:15:30 -0700468 if (mProgram.mScript) {
469 const static int pragmaMax = 16;
470 ACCsizei pragmaCount;
471 ACCchar * str[pragmaMax];
472 accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
473
Jason Samsda423d82009-06-09 12:15:30 -0700474 for (int ct=0; ct < pragmaCount; ct+=2) {
Jason Samsda423d82009-06-09 12:15:30 -0700475 if (!strcmp(str[ct], "version")) {
476 continue;
Jason Samsda423d82009-06-09 12:15:30 -0700477 }
478
Jason Samsda423d82009-06-09 12:15:30 -0700479 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700480 if (!strcmp(str[ct+1], "default")) {
481 continue;
482 }
483 if (!strcmp(str[ct+1], "parent")) {
484 mEnviroment.mVertex.clear();
485 continue;
486 }
487 ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
488 if (pv != NULL) {
489 mEnviroment.mVertex.set(pv);
490 continue;
491 }
Jason Samsda423d82009-06-09 12:15:30 -0700492 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
493 }
494
495 if (!strcmp(str[ct], "stateRaster")) {
Jason Samsda423d82009-06-09 12:15:30 -0700496 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
497 }
498
499 if (!strcmp(str[ct], "stateFragment")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700500 if (!strcmp(str[ct+1], "default")) {
501 continue;
502 }
503 if (!strcmp(str[ct+1], "parent")) {
504 mEnviroment.mFragment.clear();
505 continue;
506 }
507 ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
Jason Sams3eaa3382009-06-10 15:04:38 -0700508 if (pf != NULL) {
509 mEnviroment.mFragment.set(pf);
Jason Samsda423d82009-06-09 12:15:30 -0700510 continue;
511 }
512 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
513 }
514
515 if (!strcmp(str[ct], "stateFragmentStore")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700516 if (!strcmp(str[ct+1], "default")) {
517 continue;
518 }
519 if (!strcmp(str[ct+1], "parent")) {
520 mEnviroment.mFragmentStore.clear();
521 continue;
522 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700523 ProgramFragmentStore * pfs =
524 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
525 if (pfs != NULL) {
526 mEnviroment.mFragmentStore.set(pfs);
Jason Samsda423d82009-06-09 12:15:30 -0700527 continue;
528 }
Jason Samsda423d82009-06-09 12:15:30 -0700529 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
530 }
531
532 }
533
534
535 } else {
536 // Deal with an error.
537 }
538
Jason Samsd19f10d2009-05-22 14:03:28 -0700539}
540
541namespace android {
542namespace renderscript {
543
544void rsi_ScriptCBegin(Context * rsc)
545{
546 ScriptCState *ss = &rsc->mScriptC;
547 ss->clear();
548}
549
550void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
551{
552 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700553 ss->mEnviroment.mClearColor[0] = r;
554 ss->mEnviroment.mClearColor[1] = g;
555 ss->mEnviroment.mClearColor[2] = b;
556 ss->mEnviroment.mClearColor[3] = a;
Jason Samsd19f10d2009-05-22 14:03:28 -0700557}
558
559void rsi_ScriptCSetClearDepth(Context * rsc, float v)
560{
561 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700562 ss->mEnviroment.mClearDepth = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700563}
564
565void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
566{
567 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700568 ss->mEnviroment.mClearStencil = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700569}
570
571void rsi_ScriptCAddType(Context * rsc, RsType vt)
572{
573 ScriptCState *ss = &rsc->mScriptC;
574 ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
575}
576
Jason Sams3a833d82009-06-08 15:20:31 -0700577void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Samsd19f10d2009-05-22 14:03:28 -0700578{
579 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700580 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Samsd19f10d2009-05-22 14:03:28 -0700581}
582
583void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
584{
585 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700586 ss->mEnviroment.mIsRoot = isRoot;
Jason Samsd19f10d2009-05-22 14:03:28 -0700587}
588
Jason Sams39ddc9502009-06-05 17:35:09 -0700589void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
590{
591 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700592 ss->mProgram.mScriptText = text;
593 ss->mProgram.mScriptTextLength = len;
Jason Sams39ddc9502009-06-05 17:35:09 -0700594}
595
596
Jason Samsd19f10d2009-05-22 14:03:28 -0700597RsScript rsi_ScriptCCreate(Context * rsc)
598{
599 ScriptCState *ss = &rsc->mScriptC;
600
Jason Sams3eaa3382009-06-10 15:04:38 -0700601 ss->runCompiler(rsc);
Jason Sams39ddc9502009-06-05 17:35:09 -0700602
Jason Samsd19f10d2009-05-22 14:03:28 -0700603 ScriptC *s = new ScriptC();
Jason Sams3a833d82009-06-08 15:20:31 -0700604 s->incRef();
Jack Palevichec5a20b2009-05-28 15:53:04 -0700605 s->mAccScript = ss->mAccScript;
606 ss->mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700607 s->mEnviroment = ss->mEnviroment;
608 s->mProgram = ss->mProgram;
609 ss->clear();
Jason Samsda423d82009-06-09 12:15:30 -0700610
Jason Samsd19f10d2009-05-22 14:03:28 -0700611 return s;
612}
613
614}
615}
616
617