blob: e170b8ca9d8fb005be9e5ba00a48f1ab6a673bbe [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 Samsaf49c742009-06-19 18:33:44 -070046extern "C" float fixedToFloat(int32_t f)
47{
48 return ((float)f) / 0x10000;
49}
50
51extern "C" float intToFloat(int32_t f)
52{
53 return (float)f;
54}
55
Jason Sams462d11b2009-06-19 16:03:18 -070056extern "C" void matrixLoadIdentity(rsc_Matrix *mat)
Jason Samsd19f10d2009-05-22 14:03:28 -070057{
58 Matrix *m = reinterpret_cast<Matrix *>(mat);
59 m->loadIdentity();
60}
61
Jason Sams462d11b2009-06-19 16:03:18 -070062extern "C" void matrixLoadFloat(rsc_Matrix *mat, const float *f)
Jason Samsd19f10d2009-05-22 14:03:28 -070063{
64 Matrix *m = reinterpret_cast<Matrix *>(mat);
65 m->load(f);
66}
67
Jason Sams462d11b2009-06-19 16:03:18 -070068extern "C" void matrixLoadMat(rsc_Matrix *mat, const rsc_Matrix *newmat)
Jason Samsd19f10d2009-05-22 14:03:28 -070069{
70 Matrix *m = reinterpret_cast<Matrix *>(mat);
71 m->load(reinterpret_cast<const Matrix *>(newmat));
72}
73
Jason Sams462d11b2009-06-19 16:03:18 -070074extern "C" void matrixLoadRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070075{
76 Matrix *m = reinterpret_cast<Matrix *>(mat);
77 m->loadRotate(rot, x, y, z);
78}
79
Jason Sams462d11b2009-06-19 16:03:18 -070080extern "C" void matrixLoadScale(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070081{
82 Matrix *m = reinterpret_cast<Matrix *>(mat);
83 m->loadScale(x, y, z);
84}
85
Jason Sams462d11b2009-06-19 16:03:18 -070086extern "C" void matrixLoadTranslate(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070087{
88 Matrix *m = reinterpret_cast<Matrix *>(mat);
89 m->loadTranslate(x, y, z);
90}
91
Jason Sams462d11b2009-06-19 16:03:18 -070092extern "C" void matrixLoadMultiply(rsc_Matrix *mat, const rsc_Matrix *lhs, const rsc_Matrix *rhs)
Jason Samsd19f10d2009-05-22 14:03:28 -070093{
94 Matrix *m = reinterpret_cast<Matrix *>(mat);
95 m->loadMultiply(reinterpret_cast<const Matrix *>(lhs),
96 reinterpret_cast<const Matrix *>(rhs));
97}
98
Jason Sams462d11b2009-06-19 16:03:18 -070099extern "C" void matrixMultiply(rsc_Matrix *mat, const rsc_Matrix *rhs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700100{
101 Matrix *m = reinterpret_cast<Matrix *>(mat);
102 m->multiply(reinterpret_cast<const Matrix *>(rhs));
103}
104
Jason Sams462d11b2009-06-19 16:03:18 -0700105extern "C" void matrixRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -0700106{
107 Matrix *m = reinterpret_cast<Matrix *>(mat);
108 m->rotate(rot, x, y, z);
109}
110
Jason Sams462d11b2009-06-19 16:03:18 -0700111extern "C" void matrixScale(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -0700112{
113 Matrix *m = reinterpret_cast<Matrix *>(mat);
114 m->scale(x, y, z);
115}
116
Jason Sams462d11b2009-06-19 16:03:18 -0700117extern "C" void matrixTranslate(rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -0700118{
119 Matrix *m = reinterpret_cast<Matrix *>(mat);
120 m->translate(x, y, z);
121}
122
123
Jason Sams462d11b2009-06-19 16:03:18 -0700124extern "C" const void * loadVp(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700125{
Jason Sams462d11b2009-06-19 16:03:18 -0700126 GET_TLS();
127 return &static_cast<const uint8_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700128}
129
Jason Sams462d11b2009-06-19 16:03:18 -0700130extern "C" float loadF(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700131{
Jason Sams462d11b2009-06-19 16:03:18 -0700132 GET_TLS();
133 return static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700134}
135
Jason Sams462d11b2009-06-19 16:03:18 -0700136extern "C" int32_t loadI32(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700137{
Jason Sams462d11b2009-06-19 16:03:18 -0700138 GET_TLS();
139 return static_cast<const int32_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700140}
141
Jason Sams462d11b2009-06-19 16:03:18 -0700142extern "C" uint32_t loadU32(uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700143{
Jason Sams462d11b2009-06-19 16:03:18 -0700144 GET_TLS();
145 return static_cast<const uint32_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Samsd19f10d2009-05-22 14:03:28 -0700146}
147
Jason Sams462d11b2009-06-19 16:03:18 -0700148extern "C" void loadEnvVec4(uint32_t bank, uint32_t offset, rsc_Vector4 *v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700149{
Jason Sams462d11b2009-06-19 16:03:18 -0700150 GET_TLS();
151 memcpy(v, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Vector4));
Jason Samsd19f10d2009-05-22 14:03:28 -0700152}
153
Jason Sams462d11b2009-06-19 16:03:18 -0700154extern "C" void loadEnvMatrix(uint32_t bank, uint32_t offset, rsc_Matrix *m)
Jason Samsd19f10d2009-05-22 14:03:28 -0700155{
Jason Sams462d11b2009-06-19 16:03:18 -0700156 GET_TLS();
157 memcpy(m, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Matrix));
Jason Samsd19f10d2009-05-22 14:03:28 -0700158}
159
160
Jason Sams462d11b2009-06-19 16:03:18 -0700161extern "C" void storeF(uint32_t bank, uint32_t offset, float v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700162{
Jason Sams462d11b2009-06-19 16:03:18 -0700163 GET_TLS();
164 static_cast<float *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700165}
166
Jason Sams462d11b2009-06-19 16:03:18 -0700167extern "C" void storeI32(uint32_t bank, uint32_t offset, int32_t v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700168{
Jason Sams462d11b2009-06-19 16:03:18 -0700169 GET_TLS();
170 static_cast<int32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700171}
172
Jason Sams462d11b2009-06-19 16:03:18 -0700173extern "C" void storeU32(uint32_t bank, uint32_t offset, uint32_t v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700174{
Jason Sams462d11b2009-06-19 16:03:18 -0700175 GET_TLS();
176 static_cast<uint32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700177}
178
Jason Sams462d11b2009-06-19 16:03:18 -0700179extern "C" void storeEnvVec4(uint32_t bank, uint32_t offset, const rsc_Vector4 *v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700180{
Jason Sams462d11b2009-06-19 16:03:18 -0700181 GET_TLS();
182 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], v, sizeof(rsc_Vector4));
Jason Samsd19f10d2009-05-22 14:03:28 -0700183}
184
Jason Sams462d11b2009-06-19 16:03:18 -0700185extern "C" void storeEnvMatrix(uint32_t bank, uint32_t offset, const rsc_Matrix *m)
Jason Samsd19f10d2009-05-22 14:03:28 -0700186{
Jason Sams462d11b2009-06-19 16:03:18 -0700187 GET_TLS();
188 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], m, sizeof(rsc_Matrix));
Jason Samsd19f10d2009-05-22 14:03:28 -0700189}
190
191
Jason Sams462d11b2009-06-19 16:03:18 -0700192extern "C" void color(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700193{
Jason Samsd19f10d2009-05-22 14:03:28 -0700194 glColor4f(r, g, b, a);
195}
196
Jason Sams462d11b2009-06-19 16:03:18 -0700197extern "C" void renderTriangleMesh(RsTriangleMesh mesh)
Jason Samsd19f10d2009-05-22 14:03:28 -0700198{
Jason Sams462d11b2009-06-19 16:03:18 -0700199 GET_TLS();
200 rsi_TriangleMeshRender(rsc, mesh);
Jason Samsd19f10d2009-05-22 14:03:28 -0700201}
202
Jason Sams462d11b2009-06-19 16:03:18 -0700203extern "C" void renderTriangleMeshRange(RsTriangleMesh mesh, uint32_t start, uint32_t count)
Jason Samsd19f10d2009-05-22 14:03:28 -0700204{
Jason Sams462d11b2009-06-19 16:03:18 -0700205 GET_TLS();
206 rsi_TriangleMeshRenderRange(rsc, mesh, start, count);
Jason Samsd19f10d2009-05-22 14:03:28 -0700207}
208
Jason Sams462d11b2009-06-19 16:03:18 -0700209extern "C" void materialDiffuse(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700210{
Jason Samsd19f10d2009-05-22 14:03:28 -0700211 float v[] = {r, g, b, a};
212 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, v);
213}
214
Jason Sams462d11b2009-06-19 16:03:18 -0700215extern "C" void materialSpecular(float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700216{
Jason Samsd19f10d2009-05-22 14:03:28 -0700217 float v[] = {r, g, b, a};
218 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, v);
219}
220
Jason Sams462d11b2009-06-19 16:03:18 -0700221extern "C" void lightPosition(float x, float y, float z, float w)
Jason Samsd19f10d2009-05-22 14:03:28 -0700222{
Jason Samsd19f10d2009-05-22 14:03:28 -0700223 float v[] = {x, y, z, w};
224 glLightfv(GL_LIGHT0, GL_POSITION, v);
225}
226
Jason Sams462d11b2009-06-19 16:03:18 -0700227extern "C" void materialShininess(float s)
Jason Samsd19f10d2009-05-22 14:03:28 -0700228{
Jason Samsd19f10d2009-05-22 14:03:28 -0700229 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &s);
230}
231
Jason Sams462d11b2009-06-19 16:03:18 -0700232extern "C" void uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
Jason Samsd19f10d2009-05-22 14:03:28 -0700233{
Jason Sams462d11b2009-06-19 16:03:18 -0700234 GET_TLS();
235 rsi_AllocationUploadToTexture(rsc, va, baseMipLevel);
Jason Samsd19f10d2009-05-22 14:03:28 -0700236}
237
Jason Sams462d11b2009-06-19 16:03:18 -0700238extern "C" void enable(uint32_t p)
Jason Samsd19f10d2009-05-22 14:03:28 -0700239{
Jason Samsd19f10d2009-05-22 14:03:28 -0700240 glEnable(p);
241}
242
Jason Sams462d11b2009-06-19 16:03:18 -0700243extern "C" void disable(uint32_t p)
Jason Samsd19f10d2009-05-22 14:03:28 -0700244{
Jason Samsd19f10d2009-05-22 14:03:28 -0700245 glDisable(p);
246}
247
Jason Sams462d11b2009-06-19 16:03:18 -0700248extern "C" uint32_t scriptRand(uint32_t max)
Jason Samsd19f10d2009-05-22 14:03:28 -0700249{
250 return (uint32_t)(((float)rand()) * max / RAND_MAX);
251}
252
253// Assumes (GL_FIXED) x,y,z (GL_UNSIGNED_BYTE)r,g,b,a
Jason Sams462d11b2009-06-19 16:03:18 -0700254extern "C" void drawTriangleArray(RsAllocation alloc, uint32_t count)
Jason Samsd19f10d2009-05-22 14:03:28 -0700255{
Jason Sams462d11b2009-06-19 16:03:18 -0700256 GET_TLS();
257
Jason Samsd19f10d2009-05-22 14:03:28 -0700258 const Allocation *a = (const Allocation *)alloc;
259 const uint32_t *ptr = (const uint32_t *)a->getPtr();
260
Jason Sams462d11b2009-06-19 16:03:18 -0700261 rsc->setupCheck();
Jason Samsd19f10d2009-05-22 14:03:28 -0700262
263 glBindBuffer(GL_ARRAY_BUFFER, 0);
264 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
265
266 glEnableClientState(GL_VERTEX_ARRAY);
267 glDisableClientState(GL_NORMAL_ARRAY);
268 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
269 glEnableClientState(GL_COLOR_ARRAY);
270
271 glVertexPointer(2, GL_FIXED, 12, ptr + 1);
272 //glTexCoordPointer(2, GL_FIXED, 24, ptr + 1);
273 glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
274
275 glDrawArrays(GL_TRIANGLES, 0, count * 3);
276}
277
Jason Sams462d11b2009-06-19 16:03:18 -0700278extern "C" void drawRect(int32_t x1, int32_t x2, int32_t y1, int32_t y2)
Jason Samsfe08d992009-05-27 14:45:32 -0700279{
Jason Sams462d11b2009-06-19 16:03:18 -0700280 GET_TLS();
Jason Samsfe08d992009-05-27 14:45:32 -0700281 x1 = (x1 << 16);
282 x2 = (x2 << 16);
283 y1 = (y1 << 16);
284 y2 = (y2 << 16);
285
286 int32_t vtx[] = {x1,y1, x1,y2, x2,y1, x2,y2};
287 static const int32_t tex[] = {0,0, 0,0x10000, 0x10000,0, 0x10000,0x10000};
288
289
Jason Sams462d11b2009-06-19 16:03:18 -0700290 rsc->setupCheck();
Jason Samsfe08d992009-05-27 14:45:32 -0700291
292 glBindBuffer(GL_ARRAY_BUFFER, 0);
293 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
294
295 glEnableClientState(GL_VERTEX_ARRAY);
296 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
297 glDisableClientState(GL_NORMAL_ARRAY);
298 glDisableClientState(GL_COLOR_ARRAY);
299
300 glVertexPointer(2, GL_FIXED, 8, vtx);
301 glTexCoordPointer(2, GL_FIXED, 8, tex);
302 //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
303
304 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
305}
306
Jason Sams462d11b2009-06-19 16:03:18 -0700307extern "C" void pfBindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
Jason Samsd19f10d2009-05-22 14:03:28 -0700308{
Jason Sams462d11b2009-06-19 16:03:18 -0700309 GET_TLS();
310 rsi_ProgramFragmentBindTexture(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700311 static_cast<ProgramFragment *>(vpf),
312 slot,
313 static_cast<Allocation *>(va));
314
315}
316
Jason Sams462d11b2009-06-19 16:03:18 -0700317extern "C" void pfBindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700318{
Jason Sams462d11b2009-06-19 16:03:18 -0700319 GET_TLS();
320 rsi_ProgramFragmentBindSampler(rsc,
Jason Samsd19f10d2009-05-22 14:03:28 -0700321 static_cast<ProgramFragment *>(vpf),
322 slot,
323 static_cast<Sampler *>(vs));
324
325}
326
Jason Sams462d11b2009-06-19 16:03:18 -0700327extern "C" void contextBindProgramFragmentStore(RsProgramFragmentStore pfs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700328{
Jason Sams462d11b2009-06-19 16:03:18 -0700329 GET_TLS();
330 rsi_ContextBindProgramFragmentStore(rsc, pfs);
Jason Samsd19f10d2009-05-22 14:03:28 -0700331
332}
333
Jason Sams462d11b2009-06-19 16:03:18 -0700334extern "C" void contextBindProgramFragment(RsProgramFragment pf)
Jason Samsd19f10d2009-05-22 14:03:28 -0700335{
Jason Sams462d11b2009-06-19 16:03:18 -0700336 GET_TLS();
337 rsi_ContextBindProgramFragment(rsc, pf);
Jason Samsd19f10d2009-05-22 14:03:28 -0700338
339}
340
341
342static rsc_FunctionTable scriptCPtrTable = {
343 loadVp,
344 loadF,
345 loadI32,
346 loadU32,
347 loadEnvVec4,
348 loadEnvMatrix,
349
350 storeF,
351 storeI32,
352 storeU32,
353 storeEnvVec4,
354 storeEnvMatrix,
355
356 matrixLoadIdentity,
357 matrixLoadFloat,
358 matrixLoadMat,
359 matrixLoadRotate,
360 matrixLoadScale,
361 matrixLoadTranslate,
362 matrixLoadMultiply,
363 matrixMultiply,
364 matrixRotate,
365 matrixScale,
366 matrixTranslate,
367
368 color,
Jason Samsd19f10d2009-05-22 14:03:28 -0700369
370 pfBindTexture,
371 pfBindSampler,
372
373 materialDiffuse,
374 materialSpecular,
375 lightPosition,
376 materialShininess,
377 uploadToTexture,
378 enable,
379 disable,
380
381 scriptRand,
Jason Samsd19f10d2009-05-22 14:03:28 -0700382 contextBindProgramFragment,
Jason Samsfe08d992009-05-27 14:45:32 -0700383 contextBindProgramFragmentStore,
384
385
386 renderTriangleMesh,
387 renderTriangleMeshRange,
388
389 drawTriangleArray,
390 drawRect
391
Jason Samsd19f10d2009-05-22 14:03:28 -0700392};
393
394
Jason Sams462d11b2009-06-19 16:03:18 -0700395bool ScriptC::run(Context *rsc, uint32_t launchIndex)
Jason Samsd19f10d2009-05-22 14:03:28 -0700396{
Jason Sams462d11b2009-06-19 16:03:18 -0700397 Context::ScriptTLSStruct * tls =
398 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
Jason Sams3eaa3382009-06-10 15:04:38 -0700399
400 if (mEnviroment.mFragmentStore.get()) {
401 rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
402 }
403 if (mEnviroment.mFragment.get()) {
404 rsc->setFragment(mEnviroment.mFragment.get());
405 }
Jason Sams9c54bdb2009-06-17 16:52:59 -0700406 if (mEnviroment.mVertex.get()) {
407 rsc->setVertex(mEnviroment.mVertex.get());
408 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700409
Jason Sams462d11b2009-06-19 16:03:18 -0700410 tls->mScript = this;
411 return mProgram.mScript(launchIndex, &scriptCPtrTable) != 0;
412 tls->mScript = NULL;
Jason Samsd19f10d2009-05-22 14:03:28 -0700413}
414
415ScriptCState::ScriptCState()
416{
417 clear();
418}
419
420ScriptCState::~ScriptCState()
421{
Jack Palevichec5a20b2009-05-28 15:53:04 -0700422 if (mAccScript) {
423 accDeleteScript(mAccScript);
424 }
Jason Samsd19f10d2009-05-22 14:03:28 -0700425}
426
427void ScriptCState::clear()
428{
Jason Sams3a833d82009-06-08 15:20:31 -0700429 memset(&mProgram, 0, sizeof(mProgram));
430
Jason Samsd19f10d2009-05-22 14:03:28 -0700431 mConstantBufferTypes.clear();
Jason Sams3a833d82009-06-08 15:20:31 -0700432
433 memset(&mEnviroment, 0, sizeof(mEnviroment));
434 mEnviroment.mClearColor[0] = 0;
435 mEnviroment.mClearColor[1] = 0;
436 mEnviroment.mClearColor[2] = 0;
437 mEnviroment.mClearColor[3] = 1;
438 mEnviroment.mClearDepth = 1;
439 mEnviroment.mClearStencil = 0;
440 mEnviroment.mIsRoot = false;
Jason Sams3a833d82009-06-08 15:20:31 -0700441
Jack Palevichec5a20b2009-05-28 15:53:04 -0700442 mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700443
Jason Sams39ddc9502009-06-05 17:35:09 -0700444}
445
Jason Samsd5680f92009-06-10 18:39:40 -0700446
Jason Sams3eaa3382009-06-10 15:04:38 -0700447void ScriptCState::runCompiler(Context *rsc)
Jason Sams39ddc9502009-06-05 17:35:09 -0700448{
449 mAccScript = accCreateScript();
Jason Samsd5680f92009-06-10 18:39:40 -0700450 String8 tmp;
Jason Sams39ddc9502009-06-05 17:35:09 -0700451
Jason Samsd5680f92009-06-10 18:39:40 -0700452 rsc->appendNameDefines(&tmp);
453
454 const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
455 int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
456 accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
Jason Sams39ddc9502009-06-05 17:35:09 -0700457 accCompileScript(mAccScript);
Jason Sams3a833d82009-06-08 15:20:31 -0700458 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Samsda423d82009-06-09 12:15:30 -0700459 rsAssert(mProgram.mScript);
460
Jason Sams9c54bdb2009-06-17 16:52:59 -0700461 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
462 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
463 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsd5680f92009-06-10 18:39:40 -0700464
Jason Samsda423d82009-06-09 12:15:30 -0700465 if (mProgram.mScript) {
466 const static int pragmaMax = 16;
467 ACCsizei pragmaCount;
468 ACCchar * str[pragmaMax];
469 accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
470
Jason Samsda423d82009-06-09 12:15:30 -0700471 for (int ct=0; ct < pragmaCount; ct+=2) {
472 LOGE("pragma %i %s %s", ct, str[ct], str[ct+1]);
473
474 if (!strcmp(str[ct], "version")) {
475 continue;
476
477 }
478
479
480 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700481 if (!strcmp(str[ct+1], "default")) {
482 continue;
483 }
484 if (!strcmp(str[ct+1], "parent")) {
485 mEnviroment.mVertex.clear();
486 continue;
487 }
488 ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
489 if (pv != NULL) {
490 mEnviroment.mVertex.set(pv);
491 continue;
492 }
Jason Samsda423d82009-06-09 12:15:30 -0700493 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
494 }
495
496 if (!strcmp(str[ct], "stateRaster")) {
Jason Samsda423d82009-06-09 12:15:30 -0700497 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
498 }
499
500 if (!strcmp(str[ct], "stateFragment")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700501 if (!strcmp(str[ct+1], "default")) {
502 continue;
503 }
504 if (!strcmp(str[ct+1], "parent")) {
505 mEnviroment.mFragment.clear();
506 continue;
507 }
508 ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
Jason Sams3eaa3382009-06-10 15:04:38 -0700509 if (pf != NULL) {
510 mEnviroment.mFragment.set(pf);
Jason Samsda423d82009-06-09 12:15:30 -0700511 continue;
512 }
513 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
514 }
515
516 if (!strcmp(str[ct], "stateFragmentStore")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700517 if (!strcmp(str[ct+1], "default")) {
518 continue;
519 }
520 if (!strcmp(str[ct+1], "parent")) {
521 mEnviroment.mFragmentStore.clear();
522 continue;
523 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700524 ProgramFragmentStore * pfs =
525 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
526 if (pfs != NULL) {
527 mEnviroment.mFragmentStore.set(pfs);
Jason Samsda423d82009-06-09 12:15:30 -0700528 continue;
529 }
Jason Samsda423d82009-06-09 12:15:30 -0700530 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
531 }
532
533 }
534
535
536 } else {
537 // Deal with an error.
538 }
539
Jason Samsd19f10d2009-05-22 14:03:28 -0700540}
541
542namespace android {
543namespace renderscript {
544
545void rsi_ScriptCBegin(Context * rsc)
546{
547 ScriptCState *ss = &rsc->mScriptC;
548 ss->clear();
549}
550
551void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
552{
553 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700554 ss->mEnviroment.mClearColor[0] = r;
555 ss->mEnviroment.mClearColor[1] = g;
556 ss->mEnviroment.mClearColor[2] = b;
557 ss->mEnviroment.mClearColor[3] = a;
Jason Samsd19f10d2009-05-22 14:03:28 -0700558}
559
560void rsi_ScriptCSetClearDepth(Context * rsc, float v)
561{
562 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700563 ss->mEnviroment.mClearDepth = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700564}
565
566void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
567{
568 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700569 ss->mEnviroment.mClearStencil = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700570}
571
572void rsi_ScriptCAddType(Context * rsc, RsType vt)
573{
574 ScriptCState *ss = &rsc->mScriptC;
575 ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
576}
577
Jason Sams3a833d82009-06-08 15:20:31 -0700578void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Samsd19f10d2009-05-22 14:03:28 -0700579{
580 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700581 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Samsd19f10d2009-05-22 14:03:28 -0700582}
583
584void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
585{
586 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700587 ss->mEnviroment.mIsRoot = isRoot;
Jason Samsd19f10d2009-05-22 14:03:28 -0700588}
589
Jason Sams39ddc9502009-06-05 17:35:09 -0700590void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
591{
592 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700593 ss->mProgram.mScriptText = text;
594 ss->mProgram.mScriptTextLength = len;
Jason Sams39ddc9502009-06-05 17:35:09 -0700595}
596
597
Jason Samsd19f10d2009-05-22 14:03:28 -0700598RsScript rsi_ScriptCCreate(Context * rsc)
599{
600 ScriptCState *ss = &rsc->mScriptC;
601
Jason Sams3eaa3382009-06-10 15:04:38 -0700602 ss->runCompiler(rsc);
Jason Sams39ddc9502009-06-05 17:35:09 -0700603
Jason Samsd19f10d2009-05-22 14:03:28 -0700604 ScriptC *s = new ScriptC();
Jason Sams3a833d82009-06-08 15:20:31 -0700605 s->incRef();
Jack Palevichec5a20b2009-05-28 15:53:04 -0700606 s->mAccScript = ss->mAccScript;
607 ss->mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700608 s->mEnviroment = ss->mEnviroment;
609 s->mProgram = ss->mProgram;
610 ss->clear();
Jason Samsda423d82009-06-09 12:15:30 -0700611
Jason Samsd19f10d2009-05-22 14:03:28 -0700612 return s;
613}
614
615}
616}
617
618