blob: 29638311eb37cf0f11c653b096af8a71d11be1fa [file] [log] [blame]
Jason Sams326e0dd2009-05-22 14:03:28 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "rsContext.h"
18#include "rsScriptC.h"
19#include "rsMatrix.h"
20
Jack Palevich1ef8b802009-05-28 15:53:04 -070021#include "acc/acc.h"
Jason Samsa4a54e42009-06-10 18:39:40 -070022#include "utils/String8.h"
Jack Palevich1ef8b802009-05-28 15:53:04 -070023
Jason Sams326e0dd2009-05-22 14:03:28 -070024using namespace android;
25using namespace android::renderscript;
26
27
28ScriptC::ScriptC()
29{
Jack Palevich1ef8b802009-05-28 15:53:04 -070030 mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -070031 memset(&mProgram, 0, sizeof(mProgram));
Jason Sams326e0dd2009-05-22 14:03:28 -070032}
33
34ScriptC::~ScriptC()
35{
Jack Palevich1ef8b802009-05-28 15:53:04 -070036 if (mAccScript) {
37 accDeleteScript(mAccScript);
38 }
Jason Sams326e0dd2009-05-22 14:03:28 -070039}
40
Jack Palevichfd19dc92009-05-26 18:58:04 -070041extern "C" void matrixLoadIdentity(void *con, rsc_Matrix *mat)
Jason Sams326e0dd2009-05-22 14:03:28 -070042{
43 Matrix *m = reinterpret_cast<Matrix *>(mat);
44 m->loadIdentity();
45}
46
Jack Palevichfd19dc92009-05-26 18:58:04 -070047extern "C" void matrixLoadFloat(void *con, rsc_Matrix *mat, const float *f)
Jason Sams326e0dd2009-05-22 14:03:28 -070048{
49 Matrix *m = reinterpret_cast<Matrix *>(mat);
50 m->load(f);
51}
52
Jack Palevichfd19dc92009-05-26 18:58:04 -070053extern "C" void matrixLoadMat(void *con, rsc_Matrix *mat, const rsc_Matrix *newmat)
Jason Sams326e0dd2009-05-22 14:03:28 -070054{
55 Matrix *m = reinterpret_cast<Matrix *>(mat);
56 m->load(reinterpret_cast<const Matrix *>(newmat));
57}
58
Jack Palevichfd19dc92009-05-26 18:58:04 -070059extern "C" void matrixLoadRotate(void *con, rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070060{
61 Matrix *m = reinterpret_cast<Matrix *>(mat);
62 m->loadRotate(rot, x, y, z);
63}
64
Jack Palevichfd19dc92009-05-26 18:58:04 -070065extern "C" void matrixLoadScale(void *con, rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070066{
67 Matrix *m = reinterpret_cast<Matrix *>(mat);
68 m->loadScale(x, y, z);
69}
70
Jack Palevichfd19dc92009-05-26 18:58:04 -070071extern "C" void matrixLoadTranslate(void *con, rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070072{
73 Matrix *m = reinterpret_cast<Matrix *>(mat);
74 m->loadTranslate(x, y, z);
75}
76
Jack Palevichfd19dc92009-05-26 18:58:04 -070077extern "C" void matrixLoadMultiply(void *con, rsc_Matrix *mat, const rsc_Matrix *lhs, const rsc_Matrix *rhs)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -070084extern "C" void matrixMultiply(void *con, rsc_Matrix *mat, const rsc_Matrix *rhs)
Jason Sams326e0dd2009-05-22 14:03:28 -070085{
86 Matrix *m = reinterpret_cast<Matrix *>(mat);
87 m->multiply(reinterpret_cast<const Matrix *>(rhs));
88}
89
Jack Palevichfd19dc92009-05-26 18:58:04 -070090extern "C" void matrixRotate(void *con, rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070091{
92 Matrix *m = reinterpret_cast<Matrix *>(mat);
93 m->rotate(rot, x, y, z);
94}
95
Jack Palevichfd19dc92009-05-26 18:58:04 -070096extern "C" void matrixScale(void *con, rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070097{
98 Matrix *m = reinterpret_cast<Matrix *>(mat);
99 m->scale(x, y, z);
100}
101
Jack Palevichfd19dc92009-05-26 18:58:04 -0700102extern "C" void matrixTranslate(void *con, rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -0700103{
104 Matrix *m = reinterpret_cast<Matrix *>(mat);
105 m->translate(x, y, z);
106}
107
108
Jack Palevichfd19dc92009-05-26 18:58:04 -0700109extern "C" const void * loadVp(void *vp, uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700115extern "C" float loadF(void *vp, uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700123extern "C" int32_t loadI32(void *vp, uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700129extern "C" uint32_t loadU32(void *vp, uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700135extern "C" void loadEnvVec4(void *vp, uint32_t bank, uint32_t offset, rsc_Vector4 *v)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700141extern "C" void loadEnvMatrix(void *vp, uint32_t bank, uint32_t offset, rsc_Matrix *m)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700148extern "C" void storeF(void *vp, uint32_t bank, uint32_t offset, float v)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700154extern "C" void storeI32(void *vp, uint32_t bank, uint32_t offset, int32_t v)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700160extern "C" void storeU32(void *vp, uint32_t bank, uint32_t offset, uint32_t v)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700166extern "C" void storeEnvVec4(void *vp, uint32_t bank, uint32_t offset, const rsc_Vector4 *v)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700172extern "C" void storeEnvMatrix(void *vp, uint32_t bank, uint32_t offset, const rsc_Matrix *m)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700179extern "C" void color(void *vp, float r, float g, float b, float a)
Jason Sams326e0dd2009-05-22 14:03:28 -0700180{
181 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
182 glColor4f(r, g, b, a);
183}
184
Jack Palevichfd19dc92009-05-26 18:58:04 -0700185extern "C" void renderTriangleMesh(void *vp, RsTriangleMesh mesh)
Jason Sams326e0dd2009-05-22 14:03:28 -0700186{
187 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
188 rsi_TriangleMeshRender(env->mContext, mesh);
189}
190
Jack Palevichfd19dc92009-05-26 18:58:04 -0700191extern "C" void renderTriangleMeshRange(void *vp, RsTriangleMesh mesh, uint32_t start, uint32_t count)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700197extern "C" void materialDiffuse(void *vp, float r, float g, float b, float a)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700204extern "C" void materialSpecular(void *vp, float r, float g, float b, float a)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700211extern "C" void lightPosition(void *vp, float x, float y, float z, float w)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700218extern "C" void materialShininess(void *vp, float s)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700224extern "C" void uploadToTexture(void *vp, RsAllocation va, uint32_t baseMipLevel)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700230extern "C" void enable(void *vp, uint32_t p)
Jason Sams326e0dd2009-05-22 14:03:28 -0700231{
232 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
233 glEnable(p);
234}
235
Jack Palevichfd19dc92009-05-26 18:58:04 -0700236extern "C" void disable(void *vp, uint32_t p)
Jason Sams326e0dd2009-05-22 14:03:28 -0700237{
238 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
239 glDisable(p);
240}
241
Jack Palevichfd19dc92009-05-26 18:58:04 -0700242extern "C" uint32_t scriptRand(void *vp, uint32_t max)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700248extern "C" void drawTriangleArray(void *vp, RsAllocation alloc, uint32_t count)
Jason Sams326e0dd2009-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 Sams6678e9b2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700300extern "C" void pfBindTexture(void *vp, RsProgramFragment vpf, uint32_t slot, RsAllocation va)
Jason Sams326e0dd2009-05-22 14:03:28 -0700301{
302 //LOGE("pfBindTexture %p", vpf);
303 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
Jack Palevichfd19dc92009-05-26 18:58:04 -0700304 rsi_ProgramFragmentBindTexture(env->mContext,
Jason Sams326e0dd2009-05-22 14:03:28 -0700305 static_cast<ProgramFragment *>(vpf),
306 slot,
307 static_cast<Allocation *>(va));
308
309}
310
Jack Palevichfd19dc92009-05-26 18:58:04 -0700311extern "C" void pfBindSampler(void *vp, RsProgramFragment vpf, uint32_t slot, RsSampler vs)
Jason Sams326e0dd2009-05-22 14:03:28 -0700312{
313 ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
Jack Palevichfd19dc92009-05-26 18:58:04 -0700314 rsi_ProgramFragmentBindSampler(env->mContext,
Jason Sams326e0dd2009-05-22 14:03:28 -0700315 static_cast<ProgramFragment *>(vpf),
316 slot,
317 static_cast<Sampler *>(vs));
318
319}
320
Jack Palevichfd19dc92009-05-26 18:58:04 -0700321extern "C" void contextBindProgramFragmentStore(void *vp, RsProgramFragmentStore pfs)
Jason Sams326e0dd2009-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 Palevichfd19dc92009-05-26 18:58:04 -0700329extern "C" void contextBindProgramFragment(void *vp, RsProgramFragment pf)
Jason Sams326e0dd2009-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 Sams326e0dd2009-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 Sams326e0dd2009-05-22 14:03:28 -0700378 contextBindProgramFragment,
Jason Sams6678e9b2009-05-27 14:45:32 -0700379 contextBindProgramFragmentStore,
380
381
382 renderTriangleMesh,
383 renderTriangleMeshRange,
384
385 drawTriangleArray,
386 drawRect
387
Jason Sams326e0dd2009-05-22 14:03:28 -0700388};
389
390
Jason Samsa44cb292009-06-04 17:58:03 -0700391bool ScriptC::run(Context *rsc, uint32_t launchID)
Jason Sams326e0dd2009-05-22 14:03:28 -0700392{
393 Env e = {rsc, this};
Jason Samsa0a1b6f2009-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 }
401
Jason Samsefb8de12009-06-08 15:20:31 -0700402 return mProgram.mScript(&e, &scriptCPtrTable, launchID) != 0;
Jason Sams326e0dd2009-05-22 14:03:28 -0700403}
404
405ScriptCState::ScriptCState()
406{
407 clear();
408}
409
410ScriptCState::~ScriptCState()
411{
Jack Palevich1ef8b802009-05-28 15:53:04 -0700412 if (mAccScript) {
413 accDeleteScript(mAccScript);
414 }
Jason Sams326e0dd2009-05-22 14:03:28 -0700415}
416
417void ScriptCState::clear()
418{
Jason Samsefb8de12009-06-08 15:20:31 -0700419 memset(&mProgram, 0, sizeof(mProgram));
420
Jason Sams326e0dd2009-05-22 14:03:28 -0700421 mConstantBufferTypes.clear();
Jason Samsefb8de12009-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 Samsefb8de12009-06-08 15:20:31 -0700431
Jack Palevich1ef8b802009-05-28 15:53:04 -0700432 mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -0700433
Jason Sams1f526332009-06-05 17:35:09 -0700434}
435
Jason Samsa4a54e42009-06-10 18:39:40 -0700436
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700437void ScriptCState::runCompiler(Context *rsc)
Jason Sams1f526332009-06-05 17:35:09 -0700438{
439 mAccScript = accCreateScript();
Jason Samsa4a54e42009-06-10 18:39:40 -0700440 String8 tmp;
Jason Sams1f526332009-06-05 17:35:09 -0700441
Jason Samsa4a54e42009-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 Sams1f526332009-06-05 17:35:09 -0700447 accCompileScript(mAccScript);
Jason Samsefb8de12009-06-08 15:20:31 -0700448 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Sams10308932009-06-09 12:15:30 -0700449 rsAssert(mProgram.mScript);
450
Jason Samsa4a54e42009-06-10 18:39:40 -0700451
Jason Sams10308932009-06-09 12:15:30 -0700452 if (mProgram.mScript) {
453 const static int pragmaMax = 16;
454 ACCsizei pragmaCount;
455 ACCchar * str[pragmaMax];
456 accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
457
Jason Sams10308932009-06-09 12:15:30 -0700458 for (int ct=0; ct < pragmaCount; ct+=2) {
459 LOGE("pragma %i %s %s", ct, str[ct], str[ct+1]);
460
461 if (!strcmp(str[ct], "version")) {
462 continue;
463
464 }
465
466
467 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams10308932009-06-09 12:15:30 -0700468 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
469 }
470
471 if (!strcmp(str[ct], "stateRaster")) {
Jason Sams10308932009-06-09 12:15:30 -0700472 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
473 }
474
475 if (!strcmp(str[ct], "stateFragment")) {
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700476 ProgramFragment * pf =
477 (ProgramFragment *)rsc->lookupName(str[ct+1]);
478 if (pf != NULL) {
479 mEnviroment.mFragment.set(pf);
Jason Sams10308932009-06-09 12:15:30 -0700480 continue;
481 }
482 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
483 }
484
485 if (!strcmp(str[ct], "stateFragmentStore")) {
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700486 ProgramFragmentStore * pfs =
487 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
488 if (pfs != NULL) {
489 mEnviroment.mFragmentStore.set(pfs);
Jason Sams10308932009-06-09 12:15:30 -0700490 continue;
491 }
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700492
Jason Sams10308932009-06-09 12:15:30 -0700493 if (!strcmp(str[ct+1], "parent")) {
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700494 //mEnviroment.mStateFragmentStore =
495 //Script::Enviroment_t::FRAGMENT_STORE_PARENT;
Jason Sams10308932009-06-09 12:15:30 -0700496 continue;
497 }
498 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
499 }
500
501 }
502
503
504 } else {
505 // Deal with an error.
506 }
507
Jason Sams326e0dd2009-05-22 14:03:28 -0700508}
509
510namespace android {
511namespace renderscript {
512
513void rsi_ScriptCBegin(Context * rsc)
514{
515 ScriptCState *ss = &rsc->mScriptC;
516 ss->clear();
517}
518
519void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
520{
521 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700522 ss->mEnviroment.mClearColor[0] = r;
523 ss->mEnviroment.mClearColor[1] = g;
524 ss->mEnviroment.mClearColor[2] = b;
525 ss->mEnviroment.mClearColor[3] = a;
Jason Sams326e0dd2009-05-22 14:03:28 -0700526}
527
528void rsi_ScriptCSetClearDepth(Context * rsc, float v)
529{
530 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700531 ss->mEnviroment.mClearDepth = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700532}
533
534void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
535{
536 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700537 ss->mEnviroment.mClearStencil = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700538}
539
540void rsi_ScriptCAddType(Context * rsc, RsType vt)
541{
542 ScriptCState *ss = &rsc->mScriptC;
543 ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
544}
545
Jason Samsefb8de12009-06-08 15:20:31 -0700546void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Sams326e0dd2009-05-22 14:03:28 -0700547{
548 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700549 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Sams326e0dd2009-05-22 14:03:28 -0700550}
551
552void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
553{
554 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700555 ss->mEnviroment.mIsRoot = isRoot;
Jason Sams326e0dd2009-05-22 14:03:28 -0700556}
557
Jason Sams1f526332009-06-05 17:35:09 -0700558void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
559{
560 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700561 ss->mProgram.mScriptText = text;
562 ss->mProgram.mScriptTextLength = len;
Jason Sams1f526332009-06-05 17:35:09 -0700563}
564
565
Jason Sams326e0dd2009-05-22 14:03:28 -0700566RsScript rsi_ScriptCCreate(Context * rsc)
567{
568 ScriptCState *ss = &rsc->mScriptC;
569
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700570 ss->runCompiler(rsc);
Jason Sams1f526332009-06-05 17:35:09 -0700571
Jason Sams326e0dd2009-05-22 14:03:28 -0700572 ScriptC *s = new ScriptC();
Jason Samsefb8de12009-06-08 15:20:31 -0700573 s->incRef();
Jack Palevich1ef8b802009-05-28 15:53:04 -0700574 s->mAccScript = ss->mAccScript;
575 ss->mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -0700576 s->mEnviroment = ss->mEnviroment;
577 s->mProgram = ss->mProgram;
578 ss->clear();
Jason Sams10308932009-06-09 12:15:30 -0700579
Jason Sams326e0dd2009-05-22 14:03:28 -0700580 return s;
581}
582
583}
584}
585
586