blob: 29638311eb37cf0f11c653b096af8a71d11be1fa [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 }
401
Jason Sams3a833d82009-06-08 15:20:31 -0700402 return mProgram.mScript(&e, &scriptCPtrTable, launchID) != 0;
Jason Samsd19f10d2009-05-22 14:03:28 -0700403}
404
405ScriptCState::ScriptCState()
406{
407 clear();
408}
409
410ScriptCState::~ScriptCState()
411{
Jack Palevichec5a20b2009-05-28 15:53:04 -0700412 if (mAccScript) {
413 accDeleteScript(mAccScript);
414 }
Jason Samsd19f10d2009-05-22 14:03:28 -0700415}
416
417void ScriptCState::clear()
418{
Jason Sams3a833d82009-06-08 15:20:31 -0700419 memset(&mProgram, 0, sizeof(mProgram));
420
Jason Samsd19f10d2009-05-22 14:03:28 -0700421 mConstantBufferTypes.clear();
Jason Sams3a833d82009-06-08 15:20:31 -0700422
423 memset(&mEnviroment, 0, sizeof(mEnviroment));
424 mEnviroment.mClearColor[0] = 0;
425 mEnviroment.mClearColor[1] = 0;
426 mEnviroment.mClearColor[2] = 0;
427 mEnviroment.mClearColor[3] = 1;
428 mEnviroment.mClearDepth = 1;
429 mEnviroment.mClearStencil = 0;
430 mEnviroment.mIsRoot = false;
Jason Sams3a833d82009-06-08 15:20:31 -0700431
Jack Palevichec5a20b2009-05-28 15:53:04 -0700432 mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700433
Jason Sams39ddc9502009-06-05 17:35:09 -0700434}
435
Jason Samsd5680f92009-06-10 18:39:40 -0700436
Jason Sams3eaa3382009-06-10 15:04:38 -0700437void ScriptCState::runCompiler(Context *rsc)
Jason Sams39ddc9502009-06-05 17:35:09 -0700438{
439 mAccScript = accCreateScript();
Jason Samsd5680f92009-06-10 18:39:40 -0700440 String8 tmp;
Jason Sams39ddc9502009-06-05 17:35:09 -0700441
Jason Samsd5680f92009-06-10 18:39:40 -0700442 rsc->appendNameDefines(&tmp);
443
444 const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
445 int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
446 accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
Jason Sams39ddc9502009-06-05 17:35:09 -0700447 accCompileScript(mAccScript);
Jason Sams3a833d82009-06-08 15:20:31 -0700448 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Samsda423d82009-06-09 12:15:30 -0700449 rsAssert(mProgram.mScript);
450
Jason Samsd5680f92009-06-10 18:39:40 -0700451
Jason Samsda423d82009-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 Samsda423d82009-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 Samsda423d82009-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 Samsda423d82009-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 Sams3eaa3382009-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 Samsda423d82009-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 Sams3eaa3382009-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 Samsda423d82009-06-09 12:15:30 -0700490 continue;
491 }
Jason Sams3eaa3382009-06-10 15:04:38 -0700492
Jason Samsda423d82009-06-09 12:15:30 -0700493 if (!strcmp(str[ct+1], "parent")) {
Jason Sams3eaa3382009-06-10 15:04:38 -0700494 //mEnviroment.mStateFragmentStore =
495 //Script::Enviroment_t::FRAGMENT_STORE_PARENT;
Jason Samsda423d82009-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 Samsd19f10d2009-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 Sams3a833d82009-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 Samsd19f10d2009-05-22 14:03:28 -0700526}
527
528void rsi_ScriptCSetClearDepth(Context * rsc, float v)
529{
530 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700531 ss->mEnviroment.mClearDepth = v;
Jason Samsd19f10d2009-05-22 14:03:28 -0700532}
533
534void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
535{
536 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700537 ss->mEnviroment.mClearStencil = v;
Jason Samsd19f10d2009-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 Sams3a833d82009-06-08 15:20:31 -0700546void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Samsd19f10d2009-05-22 14:03:28 -0700547{
548 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700549 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Samsd19f10d2009-05-22 14:03:28 -0700550}
551
552void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
553{
554 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700555 ss->mEnviroment.mIsRoot = isRoot;
Jason Samsd19f10d2009-05-22 14:03:28 -0700556}
557
Jason Sams39ddc9502009-06-05 17:35:09 -0700558void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
559{
560 ScriptCState *ss = &rsc->mScriptC;
Jason Sams3a833d82009-06-08 15:20:31 -0700561 ss->mProgram.mScriptText = text;
562 ss->mProgram.mScriptTextLength = len;
Jason Sams39ddc9502009-06-05 17:35:09 -0700563}
564
565
Jason Samsd19f10d2009-05-22 14:03:28 -0700566RsScript rsi_ScriptCCreate(Context * rsc)
567{
568 ScriptCState *ss = &rsc->mScriptC;
569
Jason Sams3eaa3382009-06-10 15:04:38 -0700570 ss->runCompiler(rsc);
Jason Sams39ddc9502009-06-05 17:35:09 -0700571
Jason Samsd19f10d2009-05-22 14:03:28 -0700572 ScriptC *s = new ScriptC();
Jason Sams3a833d82009-06-08 15:20:31 -0700573 s->incRef();
Jack Palevichec5a20b2009-05-28 15:53:04 -0700574 s->mAccScript = ss->mAccScript;
575 ss->mAccScript = NULL;
Jason Sams3a833d82009-06-08 15:20:31 -0700576 s->mEnviroment = ss->mEnviroment;
577 s->mProgram = ss->mProgram;
578 ss->clear();
Jason Samsda423d82009-06-09 12:15:30 -0700579
Jason Samsd19f10d2009-05-22 14:03:28 -0700580 return s;
581}
582
583}
584}
585
586