blob: d29eb9ff9be6c6981dbde4966fe2c5c17ffd0b5b [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;
431 mEnviroment.mIsOrtho = true;
432
Jack Palevich1ef8b802009-05-28 15:53:04 -0700433 mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -0700434
Jason Sams1f526332009-06-05 17:35:09 -0700435}
436
Jason Samsa4a54e42009-06-10 18:39:40 -0700437
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700438void ScriptCState::runCompiler(Context *rsc)
Jason Sams1f526332009-06-05 17:35:09 -0700439{
440 mAccScript = accCreateScript();
Jason Samsa4a54e42009-06-10 18:39:40 -0700441 String8 tmp;
Jason Sams1f526332009-06-05 17:35:09 -0700442
Jason Samsa4a54e42009-06-10 18:39:40 -0700443 rsc->appendNameDefines(&tmp);
444
445 const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
446 int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
447 accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
Jason Sams1f526332009-06-05 17:35:09 -0700448 accCompileScript(mAccScript);
Jason Samsefb8de12009-06-08 15:20:31 -0700449 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Sams10308932009-06-09 12:15:30 -0700450 rsAssert(mProgram.mScript);
451
Jason Samsa4a54e42009-06-10 18:39:40 -0700452
Jason Sams10308932009-06-09 12:15:30 -0700453 if (mProgram.mScript) {
454 const static int pragmaMax = 16;
455 ACCsizei pragmaCount;
456 ACCchar * str[pragmaMax];
457 accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
458
Jason Sams10308932009-06-09 12:15:30 -0700459 for (int ct=0; ct < pragmaCount; ct+=2) {
460 LOGE("pragma %i %s %s", ct, str[ct], str[ct+1]);
461
462 if (!strcmp(str[ct], "version")) {
463 continue;
464
465 }
466
467
468 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams10308932009-06-09 12:15:30 -0700469 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
470 }
471
472 if (!strcmp(str[ct], "stateRaster")) {
Jason Sams10308932009-06-09 12:15:30 -0700473 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
474 }
475
476 if (!strcmp(str[ct], "stateFragment")) {
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700477 ProgramFragment * pf =
478 (ProgramFragment *)rsc->lookupName(str[ct+1]);
479 if (pf != NULL) {
480 mEnviroment.mFragment.set(pf);
Jason Sams10308932009-06-09 12:15:30 -0700481 continue;
482 }
483 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
484 }
485
486 if (!strcmp(str[ct], "stateFragmentStore")) {
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700487 ProgramFragmentStore * pfs =
488 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
489 if (pfs != NULL) {
490 mEnviroment.mFragmentStore.set(pfs);
Jason Sams10308932009-06-09 12:15:30 -0700491 continue;
492 }
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700493
Jason Sams10308932009-06-09 12:15:30 -0700494 if (!strcmp(str[ct+1], "parent")) {
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700495 //mEnviroment.mStateFragmentStore =
496 //Script::Enviroment_t::FRAGMENT_STORE_PARENT;
Jason Sams10308932009-06-09 12:15:30 -0700497 continue;
498 }
499 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
500 }
501
502 }
503
504
505 } else {
506 // Deal with an error.
507 }
508
Jason Sams326e0dd2009-05-22 14:03:28 -0700509}
510
511namespace android {
512namespace renderscript {
513
514void rsi_ScriptCBegin(Context * rsc)
515{
516 ScriptCState *ss = &rsc->mScriptC;
517 ss->clear();
518}
519
520void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
521{
522 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700523 ss->mEnviroment.mClearColor[0] = r;
524 ss->mEnviroment.mClearColor[1] = g;
525 ss->mEnviroment.mClearColor[2] = b;
526 ss->mEnviroment.mClearColor[3] = a;
Jason Sams326e0dd2009-05-22 14:03:28 -0700527}
528
529void rsi_ScriptCSetClearDepth(Context * rsc, float v)
530{
531 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700532 ss->mEnviroment.mClearDepth = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700533}
534
535void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
536{
537 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700538 ss->mEnviroment.mClearStencil = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700539}
540
541void rsi_ScriptCAddType(Context * rsc, RsType vt)
542{
543 ScriptCState *ss = &rsc->mScriptC;
544 ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
545}
546
Jason Samsefb8de12009-06-08 15:20:31 -0700547void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Sams326e0dd2009-05-22 14:03:28 -0700548{
549 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700550 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Sams326e0dd2009-05-22 14:03:28 -0700551}
552
553void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
554{
555 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700556 ss->mEnviroment.mIsRoot = isRoot;
Jason Sams326e0dd2009-05-22 14:03:28 -0700557}
558
559void rsi_ScriptCSetOrtho(Context * rsc, bool isOrtho)
560{
561 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700562 ss->mEnviroment.mIsOrtho = isOrtho;
Jason Sams326e0dd2009-05-22 14:03:28 -0700563}
564
Jason Sams1f526332009-06-05 17:35:09 -0700565void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
566{
567 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700568 ss->mProgram.mScriptText = text;
569 ss->mProgram.mScriptTextLength = len;
Jason Sams1f526332009-06-05 17:35:09 -0700570}
571
572
Jason Sams326e0dd2009-05-22 14:03:28 -0700573RsScript rsi_ScriptCCreate(Context * rsc)
574{
575 ScriptCState *ss = &rsc->mScriptC;
576
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700577 ss->runCompiler(rsc);
Jason Sams1f526332009-06-05 17:35:09 -0700578
Jason Sams326e0dd2009-05-22 14:03:28 -0700579 ScriptC *s = new ScriptC();
Jason Samsefb8de12009-06-08 15:20:31 -0700580 s->incRef();
Jack Palevich1ef8b802009-05-28 15:53:04 -0700581 s->mAccScript = ss->mAccScript;
582 ss->mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -0700583 s->mEnviroment = ss->mEnviroment;
584 s->mProgram = ss->mProgram;
585 ss->clear();
Jason Sams10308932009-06-09 12:15:30 -0700586
Jason Sams326e0dd2009-05-22 14:03:28 -0700587 return s;
588}
589
590}
591}
592
593