blob: c650656304ab2ed3863f26bca6a0fb920caffbdc [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
27
28ScriptC::ScriptC()
29{
Jack Palevichec5a20b2009-05-28 15:53:04 -070030 mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -070031 memset(&mProgram, 0, sizeof(mProgram));
Jason Samsd19f10d2009-05-22 14:03:28 -070032}
33
34ScriptC::~ScriptC()
35{
Jack Palevichec5a20b2009-05-28 15:53:04 -070036 if (mAccScript) {
37 accDeleteScript(mAccScript);
38 }
Jason Samsd19f10d2009-05-22 14:03:28 -070039}
40
Jack Palevich55d45222009-05-26 18:58:04 -070041extern "C" void matrixLoadIdentity(void *con, rsc_Matrix *mat)
Jason Samsd19f10d2009-05-22 14:03:28 -070042{
43 Matrix *m = reinterpret_cast<Matrix *>(mat);
44 m->loadIdentity();
45}
46
Jack Palevich55d45222009-05-26 18:58:04 -070047extern "C" void matrixLoadFloat(void *con, rsc_Matrix *mat, const float *f)
Jason Samsd19f10d2009-05-22 14:03:28 -070048{
49 Matrix *m = reinterpret_cast<Matrix *>(mat);
50 m->load(f);
51}
52
Jack Palevich55d45222009-05-26 18:58:04 -070053extern "C" void matrixLoadMat(void *con, rsc_Matrix *mat, const rsc_Matrix *newmat)
Jason Samsd19f10d2009-05-22 14:03:28 -070054{
55 Matrix *m = reinterpret_cast<Matrix *>(mat);
56 m->load(reinterpret_cast<const Matrix *>(newmat));
57}
58
Jack Palevich55d45222009-05-26 18:58:04 -070059extern "C" void matrixLoadRotate(void *con, rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070060{
61 Matrix *m = reinterpret_cast<Matrix *>(mat);
62 m->loadRotate(rot, x, y, z);
63}
64
Jack Palevich55d45222009-05-26 18:58:04 -070065extern "C" void matrixLoadScale(void *con, rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070066{
67 Matrix *m = reinterpret_cast<Matrix *>(mat);
68 m->loadScale(x, y, z);
69}
70
Jack Palevich55d45222009-05-26 18:58:04 -070071extern "C" void matrixLoadTranslate(void *con, rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070072{
73 Matrix *m = reinterpret_cast<Matrix *>(mat);
74 m->loadTranslate(x, y, z);
75}
76
Jack Palevich55d45222009-05-26 18:58:04 -070077extern "C" void matrixLoadMultiply(void *con, rsc_Matrix *mat, const rsc_Matrix *lhs, const rsc_Matrix *rhs)
Jason Samsd19f10d2009-05-22 14:03:28 -070078{
79 Matrix *m = reinterpret_cast<Matrix *>(mat);
80 m->loadMultiply(reinterpret_cast<const Matrix *>(lhs),
81 reinterpret_cast<const Matrix *>(rhs));
82}
83
Jack Palevich55d45222009-05-26 18:58:04 -070084extern "C" void matrixMultiply(void *con, rsc_Matrix *mat, const rsc_Matrix *rhs)
Jason Samsd19f10d2009-05-22 14:03:28 -070085{
86 Matrix *m = reinterpret_cast<Matrix *>(mat);
87 m->multiply(reinterpret_cast<const Matrix *>(rhs));
88}
89
Jack Palevich55d45222009-05-26 18:58:04 -070090extern "C" void matrixRotate(void *con, rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070091{
92 Matrix *m = reinterpret_cast<Matrix *>(mat);
93 m->rotate(rot, x, y, z);
94}
95
Jack Palevich55d45222009-05-26 18:58:04 -070096extern "C" void matrixScale(void *con, rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -070097{
98 Matrix *m = reinterpret_cast<Matrix *>(mat);
99 m->scale(x, y, z);
100}
101
Jack Palevich55d45222009-05-26 18:58:04 -0700102extern "C" void matrixTranslate(void *con, rsc_Matrix *mat, float x, float y, float z)
Jason Samsd19f10d2009-05-22 14:03:28 -0700103{
104 Matrix *m = reinterpret_cast<Matrix *>(mat);
105 m->translate(x, y, z);
106}
107
108
Jack Palevich55d45222009-05-26 18:58:04 -0700109extern "C" const void * loadVp(void *vp, uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700110{
111 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
112 return &static_cast<const uint8_t *>(env->mScript->mSlots[bank]->getPtr())[offset];
113}
114
Jack Palevich55d45222009-05-26 18:58:04 -0700115extern "C" float loadF(void *vp, uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700116{
117 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
118 //LOGE("bank %i, offset %i", bank, offset);
119 //LOGE("%p", env->mScript->mSlots[bank]->getPtr());
120 return static_cast<const float *>(env->mScript->mSlots[bank]->getPtr())[offset];
121}
122
Jack Palevich55d45222009-05-26 18:58:04 -0700123extern "C" int32_t loadI32(void *vp, uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700124{
125 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
126 return static_cast<const int32_t *>(env->mScript->mSlots[bank]->getPtr())[offset];
127}
128
Jack Palevich55d45222009-05-26 18:58:04 -0700129extern "C" uint32_t loadU32(void *vp, uint32_t bank, uint32_t offset)
Jason Samsd19f10d2009-05-22 14:03:28 -0700130{
131 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
132 return static_cast<const uint32_t *>(env->mScript->mSlots[bank]->getPtr())[offset];
133}
134
Jack Palevich55d45222009-05-26 18:58:04 -0700135extern "C" void loadEnvVec4(void *vp, uint32_t bank, uint32_t offset, rsc_Vector4 *v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700136{
137 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
138 memcpy(v, &static_cast<const float *>(env->mScript->mSlots[bank]->getPtr())[offset], sizeof(rsc_Vector4));
139}
140
Jack Palevich55d45222009-05-26 18:58:04 -0700141extern "C" void loadEnvMatrix(void *vp, uint32_t bank, uint32_t offset, rsc_Matrix *m)
Jason Samsd19f10d2009-05-22 14:03:28 -0700142{
143 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
144 memcpy(m, &static_cast<const float *>(env->mScript->mSlots[bank]->getPtr())[offset], sizeof(rsc_Matrix));
145}
146
147
Jack Palevich55d45222009-05-26 18:58:04 -0700148extern "C" void storeF(void *vp, uint32_t bank, uint32_t offset, float v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700149{
150 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
151 static_cast<float *>(env->mScript->mSlots[bank]->getPtr())[offset] = v;
152}
153
Jack Palevich55d45222009-05-26 18:58:04 -0700154extern "C" void storeI32(void *vp, uint32_t bank, uint32_t offset, int32_t v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700155{
156 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
157 static_cast<int32_t *>(env->mScript->mSlots[bank]->getPtr())[offset] = v;
158}
159
Jack Palevich55d45222009-05-26 18:58:04 -0700160extern "C" void storeU32(void *vp, uint32_t bank, uint32_t offset, uint32_t v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700161{
162 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
163 static_cast<uint32_t *>(env->mScript->mSlots[bank]->getPtr())[offset] = v;
164}
165
Jack Palevich55d45222009-05-26 18:58:04 -0700166extern "C" void storeEnvVec4(void *vp, uint32_t bank, uint32_t offset, const rsc_Vector4 *v)
Jason Samsd19f10d2009-05-22 14:03:28 -0700167{
168 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
169 memcpy(&static_cast<float *>(env->mScript->mSlots[bank]->getPtr())[offset], v, sizeof(rsc_Vector4));
170}
171
Jack Palevich55d45222009-05-26 18:58:04 -0700172extern "C" void storeEnvMatrix(void *vp, uint32_t bank, uint32_t offset, const rsc_Matrix *m)
Jason Samsd19f10d2009-05-22 14:03:28 -0700173{
174 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
175 memcpy(&static_cast<float *>(env->mScript->mSlots[bank]->getPtr())[offset], m, sizeof(rsc_Matrix));
176}
177
178
Jack Palevich55d45222009-05-26 18:58:04 -0700179extern "C" void color(void *vp, float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700180{
181 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
182 glColor4f(r, g, b, a);
183}
184
Jack Palevich55d45222009-05-26 18:58:04 -0700185extern "C" void renderTriangleMesh(void *vp, RsTriangleMesh mesh)
Jason Samsd19f10d2009-05-22 14:03:28 -0700186{
187 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
188 rsi_TriangleMeshRender(env->mContext, mesh);
189}
190
Jack Palevich55d45222009-05-26 18:58:04 -0700191extern "C" void renderTriangleMeshRange(void *vp, RsTriangleMesh mesh, uint32_t start, uint32_t count)
Jason Samsd19f10d2009-05-22 14:03:28 -0700192{
193 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
194 rsi_TriangleMeshRenderRange(env->mContext, mesh, start, count);
195}
196
Jack Palevich55d45222009-05-26 18:58:04 -0700197extern "C" void materialDiffuse(void *vp, float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700198{
199 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
200 float v[] = {r, g, b, a};
201 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, v);
202}
203
Jack Palevich55d45222009-05-26 18:58:04 -0700204extern "C" void materialSpecular(void *vp, float r, float g, float b, float a)
Jason Samsd19f10d2009-05-22 14:03:28 -0700205{
206 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
207 float v[] = {r, g, b, a};
208 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, v);
209}
210
Jack Palevich55d45222009-05-26 18:58:04 -0700211extern "C" void lightPosition(void *vp, float x, float y, float z, float w)
Jason Samsd19f10d2009-05-22 14:03:28 -0700212{
213 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
214 float v[] = {x, y, z, w};
215 glLightfv(GL_LIGHT0, GL_POSITION, v);
216}
217
Jack Palevich55d45222009-05-26 18:58:04 -0700218extern "C" void materialShininess(void *vp, float s)
Jason Samsd19f10d2009-05-22 14:03:28 -0700219{
220 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
221 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &s);
222}
223
Jack Palevich55d45222009-05-26 18:58:04 -0700224extern "C" void uploadToTexture(void *vp, RsAllocation va, uint32_t baseMipLevel)
Jason Samsd19f10d2009-05-22 14:03:28 -0700225{
226 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
227 rsi_AllocationUploadToTexture(env->mContext, va, baseMipLevel);
228}
229
Jack Palevich55d45222009-05-26 18:58:04 -0700230extern "C" void enable(void *vp, uint32_t p)
Jason Samsd19f10d2009-05-22 14:03:28 -0700231{
232 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
233 glEnable(p);
234}
235
Jack Palevich55d45222009-05-26 18:58:04 -0700236extern "C" void disable(void *vp, uint32_t p)
Jason Samsd19f10d2009-05-22 14:03:28 -0700237{
238 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
239 glDisable(p);
240}
241
Jack Palevich55d45222009-05-26 18:58:04 -0700242extern "C" uint32_t scriptRand(void *vp, uint32_t max)
Jason Samsd19f10d2009-05-22 14:03:28 -0700243{
244 return (uint32_t)(((float)rand()) * max / RAND_MAX);
245}
246
247// Assumes (GL_FIXED) x,y,z (GL_UNSIGNED_BYTE)r,g,b,a
Jack Palevich55d45222009-05-26 18:58:04 -0700248extern "C" void drawTriangleArray(void *vp, RsAllocation alloc, uint32_t count)
Jason Samsd19f10d2009-05-22 14:03:28 -0700249{
250 const Allocation *a = (const Allocation *)alloc;
251 const uint32_t *ptr = (const uint32_t *)a->getPtr();
252
253 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
254 env->mContext->setupCheck();
255
256 glBindBuffer(GL_ARRAY_BUFFER, 0);
257 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
258
259 glEnableClientState(GL_VERTEX_ARRAY);
260 glDisableClientState(GL_NORMAL_ARRAY);
261 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
262 glEnableClientState(GL_COLOR_ARRAY);
263
264 glVertexPointer(2, GL_FIXED, 12, ptr + 1);
265 //glTexCoordPointer(2, GL_FIXED, 24, ptr + 1);
266 glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
267
268 glDrawArrays(GL_TRIANGLES, 0, count * 3);
269}
270
Jason Samsfe08d992009-05-27 14:45:32 -0700271extern "C" void drawRect(void *vp, int32_t x1, int32_t x2, int32_t y1, int32_t y2)
272{
273 x1 = (x1 << 16);
274 x2 = (x2 << 16);
275 y1 = (y1 << 16);
276 y2 = (y2 << 16);
277
278 int32_t vtx[] = {x1,y1, x1,y2, x2,y1, x2,y2};
279 static const int32_t tex[] = {0,0, 0,0x10000, 0x10000,0, 0x10000,0x10000};
280
281
282 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
283 env->mContext->setupCheck();
284
285 glBindBuffer(GL_ARRAY_BUFFER, 0);
286 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
287
288 glEnableClientState(GL_VERTEX_ARRAY);
289 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
290 glDisableClientState(GL_NORMAL_ARRAY);
291 glDisableClientState(GL_COLOR_ARRAY);
292
293 glVertexPointer(2, GL_FIXED, 8, vtx);
294 glTexCoordPointer(2, GL_FIXED, 8, tex);
295 //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
296
297 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
298}
299
Jack Palevich55d45222009-05-26 18:58:04 -0700300extern "C" void pfBindTexture(void *vp, RsProgramFragment vpf, uint32_t slot, RsAllocation va)
Jason Samsd19f10d2009-05-22 14:03:28 -0700301{
302 //LOGE("pfBindTexture %p", vpf);
303 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
Jack Palevich55d45222009-05-26 18:58:04 -0700304 rsi_ProgramFragmentBindTexture(env->mContext,
Jason Samsd19f10d2009-05-22 14:03:28 -0700305 static_cast<ProgramFragment *>(vpf),
306 slot,
307 static_cast<Allocation *>(va));
308
309}
310
Jack Palevich55d45222009-05-26 18:58:04 -0700311extern "C" void pfBindSampler(void *vp, RsProgramFragment vpf, uint32_t slot, RsSampler vs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700312{
313 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
Jack Palevich55d45222009-05-26 18:58:04 -0700314 rsi_ProgramFragmentBindSampler(env->mContext,
Jason Samsd19f10d2009-05-22 14:03:28 -0700315 static_cast<ProgramFragment *>(vpf),
316 slot,
317 static_cast<Sampler *>(vs));
318
319}
320
Jack Palevich55d45222009-05-26 18:58:04 -0700321extern "C" void contextBindProgramFragmentStore(void *vp, RsProgramFragmentStore pfs)
Jason Samsd19f10d2009-05-22 14:03:28 -0700322{
323 //LOGE("contextBindProgramFragmentStore %p", pfs);
324 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
325 rsi_ContextBindProgramFragmentStore(env->mContext, pfs);
326
327}
328
Jack Palevich55d45222009-05-26 18:58:04 -0700329extern "C" void contextBindProgramFragment(void *vp, RsProgramFragment pf)
Jason Samsd19f10d2009-05-22 14:03:28 -0700330{
331 //LOGE("contextBindProgramFragment %p", pf);
332 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
333 rsi_ContextBindProgramFragment(env->mContext, pf);
334
335}
336
337
338static rsc_FunctionTable scriptCPtrTable = {
339 loadVp,
340 loadF,
341 loadI32,
342 loadU32,
343 loadEnvVec4,
344 loadEnvMatrix,
345
346 storeF,
347 storeI32,
348 storeU32,
349 storeEnvVec4,
350 storeEnvMatrix,
351
352 matrixLoadIdentity,
353 matrixLoadFloat,
354 matrixLoadMat,
355 matrixLoadRotate,
356 matrixLoadScale,
357 matrixLoadTranslate,
358 matrixLoadMultiply,
359 matrixMultiply,
360 matrixRotate,
361 matrixScale,
362 matrixTranslate,
363
364 color,
Jason Samsd19f10d2009-05-22 14:03:28 -0700365
366 pfBindTexture,
367 pfBindSampler,
368
369 materialDiffuse,
370 materialSpecular,
371 lightPosition,
372 materialShininess,
373 uploadToTexture,
374 enable,
375 disable,
376
377 scriptRand,
Jason Samsd19f10d2009-05-22 14:03:28 -0700378 contextBindProgramFragment,
Jason Samsfe08d992009-05-27 14:45:32 -0700379 contextBindProgramFragmentStore,
380
381
382 renderTriangleMesh,
383 renderTriangleMeshRange,
384
385 drawTriangleArray,
386 drawRect
387
Jason Samsd19f10d2009-05-22 14:03:28 -0700388};
389
390
Jason Samsa09f11d2009-06-04 17:58:03 -0700391bool ScriptC::run(Context *rsc, uint32_t launchID)
Jason Samsd19f10d2009-05-22 14:03:28 -0700392{
393 Env e = {rsc, this};
Jason Sams3eaa3382009-06-10 15:04:38 -0700394
395 if (mEnviroment.mFragmentStore.get()) {
396 rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
397 }
398 if (mEnviroment.mFragment.get()) {
399 rsc->setFragment(mEnviroment.mFragment.get());
400 }
Jason Sams9c54bdb2009-06-17 16:52:59 -0700401 if (mEnviroment.mVertex.get()) {
402 rsc->setVertex(mEnviroment.mVertex.get());
403 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700404
Jason Sams3a833d82009-06-08 15:20:31 -0700405 return mProgram.mScript(&e, &scriptCPtrTable, launchID) != 0;
Jason Samsd19f10d2009-05-22 14:03:28 -0700406}
407
408ScriptCState::ScriptCState()
409{
410 clear();
411}
412
413ScriptCState::~ScriptCState()
414{
Jack Palevichec5a20b2009-05-28 15:53:04 -0700415 if (mAccScript) {
416 accDeleteScript(mAccScript);
417 }
Jason Samsd19f10d2009-05-22 14:03:28 -0700418}
419
420void ScriptCState::clear()
421{
Jason Sams3a833d82009-06-08 15:20:31 -0700422 memset(&mProgram, 0, sizeof(mProgram));
423
Jason Samsd19f10d2009-05-22 14:03:28 -0700424 mConstantBufferTypes.clear();
Jason Sams3a833d82009-06-08 15:20:31 -0700425
426 memset(&mEnviroment, 0, sizeof(mEnviroment));
427 mEnviroment.mClearColor[0] = 0;
428 mEnviroment.mClearColor[1] = 0;
429 mEnviroment.mClearColor[2] = 0;
430 mEnviroment.mClearColor[3] = 1;
431 mEnviroment.mClearDepth = 1;
432 mEnviroment.mClearStencil = 0;
433 mEnviroment.mIsRoot = false;
Jason Sams3a833d82009-06-08 15:20:31 -0700434
Jack Palevichec5a20b2009-05-28 15:53:04 -0700435 mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700436
Jason Sams39ddc9502009-06-05 17:35:09 -0700437}
438
Jason Samsd5680f92009-06-10 18:39:40 -0700439
Jason Sams3eaa3382009-06-10 15:04:38 -0700440void ScriptCState::runCompiler(Context *rsc)
Jason Sams39ddc9502009-06-05 17:35:09 -0700441{
442 mAccScript = accCreateScript();
Jason Samsd5680f92009-06-10 18:39:40 -0700443 String8 tmp;
Jason Sams39ddc9502009-06-05 17:35:09 -0700444
Jason Samsd5680f92009-06-10 18:39:40 -0700445 rsc->appendNameDefines(&tmp);
446
447 const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
448 int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
449 accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
Jason Sams39ddc9502009-06-05 17:35:09 -0700450 accCompileScript(mAccScript);
Jason Sams3a833d82009-06-08 15:20:31 -0700451 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Samsda423d82009-06-09 12:15:30 -0700452 rsAssert(mProgram.mScript);
453
Jason Sams9c54bdb2009-06-17 16:52:59 -0700454 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
455 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
456 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsd5680f92009-06-10 18:39:40 -0700457
Jason Samsda423d82009-06-09 12:15:30 -0700458 if (mProgram.mScript) {
459 const static int pragmaMax = 16;
460 ACCsizei pragmaCount;
461 ACCchar * str[pragmaMax];
462 accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
463
Jason Samsda423d82009-06-09 12:15:30 -0700464 for (int ct=0; ct < pragmaCount; ct+=2) {
465 LOGE("pragma %i %s %s", ct, str[ct], str[ct+1]);
466
467 if (!strcmp(str[ct], "version")) {
468 continue;
469
470 }
471
472
473 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700474 if (!strcmp(str[ct+1], "default")) {
475 continue;
476 }
477 if (!strcmp(str[ct+1], "parent")) {
478 mEnviroment.mVertex.clear();
479 continue;
480 }
481 ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
482 if (pv != NULL) {
483 mEnviroment.mVertex.set(pv);
484 continue;
485 }
Jason Samsda423d82009-06-09 12:15:30 -0700486 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
487 }
488
489 if (!strcmp(str[ct], "stateRaster")) {
Jason Samsda423d82009-06-09 12:15:30 -0700490 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
491 }
492
493 if (!strcmp(str[ct], "stateFragment")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700494 if (!strcmp(str[ct+1], "default")) {
495 continue;
496 }
497 if (!strcmp(str[ct+1], "parent")) {
498 mEnviroment.mFragment.clear();
499 continue;
500 }
501 ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
Jason Sams3eaa3382009-06-10 15:04:38 -0700502 if (pf != NULL) {
503 mEnviroment.mFragment.set(pf);
Jason Samsda423d82009-06-09 12:15:30 -0700504 continue;
505 }
506 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
507 }
508
509 if (!strcmp(str[ct], "stateFragmentStore")) {
Jason Sams9c54bdb2009-06-17 16:52:59 -0700510 if (!strcmp(str[ct+1], "default")) {
511 continue;
512 }
513 if (!strcmp(str[ct+1], "parent")) {
514 mEnviroment.mFragmentStore.clear();
515 continue;
516 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700517 ProgramFragmentStore * pfs =
518 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
519 if (pfs != NULL) {
520 mEnviroment.mFragmentStore.set(pfs);
Jason Samsda423d82009-06-09 12:15:30 -0700521 continue;
522 }
Jason Samsda423d82009-06-09 12:15:30 -0700523 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
524 }
525
526 }
527
528
529 } else {
530 // Deal with an error.
531 }
532
Jason Samsd19f10d2009-05-22 14:03:28 -0700533}
534
535namespace android {
536namespace renderscript {
537
538void rsi_ScriptCBegin(Context * rsc)
539{
540 ScriptCState *ss = &rsc->mScriptC;
541 ss->clear();
542}
543
544void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
545{
546 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700547 ss->mEnviroment.mClearColor[0] = r;
548 ss->mEnviroment.mClearColor[1] = g;
549 ss->mEnviroment.mClearColor[2] = b;
550 ss->mEnviroment.mClearColor[3] = a;
Jason Samsd19f10d2009-05-22 14:03:28 -0700551}
552
553void rsi_ScriptCSetClearDepth(Context * rsc, float v)
554{
555 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700556 ss->mEnviroment.mClearDepth = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700557}
558
559void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
560{
561 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700562 ss->mEnviroment.mClearStencil = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700563}
564
565void rsi_ScriptCAddType(Context * rsc, RsType vt)
566{
567 ScriptCState *ss = &rsc->mScriptC;
568 ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
569}
570
Jason Sams3a833d82009-06-08 15:20:31 -0700571void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Samsd19f10d2009-05-22 14:03:28 -0700572{
573 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700574 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Samsd19f10d2009-05-22 14:03:28 -0700575}
576
577void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
578{
579 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700580 ss->mEnviroment.mIsRoot = isRoot;
Jason Samsd19f10d2009-05-22 14:03:28 -0700581}
582
Jason Sams39ddc9502009-06-05 17:35:09 -0700583void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
584{
585 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700586 ss->mProgram.mScriptText = text;
587 ss->mProgram.mScriptTextLength = len;
Jason Sams39ddc9502009-06-05 17:35:09 -0700588}
589
590
Jason Samsd19f10d2009-05-22 14:03:28 -0700591RsScript rsi_ScriptCCreate(Context * rsc)
592{
593 ScriptCState *ss = &rsc->mScriptC;
594
Jason Sams3eaa3382009-06-10 15:04:38 -0700595 ss->runCompiler(rsc);
Jason Sams39ddc9502009-06-05 17:35:09 -0700596
Jason Samsd19f10d2009-05-22 14:03:28 -0700597 ScriptC *s = new ScriptC();
Jason Sams3a833d82009-06-08 15:20:31 -0700598 s->incRef();
Jack Palevichec5a20b2009-05-28 15:53:04 -0700599 s->mAccScript = ss->mAccScript;
600 ss->mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700601 s->mEnviroment = ss->mEnviroment;
602 s->mProgram = ss->mProgram;
603 ss->clear();
Jason Samsda423d82009-06-09 12:15:30 -0700604
Jason Samsd19f10d2009-05-22 14:03:28 -0700605 return s;
606}
607
608}
609}
610
611