blob: c650656304ab2ed3863f26bca6a0fb920caffbdc [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 }
Jason Sams8ce125b2009-06-17 16:52:59 -0700401 if (mEnviroment.mVertex.get()) {
402 rsc->setVertex(mEnviroment.mVertex.get());
403 }
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700404
Jason Samsefb8de12009-06-08 15:20:31 -0700405 return mProgram.mScript(&e, &scriptCPtrTable, launchID) != 0;
Jason Sams326e0dd2009-05-22 14:03:28 -0700406}
407
408ScriptCState::ScriptCState()
409{
410 clear();
411}
412
413ScriptCState::~ScriptCState()
414{
Jack Palevich1ef8b802009-05-28 15:53:04 -0700415 if (mAccScript) {
416 accDeleteScript(mAccScript);
417 }
Jason Sams326e0dd2009-05-22 14:03:28 -0700418}
419
420void ScriptCState::clear()
421{
Jason Samsefb8de12009-06-08 15:20:31 -0700422 memset(&mProgram, 0, sizeof(mProgram));
423
Jason Sams326e0dd2009-05-22 14:03:28 -0700424 mConstantBufferTypes.clear();
Jason Samsefb8de12009-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 Samsefb8de12009-06-08 15:20:31 -0700434
Jack Palevich1ef8b802009-05-28 15:53:04 -0700435 mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -0700436
Jason Sams1f526332009-06-05 17:35:09 -0700437}
438
Jason Samsa4a54e42009-06-10 18:39:40 -0700439
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700440void ScriptCState::runCompiler(Context *rsc)
Jason Sams1f526332009-06-05 17:35:09 -0700441{
442 mAccScript = accCreateScript();
Jason Samsa4a54e42009-06-10 18:39:40 -0700443 String8 tmp;
Jason Sams1f526332009-06-05 17:35:09 -0700444
Jason Samsa4a54e42009-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 Sams1f526332009-06-05 17:35:09 -0700450 accCompileScript(mAccScript);
Jason Samsefb8de12009-06-08 15:20:31 -0700451 accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
Jason Sams10308932009-06-09 12:15:30 -0700452 rsAssert(mProgram.mScript);
453
Jason Sams8ce125b2009-06-17 16:52:59 -0700454 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
455 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
456 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsa4a54e42009-06-10 18:39:40 -0700457
Jason Sams10308932009-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 Sams10308932009-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 Sams8ce125b2009-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 Sams10308932009-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 Sams10308932009-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 Sams8ce125b2009-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 Samsa0a1b6f2009-06-10 15:04:38 -0700502 if (pf != NULL) {
503 mEnviroment.mFragment.set(pf);
Jason Sams10308932009-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 Sams8ce125b2009-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 Samsa0a1b6f2009-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 Sams10308932009-06-09 12:15:30 -0700521 continue;
522 }
Jason Sams10308932009-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 Sams326e0dd2009-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 Samsefb8de12009-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 Sams326e0dd2009-05-22 14:03:28 -0700551}
552
553void rsi_ScriptCSetClearDepth(Context * rsc, float v)
554{
555 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700556 ss->mEnviroment.mClearDepth = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700557}
558
559void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
560{
561 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700562 ss->mEnviroment.mClearStencil = v;
Jason Sams326e0dd2009-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 Samsefb8de12009-06-08 15:20:31 -0700571void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Sams326e0dd2009-05-22 14:03:28 -0700572{
573 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700574 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Sams326e0dd2009-05-22 14:03:28 -0700575}
576
577void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
578{
579 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700580 ss->mEnviroment.mIsRoot = isRoot;
Jason Sams326e0dd2009-05-22 14:03:28 -0700581}
582
Jason Sams1f526332009-06-05 17:35:09 -0700583void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
584{
585 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700586 ss->mProgram.mScriptText = text;
587 ss->mProgram.mScriptTextLength = len;
Jason Sams1f526332009-06-05 17:35:09 -0700588}
589
590
Jason Sams326e0dd2009-05-22 14:03:28 -0700591RsScript rsi_ScriptCCreate(Context * rsc)
592{
593 ScriptCState *ss = &rsc->mScriptC;
594
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700595 ss->runCompiler(rsc);
Jason Sams1f526332009-06-05 17:35:09 -0700596
Jason Sams326e0dd2009-05-22 14:03:28 -0700597 ScriptC *s = new ScriptC();
Jason Samsefb8de12009-06-08 15:20:31 -0700598 s->incRef();
Jack Palevich1ef8b802009-05-28 15:53:04 -0700599 s->mAccScript = ss->mAccScript;
600 ss->mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -0700601 s->mEnviroment = ss->mEnviroment;
602 s->mProgram = ss->mProgram;
603 ss->clear();
Jason Sams10308932009-06-09 12:15:30 -0700604
Jason Sams326e0dd2009-05-22 14:03:28 -0700605 return s;
606}
607
608}
609}
610
611