blob: 557f3aea1f40ad0720b83f554f1cf520ffcf33c5 [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 Samsd19f10d2009-05-22 14:03:28 -070024using namespace android;
25using namespace android::renderscript;
26
Jason Sams462d11b2009-06-19 16:03:18 -070027#define GET_TLS() Context::ScriptTLSStruct * tls = \
28 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
29 Context * rsc = tls->mContext; \
30 ScriptC * sc = (ScriptC *) tls->mScript
31
Jason Samsd19f10d2009-05-22 14:03:28 -070032
33ScriptC::ScriptC()
34{
Jack Palevichec5a20b2009-05-28 15:53:04 -070035 mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -070036 memset(&mProgram, 0, sizeof(mProgram));
Jason Samsd19f10d2009-05-22 14:03:28 -070037}
38
39ScriptC::~ScriptC()
40{
Jack Palevichec5a20b2009-05-28 15:53:04 -070041 if (mAccScript) {
42 accDeleteScript(mAccScript);
43 }
Jason Samsd19f10d2009-05-22 14:03:28 -070044}
45
Jason Sams462d11b2009-06-19 16:03:18 -070046extern "C" void matrixLoadIdentity(rsc_Matrix *mat)
Jason Samsd19f10d2009-05-22 14:03:28 -070047{
48 Matrix *m = reinterpret_cast<Matrix *>(mat);
49 m->loadIdentity();
50}
51
Jason Sams462d11b2009-06-19 16:03:18 -070052extern "C" void matrixLoadFloat(rsc_Matrix *mat, const float *f)
Jason Samsd19f10d2009-05-22 14:03:28 -070053{
54 Matrix *m = reinterpret_cast<Matrix *>(mat);
55 m->load(f);
56}
57
Jason Sams462d11b2009-06-19 16:03:18 -070058extern "C" void matrixLoadMat(rsc_Matrix *mat, const rsc_Matrix *newmat)
Jason Samsd19f10d2009-05-22 14:03:28 -070059{
60 Matrix *m = reinterpret_cast<Matrix *>(mat);
61 m->load(reinterpret_cast<const Matrix *>(newmat));
62}
63
Jason Sams462d11b2009-06-19 16:03:18 -070064extern "C" void matrixLoadRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070065{
66 Matrix *m = reinterpret_cast<Matrix *>(mat);
67 m->loadRotate(rot, x, y, z);
68}
69
Jason Sams462d11b2009-06-19 16:03:18 -070070extern "C" void matrixLoadScale(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070071{
72 Matrix *m = reinterpret_cast<Matrix *>(mat);
73 m->loadScale(x, y, z);
74}
75
Jason Sams462d11b2009-06-19 16:03:18 -070076extern "C" void matrixLoadTranslate(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070077{
78 Matrix *m = reinterpret_cast<Matrix *>(mat);
79 m->loadTranslate(x, y, z);
80}
81
Jason Sams462d11b2009-06-19 16:03:18 -070082extern "C" void matrixLoadMultiply(rsc_Matrix *mat, const rsc_Matrix *lhs, const rsc_Matrix *rhs)
Jason Samsd19f10d2009-05-22 14:03:28 -070083{
84 Matrix *m = reinterpret_cast<Matrix *>(mat);
85 m->loadMultiply(reinterpret_cast<const Matrix *>(lhs),
86 reinterpret_cast<const Matrix *>(rhs));
87}
88
Jason Sams462d11b2009-06-19 16:03:18 -070089extern "C" void matrixMultiply(rsc_Matrix *mat, const rsc_Matrix *rhs)
Jason Samsd19f10d2009-05-22 14:03:28 -070090{
91 Matrix *m = reinterpret_cast<Matrix *>(mat);
92 m->multiply(reinterpret_cast<const Matrix *>(rhs));
93}
94
Jason Sams462d11b2009-06-19 16:03:18 -070095extern "C" void matrixRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070096{
97 Matrix *m = reinterpret_cast<Matrix *>(mat);
98 m->rotate(rot, x, y, z);
99}
100
Jason Sams462d11b2009-06-19 16:03:18 -0700101extern "C" void matrixScale(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -0700102{
103 Matrix *m = reinterpret_cast<Matrix *>(mat);
104 m->scale(x, y, z);
105}
106
Jason Sams462d11b2009-06-19 16:03:18 -0700107extern "C" void matrixTranslate(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -0700108{
109 Matrix *m = reinterpret_cast<Matrix *>(mat);
110 m->translate(x, y, z);
111}
112
113
Jason Sams462d11b2009-06-19 16:03:18 -0700114extern "C" const void * loadVp(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700115{
Jason Sams462d11b2009-06-19 16:03:18 -0700116 GET_TLS();
117 return &static_cast<const uint8_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700118}
119
Jason Sams462d11b2009-06-19 16:03:18 -0700120extern "C" float loadF(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700121{
Jason Sams462d11b2009-06-19 16:03:18 -0700122 GET_TLS();
123 return static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700124}
125
Jason Sams462d11b2009-06-19 16:03:18 -0700126extern "C" int32_t loadI32(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700127{
Jason Sams462d11b2009-06-19 16:03:18 -0700128 GET_TLS();
129 return static_cast<const int32_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700130}
131
Jason Sams462d11b2009-06-19 16:03:18 -0700132extern "C" uint32_t loadU32(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700133{
Jason Sams462d11b2009-06-19 16:03:18 -0700134 GET_TLS();
135 return static_cast<const uint32_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700136}
137
Jason Sams462d11b2009-06-19 16:03:18 -0700138extern "C" void loadEnvVec4(uint32_t bank, uint32_t offset, rsc_Vector4 *v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700139{
Jason Sams462d11b2009-06-19 16:03:18 -0700140 GET_TLS();
141 memcpy(v, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Vector4));
Jason Samsd19f10d2009-05-22 14:03:28 -0700142}
143
Jason Sams462d11b2009-06-19 16:03:18 -0700144extern "C" void loadEnvMatrix(uint32_t bank, uint32_t offset, rsc_Matrix *m)
Jason Samsd19f10d2009-05-22 14:03:28 -0700145{
Jason Sams462d11b2009-06-19 16:03:18 -0700146 GET_TLS();
147 memcpy(m, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Matrix));
Jason Samsd19f10d2009-05-22 14:03:28 -0700148}
149
150
Jason Sams462d11b2009-06-19 16:03:18 -0700151extern "C" void storeF(uint32_t bank, uint32_t offset, float v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700152{
Jason Sams462d11b2009-06-19 16:03:18 -0700153 GET_TLS();
154 static_cast<float *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700155}
156
Jason Sams462d11b2009-06-19 16:03:18 -0700157extern "C" void storeI32(uint32_t bank, uint32_t offset, int32_t v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700158{
Jason Sams462d11b2009-06-19 16:03:18 -0700159 GET_TLS();
160 static_cast<int32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700161}
162
Jason Sams462d11b2009-06-19 16:03:18 -0700163extern "C" void storeU32(uint32_t bank, uint32_t offset, uint32_t v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700164{
Jason Sams462d11b2009-06-19 16:03:18 -0700165 GET_TLS();
166 static_cast<uint32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700167}
168
Jason Sams462d11b2009-06-19 16:03:18 -0700169extern "C" void storeEnvVec4(uint32_t bank, uint32_t offset, const rsc_Vector4 *v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700170{
Jason Sams462d11b2009-06-19 16:03:18 -0700171 GET_TLS();
172 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], v, sizeof(rsc_Vector4));
Jason Samsd19f10d2009-05-22 14:03:28 -0700173}
174
Jason Sams462d11b2009-06-19 16:03:18 -0700175extern "C" void storeEnvMatrix(uint32_t bank, uint32_t offset, const rsc_Matrix *m)
Jason Samsd19f10d2009-05-22 14:03:28 -0700176{
Jason Sams462d11b2009-06-19 16:03:18 -0700177 GET_TLS();
178 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], m, sizeof(rsc_Matrix));
Jason Samsd19f10d2009-05-22 14:03:28 -0700179}
180
181
Jason Sams462d11b2009-06-19 16:03:18 -0700182extern "C" void color(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700183{
Jason Samsd19f10d2009-05-22 14:03:28 -0700184 glColor4f(r, g, b, a);
185}
186
Jason Sams462d11b2009-06-19 16:03:18 -0700187extern "C" void renderTriangleMesh(RsTriangleMesh mesh)
Jason Samsd19f10d2009-05-22 14:03:28 -0700188{
Jason Sams462d11b2009-06-19 16:03:18 -0700189 GET_TLS();
190 rsi_TriangleMeshRender(rsc, mesh);
Jason Samsd19f10d2009-05-22 14:03:28 -0700191}
192
Jason Sams462d11b2009-06-19 16:03:18 -0700193extern "C" void renderTriangleMeshRange(RsTriangleMesh mesh, uint32_t start, uint32_t count)
Jason Samsd19f10d2009-05-22 14:03:28 -0700194{
Jason Sams462d11b2009-06-19 16:03:18 -0700195 GET_TLS();
196 rsi_TriangleMeshRenderRange(rsc, mesh, start, count);
Jason Samsd19f10d2009-05-22 14:03:28 -0700197}
198
Jason Sams462d11b2009-06-19 16:03:18 -0700199extern "C" void materialDiffuse(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700200{
Jason Samsd19f10d2009-05-22 14:03:28 -0700201 float v[] = {r, g, b, a};
202 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, v);
203}
204
Jason Sams462d11b2009-06-19 16:03:18 -0700205extern "C" void materialSpecular(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700206{
Jason Samsd19f10d2009-05-22 14:03:28 -0700207 float v[] = {r, g, b, a};
208 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, v);
209}
210
Jason Sams462d11b2009-06-19 16:03:18 -0700211extern "C" void lightPosition(float x, float y, float z, float w)
Jason Samsd19f10d2009-05-22 14:03:28 -0700212{
Jason Samsd19f10d2009-05-22 14:03:28 -0700213 float v[] = {x, y, z, w};
214 glLightfv(GL_LIGHT0, GL_POSITION, v);
215}
216
Jason Sams462d11b2009-06-19 16:03:18 -0700217extern "C" void materialShininess(float s)
Jason Samsd19f10d2009-05-22 14:03:28 -0700218{
Jason Samsd19f10d2009-05-22 14:03:28 -0700219 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &s);
220}
221
Jason Sams462d11b2009-06-19 16:03:18 -0700222extern "C" void uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
Jason Samsd19f10d2009-05-22 14:03:28 -0700223{
Jason Sams462d11b2009-06-19 16:03:18 -0700224 GET_TLS();
225 rsi_AllocationUploadToTexture(rsc, va, baseMipLevel);
Jason Samsd19f10d2009-05-22 14:03:28 -0700226}
227
Jason Sams462d11b2009-06-19 16:03:18 -0700228extern "C" void enable(uint32_t p)
Jason Samsd19f10d2009-05-22 14:03:28 -0700229{
Jason Samsd19f10d2009-05-22 14:03:28 -0700230 glEnable(p);
231}
232
Jason Sams462d11b2009-06-19 16:03:18 -0700233extern "C" void disable(uint32_t p)
Jason Samsd19f10d2009-05-22 14:03:28 -0700234{
Jason Samsd19f10d2009-05-22 14:03:28 -0700235 glDisable(p);
236}
237
Jason Sams462d11b2009-06-19 16:03:18 -0700238extern "C" uint32_t scriptRand(uint32_t max)
Jason Samsd19f10d2009-05-22 14:03:28 -0700239{
240 return (uint32_t)(((float)rand()) * max / RAND_MAX);
241}
242
243// Assumes (GL_FIXED) x,y,z (GL_UNSIGNED_BYTE)r,g,b,a
Jason Sams462d11b2009-06-19 16:03:18 -0700244extern "C" void drawTriangleArray(RsAllocation alloc, uint32_t count)
Jason Samsd19f10d2009-05-22 14:03:28 -0700245{
Jason Sams462d11b2009-06-19 16:03:18 -0700246 GET_TLS();
247
Jason Samsd19f10d2009-05-22 14:03:28 -0700248 const Allocation *a = (const Allocation *)alloc;
249 const uint32_t *ptr = (const uint32_t *)a->getPtr();
250
Jason Sams462d11b2009-06-19 16:03:18 -0700251 rsc->setupCheck();
Jason Samsd19f10d2009-05-22 14:03:28 -0700252
253 glBindBuffer(GL_ARRAY_BUFFER, 0);
254 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
255
256 glEnableClientState(GL_VERTEX_ARRAY);
257 glDisableClientState(GL_NORMAL_ARRAY);
258 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
259 glEnableClientState(GL_COLOR_ARRAY);
260
261 glVertexPointer(2, GL_FIXED, 12, ptr + 1);
262 //glTexCoordPointer(2, GL_FIXED, 24, ptr + 1);
263 glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
264
265 glDrawArrays(GL_TRIANGLES, 0, count * 3);
266}
267
Jason Sams462d11b2009-06-19 16:03:18 -0700268extern "C" void drawRect(int32_t x1, int32_t x2, int32_t y1, int32_t y2)
Jason Samsfe08d992009-05-27 14:45:32 -0700269{
Jason Sams462d11b2009-06-19 16:03:18 -0700270 GET_TLS();
Jason Samsfe08d992009-05-27 14:45:32 -0700271 x1 = (x1 << 16);
272 x2 = (x2 << 16);
273 y1 = (y1 << 16);
274 y2 = (y2 << 16);
275
276 int32_t vtx[] = {x1,y1, x1,y2, x2,y1, x2,y2};
277 static const int32_t tex[] = {0,0, 0,0x10000, 0x10000,0, 0x10000,0x10000};
278
279
Jason Sams462d11b2009-06-19 16:03:18 -0700280 rsc->setupCheck();
Jason Samsfe08d992009-05-27 14:45:32 -0700281
282 glBindBuffer(GL_ARRAY_BUFFER, 0);
283 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
284
285 glEnableClientState(GL_VERTEX_ARRAY);
286 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
287 glDisableClientState(GL_NORMAL_ARRAY);
288 glDisableClientState(GL_COLOR_ARRAY);
289
290 glVertexPointer(2, GL_FIXED, 8, vtx);
291 glTexCoordPointer(2, GL_FIXED, 8, tex);
292 //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
293
294 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
295}
296
Jason Sams462d11b2009-06-19 16:03:18 -0700297extern "C" void pfBindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
Jason Samsd19f10d2009-05-22 14:03:28 -0700298{
Jason Sams462d11b2009-06-19 16:03:18 -0700299 GET_TLS();
300 rsi_ProgramFragmentBindTexture(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700301 static_cast<ProgramFragment *>(vpf),
302 slot,
303 static_cast<Allocation *>(va));
304
305}
306
Jason Sams462d11b2009-06-19 16:03:18 -0700307extern "C" void pfBindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700308{
Jason Sams462d11b2009-06-19 16:03:18 -0700309 GET_TLS();
310 rsi_ProgramFragmentBindSampler(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700311 static_cast<ProgramFragment *>(vpf),
312 slot,
313 static_cast<Sampler *>(vs));
314
315}
316
Jason Sams462d11b2009-06-19 16:03:18 -0700317extern "C" void contextBindProgramFragmentStore(RsProgramFragmentStore pfs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700318{
Jason Sams462d11b2009-06-19 16:03:18 -0700319 GET_TLS();
320 rsi_ContextBindProgramFragmentStore(rsc, pfs);
Jason Samsd19f10d2009-05-22 14:03:28 -0700321
322}
323
Jason Sams462d11b2009-06-19 16:03:18 -0700324extern "C" void contextBindProgramFragment(RsProgramFragment pf)
Jason Samsd19f10d2009-05-22 14:03:28 -0700325{
Jason Sams462d11b2009-06-19 16:03:18 -0700326 GET_TLS();
327 rsi_ContextBindProgramFragment(rsc, pf);
Jason Samsd19f10d2009-05-22 14:03:28 -0700328
329}
330
331
332static rsc_FunctionTable scriptCPtrTable = {
333 loadVp,
334 loadF,
335 loadI32,
336 loadU32,
337 loadEnvVec4,
338 loadEnvMatrix,
339
340 storeF,
341 storeI32,
342 storeU32,
343 storeEnvVec4,
344 storeEnvMatrix,
345
346 matrixLoadIdentity,
347 matrixLoadFloat,
348 matrixLoadMat,
349 matrixLoadRotate,
350 matrixLoadScale,
351 matrixLoadTranslate,
352 matrixLoadMultiply,
353 matrixMultiply,
354 matrixRotate,
355 matrixScale,
356 matrixTranslate,
357
358 color,
Jason Samsd19f10d2009-05-22 14:03:28 -0700359
360 pfBindTexture,
361 pfBindSampler,
362
363 materialDiffuse,
364 materialSpecular,
365 lightPosition,
366 materialShininess,
367 uploadToTexture,
368 enable,
369 disable,
370
371 scriptRand,
Jason Samsd19f10d2009-05-22 14:03:28 -0700372 contextBindProgramFragment,
Jason Samsfe08d992009-05-27 14:45:32 -0700373 contextBindProgramFragmentStore,
374
375
376 renderTriangleMesh,
377 renderTriangleMeshRange,
378
379 drawTriangleArray,
380 drawRect
381
Jason Samsd19f10d2009-05-22 14:03:28 -0700382};
383
384
Jason Sams462d11b2009-06-19 16:03:18 -0700385bool ScriptC::run(Context *rsc, uint32_t launchIndex)
Jason Samsd19f10d2009-05-22 14:03:28 -0700386{
Jason Sams462d11b2009-06-19 16:03:18 -0700387 Context::ScriptTLSStruct * tls =
388 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
Jason Sams3eaa3382009-06-10 15:04:38 -0700389
390 if (mEnviroment.mFragmentStore.get()) {
391 rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
392 }
393 if (mEnviroment.mFragment.get()) {
394 rsc->setFragment(mEnviroment.mFragment.get());
395 }
Jason Sams9c54bdb2009-06-17 16:52:59 -0700396 if (mEnviroment.mVertex.get()) {
397 rsc->setVertex(mEnviroment.mVertex.get());
398 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700399
Jason Sams462d11b2009-06-19 16:03:18 -0700400 tls->mScript = this;
401 return mProgram.mScript(launchIndex, &scriptCPtrTable) != 0;
402 tls->mScript = NULL;
Jason Samsd19f10d2009-05-22 14:03:28 -0700403}
404
405ScriptCState::ScriptCState()
406{
407 clear();
408}
409
410ScriptCState::~ScriptCState()
411{
Jack Palevichec5a20b2009-05-28 15:53:04 -0700412 if (mAccScript) {
413 accDeleteScript(mAccScript);
414 }
Jason Samsd19f10d2009-05-22 14:03:28 -0700415}
416
417void ScriptCState::clear()
418{
Jason Sams3a833d82009-06-08 15:20:31 -0700419 memset(&mProgram, 0, sizeof(mProgram));
420
Jason Samsd19f10d2009-05-22 14:03:28 -0700421 mConstantBufferTypes.clear();
Jason Sams3a833d82009-06-08 15:20:31 -0700422
423 memset(&mEnviroment, 0, sizeof(mEnviroment));
424 mEnviroment.mClearColor[0] = 0;
425 mEnviroment.mClearColor[1] = 0;
426 mEnviroment.mClearColor[2] = 0;
427 mEnviroment.mClearColor[3] = 1;
428 mEnviroment.mClearDepth = 1;
429 mEnviroment.mClearStencil = 0;
430 mEnviroment.mIsRoot = false;
Jason Sams3a833d82009-06-08 15:20:31 -0700431
Jack Palevichec5a20b2009-05-28 15:53:04 -0700432 mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700433
Jason Sams39ddc9502009-06-05 17:35:09 -0700434}
435
Jason Samsd5680f92009-06-10 18:39:40 -0700436
Jason Sams3eaa3382009-06-10 15:04:38 -0700437void ScriptCState::runCompiler(Context *rsc)
Jason Sams39ddc9502009-06-05 17:35:09 -0700438{
439 mAccScript = accCreateScript();
Jason Samsd5680f92009-06-10 18:39:40 -0700440 String8 tmp;
Jason Sams39ddc9502009-06-05 17:35:09 -0700441
Jason Samsd5680f92009-06-10 18:39:40 -0700442 rsc->appendNameDefines(&tmp);
443
444 const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
445 int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
446 accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
Jason Sams39ddc9502009-06-05 17:35:09 -0700447 accCompileScript(mAccScript);
Jason Sams3a833d82009-06-08 15:20:31 -0700448 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Samsda423d82009-06-09 12:15:30 -0700449 rsAssert(mProgram.mScript);
450
Jason Sams9c54bdb2009-06-17 16:52:59 -0700451 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
452 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
453 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsd5680f92009-06-10 18:39:40 -0700454
Jason Samsda423d82009-06-09 12:15:30 -0700455 if (mProgram.mScript) {
456 const static int pragmaMax = 16;
457 ACCsizei pragmaCount;
458 ACCchar * str[pragmaMax];
459 accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
460
Jason Samsda423d82009-06-09 12:15:30 -0700461 for (int ct=0; ct < pragmaCount; ct+=2) {
462 LOGE("pragma %i %s %s", ct, str[ct], str[ct+1]);
463
464 if (!strcmp(str[ct], "version")) {
465 continue;
466
467 }
468
469
470 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700471 if (!strcmp(str[ct+1], "default")) {
472 continue;
473 }
474 if (!strcmp(str[ct+1], "parent")) {
475 mEnviroment.mVertex.clear();
476 continue;
477 }
478 ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
479 if (pv != NULL) {
480 mEnviroment.mVertex.set(pv);
481 continue;
482 }
Jason Samsda423d82009-06-09 12:15:30 -0700483 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
484 }
485
486 if (!strcmp(str[ct], "stateRaster")) {
Jason Samsda423d82009-06-09 12:15:30 -0700487 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
488 }
489
490 if (!strcmp(str[ct], "stateFragment")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700491 if (!strcmp(str[ct+1], "default")) {
492 continue;
493 }
494 if (!strcmp(str[ct+1], "parent")) {
495 mEnviroment.mFragment.clear();
496 continue;
497 }
498 ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
Jason Sams3eaa3382009-06-10 15:04:38 -0700499 if (pf != NULL) {
500 mEnviroment.mFragment.set(pf);
Jason Samsda423d82009-06-09 12:15:30 -0700501 continue;
502 }
503 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
504 }
505
506 if (!strcmp(str[ct], "stateFragmentStore")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700507 if (!strcmp(str[ct+1], "default")) {
508 continue;
509 }
510 if (!strcmp(str[ct+1], "parent")) {
511 mEnviroment.mFragmentStore.clear();
512 continue;
513 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700514 ProgramFragmentStore * pfs =
515 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
516 if (pfs != NULL) {
517 mEnviroment.mFragmentStore.set(pfs);
Jason Samsda423d82009-06-09 12:15:30 -0700518 continue;
519 }
Jason Samsda423d82009-06-09 12:15:30 -0700520 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
521 }
522
523 }
524
525
526 } else {
527 // Deal with an error.
528 }
529
Jason Samsd19f10d2009-05-22 14:03:28 -0700530}
531
532namespace android {
533namespace renderscript {
534
535void rsi_ScriptCBegin(Context * rsc)
536{
537 ScriptCState *ss = &rsc->mScriptC;
538 ss->clear();
539}
540
541void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
542{
543 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700544 ss->mEnviroment.mClearColor[0] = r;
545 ss->mEnviroment.mClearColor[1] = g;
546 ss->mEnviroment.mClearColor[2] = b;
547 ss->mEnviroment.mClearColor[3] = a;
Jason Samsd19f10d2009-05-22 14:03:28 -0700548}
549
550void rsi_ScriptCSetClearDepth(Context * rsc, float v)
551{
552 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700553 ss->mEnviroment.mClearDepth = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700554}
555
556void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
557{
558 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700559 ss->mEnviroment.mClearStencil = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700560}
561
562void rsi_ScriptCAddType(Context * rsc, RsType vt)
563{
564 ScriptCState *ss = &rsc->mScriptC;
565 ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
566}
567
Jason Sams3a833d82009-06-08 15:20:31 -0700568void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Samsd19f10d2009-05-22 14:03:28 -0700569{
570 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700571 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Samsd19f10d2009-05-22 14:03:28 -0700572}
573
574void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
575{
576 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700577 ss->mEnviroment.mIsRoot = isRoot;
Jason Samsd19f10d2009-05-22 14:03:28 -0700578}
579
Jason Sams39ddc9502009-06-05 17:35:09 -0700580void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
581{
582 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700583 ss->mProgram.mScriptText = text;
584 ss->mProgram.mScriptTextLength = len;
Jason Sams39ddc9502009-06-05 17:35:09 -0700585}
586
587
Jason Samsd19f10d2009-05-22 14:03:28 -0700588RsScript rsi_ScriptCCreate(Context * rsc)
589{
590 ScriptCState *ss = &rsc->mScriptC;
591
Jason Sams3eaa3382009-06-10 15:04:38 -0700592 ss->runCompiler(rsc);
Jason Sams39ddc9502009-06-05 17:35:09 -0700593
Jason Samsd19f10d2009-05-22 14:03:28 -0700594 ScriptC *s = new ScriptC();
Jason Sams3a833d82009-06-08 15:20:31 -0700595 s->incRef();
Jack Palevichec5a20b2009-05-28 15:53:04 -0700596 s->mAccScript = ss->mAccScript;
597 ss->mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700598 s->mEnviroment = ss->mEnviroment;
599 s->mProgram = ss->mProgram;
600 ss->clear();
Jason Samsda423d82009-06-09 12:15:30 -0700601
Jason Samsd19f10d2009-05-22 14:03:28 -0700602 return s;
603}
604
605}
606}
607
608