blob: 557f3aea1f40ad0720b83f554f1cf520ffcf33c5 [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
Jason Samse5769102009-06-19 16:03:18 -070027#define GET_TLS() Context::ScriptTLSStruct * tls = \
28 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
29 Context * rsc = tls->mContext; \
30 ScriptC * sc = (ScriptC *) tls->mScript
31
Jason Sams326e0dd2009-05-22 14:03:28 -070032
33ScriptC::ScriptC()
34{
Jack Palevich1ef8b802009-05-28 15:53:04 -070035 mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -070036 memset(&mProgram, 0, sizeof(mProgram));
Jason Sams326e0dd2009-05-22 14:03:28 -070037}
38
39ScriptC::~ScriptC()
40{
Jack Palevich1ef8b802009-05-28 15:53:04 -070041 if (mAccScript) {
42 accDeleteScript(mAccScript);
43 }
Jason Sams326e0dd2009-05-22 14:03:28 -070044}
45
Jason Samse5769102009-06-19 16:03:18 -070046extern "C" void matrixLoadIdentity(rsc_Matrix *mat)
Jason Sams326e0dd2009-05-22 14:03:28 -070047{
48 Matrix *m = reinterpret_cast<Matrix *>(mat);
49 m->loadIdentity();
50}
51
Jason Samse5769102009-06-19 16:03:18 -070052extern "C" void matrixLoadFloat(rsc_Matrix *mat, const float *f)
Jason Sams326e0dd2009-05-22 14:03:28 -070053{
54 Matrix *m = reinterpret_cast<Matrix *>(mat);
55 m->load(f);
56}
57
Jason Samse5769102009-06-19 16:03:18 -070058extern "C" void matrixLoadMat(rsc_Matrix *mat, const rsc_Matrix *newmat)
Jason Sams326e0dd2009-05-22 14:03:28 -070059{
60 Matrix *m = reinterpret_cast<Matrix *>(mat);
61 m->load(reinterpret_cast<const Matrix *>(newmat));
62}
63
Jason Samse5769102009-06-19 16:03:18 -070064extern "C" void matrixLoadRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070065{
66 Matrix *m = reinterpret_cast<Matrix *>(mat);
67 m->loadRotate(rot, x, y, z);
68}
69
Jason Samse5769102009-06-19 16:03:18 -070070extern "C" void matrixLoadScale(rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070071{
72 Matrix *m = reinterpret_cast<Matrix *>(mat);
73 m->loadScale(x, y, z);
74}
75
Jason Samse5769102009-06-19 16:03:18 -070076extern "C" void matrixLoadTranslate(rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070077{
78 Matrix *m = reinterpret_cast<Matrix *>(mat);
79 m->loadTranslate(x, y, z);
80}
81
Jason Samse5769102009-06-19 16:03:18 -070082extern "C" void matrixLoadMultiply(rsc_Matrix *mat, const rsc_Matrix *lhs, const rsc_Matrix *rhs)
Jason Sams326e0dd2009-05-22 14:03:28 -070083{
84 Matrix *m = reinterpret_cast<Matrix *>(mat);
85 m->loadMultiply(reinterpret_cast<const Matrix *>(lhs),
86 reinterpret_cast<const Matrix *>(rhs));
87}
88
Jason Samse5769102009-06-19 16:03:18 -070089extern "C" void matrixMultiply(rsc_Matrix *mat, const rsc_Matrix *rhs)
Jason Sams326e0dd2009-05-22 14:03:28 -070090{
91 Matrix *m = reinterpret_cast<Matrix *>(mat);
92 m->multiply(reinterpret_cast<const Matrix *>(rhs));
93}
94
Jason Samse5769102009-06-19 16:03:18 -070095extern "C" void matrixRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -070096{
97 Matrix *m = reinterpret_cast<Matrix *>(mat);
98 m->rotate(rot, x, y, z);
99}
100
Jason Samse5769102009-06-19 16:03:18 -0700101extern "C" void matrixScale(rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -0700102{
103 Matrix *m = reinterpret_cast<Matrix *>(mat);
104 m->scale(x, y, z);
105}
106
Jason Samse5769102009-06-19 16:03:18 -0700107extern "C" void matrixTranslate(rsc_Matrix *mat, float x, float y, float z)
Jason Sams326e0dd2009-05-22 14:03:28 -0700108{
109 Matrix *m = reinterpret_cast<Matrix *>(mat);
110 m->translate(x, y, z);
111}
112
113
Jason Samse5769102009-06-19 16:03:18 -0700114extern "C" const void * loadVp(uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-05-22 14:03:28 -0700115{
Jason Samse5769102009-06-19 16:03:18 -0700116 GET_TLS();
117 return &static_cast<const uint8_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Sams326e0dd2009-05-22 14:03:28 -0700118}
119
Jason Samse5769102009-06-19 16:03:18 -0700120extern "C" float loadF(uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-05-22 14:03:28 -0700121{
Jason Samse5769102009-06-19 16:03:18 -0700122 GET_TLS();
123 return static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset];
Jason Sams326e0dd2009-05-22 14:03:28 -0700124}
125
Jason Samse5769102009-06-19 16:03:18 -0700126extern "C" int32_t loadI32(uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-05-22 14:03:28 -0700127{
Jason Samse5769102009-06-19 16:03:18 -0700128 GET_TLS();
129 return static_cast<const int32_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Sams326e0dd2009-05-22 14:03:28 -0700130}
131
Jason Samse5769102009-06-19 16:03:18 -0700132extern "C" uint32_t loadU32(uint32_t bank, uint32_t offset)
Jason Sams326e0dd2009-05-22 14:03:28 -0700133{
Jason Samse5769102009-06-19 16:03:18 -0700134 GET_TLS();
135 return static_cast<const uint32_t *>(sc->mSlots[bank]->getPtr())[offset];
Jason Sams326e0dd2009-05-22 14:03:28 -0700136}
137
Jason Samse5769102009-06-19 16:03:18 -0700138extern "C" void loadEnvVec4(uint32_t bank, uint32_t offset, rsc_Vector4 *v)
Jason Sams326e0dd2009-05-22 14:03:28 -0700139{
Jason Samse5769102009-06-19 16:03:18 -0700140 GET_TLS();
141 memcpy(v, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Vector4));
Jason Sams326e0dd2009-05-22 14:03:28 -0700142}
143
Jason Samse5769102009-06-19 16:03:18 -0700144extern "C" void loadEnvMatrix(uint32_t bank, uint32_t offset, rsc_Matrix *m)
Jason Sams326e0dd2009-05-22 14:03:28 -0700145{
Jason Samse5769102009-06-19 16:03:18 -0700146 GET_TLS();
147 memcpy(m, &static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset], sizeof(rsc_Matrix));
Jason Sams326e0dd2009-05-22 14:03:28 -0700148}
149
150
Jason Samse5769102009-06-19 16:03:18 -0700151extern "C" void storeF(uint32_t bank, uint32_t offset, float v)
Jason Sams326e0dd2009-05-22 14:03:28 -0700152{
Jason Samse5769102009-06-19 16:03:18 -0700153 GET_TLS();
154 static_cast<float *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700155}
156
Jason Samse5769102009-06-19 16:03:18 -0700157extern "C" void storeI32(uint32_t bank, uint32_t offset, int32_t v)
Jason Sams326e0dd2009-05-22 14:03:28 -0700158{
Jason Samse5769102009-06-19 16:03:18 -0700159 GET_TLS();
160 static_cast<int32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700161}
162
Jason Samse5769102009-06-19 16:03:18 -0700163extern "C" void storeU32(uint32_t bank, uint32_t offset, uint32_t v)
Jason Sams326e0dd2009-05-22 14:03:28 -0700164{
Jason Samse5769102009-06-19 16:03:18 -0700165 GET_TLS();
166 static_cast<uint32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700167}
168
Jason Samse5769102009-06-19 16:03:18 -0700169extern "C" void storeEnvVec4(uint32_t bank, uint32_t offset, const rsc_Vector4 *v)
Jason Sams326e0dd2009-05-22 14:03:28 -0700170{
Jason Samse5769102009-06-19 16:03:18 -0700171 GET_TLS();
172 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], v, sizeof(rsc_Vector4));
Jason Sams326e0dd2009-05-22 14:03:28 -0700173}
174
Jason Samse5769102009-06-19 16:03:18 -0700175extern "C" void storeEnvMatrix(uint32_t bank, uint32_t offset, const rsc_Matrix *m)
Jason Sams326e0dd2009-05-22 14:03:28 -0700176{
Jason Samse5769102009-06-19 16:03:18 -0700177 GET_TLS();
178 memcpy(&static_cast<float *>(sc->mSlots[bank]->getPtr())[offset], m, sizeof(rsc_Matrix));
Jason Sams326e0dd2009-05-22 14:03:28 -0700179}
180
181
Jason Samse5769102009-06-19 16:03:18 -0700182extern "C" void color(float r, float g, float b, float a)
Jason Sams326e0dd2009-05-22 14:03:28 -0700183{
Jason Sams326e0dd2009-05-22 14:03:28 -0700184 glColor4f(r, g, b, a);
185}
186
Jason Samse5769102009-06-19 16:03:18 -0700187extern "C" void renderTriangleMesh(RsTriangleMesh mesh)
Jason Sams326e0dd2009-05-22 14:03:28 -0700188{
Jason Samse5769102009-06-19 16:03:18 -0700189 GET_TLS();
190 rsi_TriangleMeshRender(rsc, mesh);
Jason Sams326e0dd2009-05-22 14:03:28 -0700191}
192
Jason Samse5769102009-06-19 16:03:18 -0700193extern "C" void renderTriangleMeshRange(RsTriangleMesh mesh, uint32_t start, uint32_t count)
Jason Sams326e0dd2009-05-22 14:03:28 -0700194{
Jason Samse5769102009-06-19 16:03:18 -0700195 GET_TLS();
196 rsi_TriangleMeshRenderRange(rsc, mesh, start, count);
Jason Sams326e0dd2009-05-22 14:03:28 -0700197}
198
Jason Samse5769102009-06-19 16:03:18 -0700199extern "C" void materialDiffuse(float r, float g, float b, float a)
Jason Sams326e0dd2009-05-22 14:03:28 -0700200{
Jason Sams326e0dd2009-05-22 14:03:28 -0700201 float v[] = {r, g, b, a};
202 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, v);
203}
204
Jason Samse5769102009-06-19 16:03:18 -0700205extern "C" void materialSpecular(float r, float g, float b, float a)
Jason Sams326e0dd2009-05-22 14:03:28 -0700206{
Jason Sams326e0dd2009-05-22 14:03:28 -0700207 float v[] = {r, g, b, a};
208 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, v);
209}
210
Jason Samse5769102009-06-19 16:03:18 -0700211extern "C" void lightPosition(float x, float y, float z, float w)
Jason Sams326e0dd2009-05-22 14:03:28 -0700212{
Jason Sams326e0dd2009-05-22 14:03:28 -0700213 float v[] = {x, y, z, w};
214 glLightfv(GL_LIGHT0, GL_POSITION, v);
215}
216
Jason Samse5769102009-06-19 16:03:18 -0700217extern "C" void materialShininess(float s)
Jason Sams326e0dd2009-05-22 14:03:28 -0700218{
Jason Sams326e0dd2009-05-22 14:03:28 -0700219 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &s);
220}
221
Jason Samse5769102009-06-19 16:03:18 -0700222extern "C" void uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
Jason Sams326e0dd2009-05-22 14:03:28 -0700223{
Jason Samse5769102009-06-19 16:03:18 -0700224 GET_TLS();
225 rsi_AllocationUploadToTexture(rsc, va, baseMipLevel);
Jason Sams326e0dd2009-05-22 14:03:28 -0700226}
227
Jason Samse5769102009-06-19 16:03:18 -0700228extern "C" void enable(uint32_t p)
Jason Sams326e0dd2009-05-22 14:03:28 -0700229{
Jason Sams326e0dd2009-05-22 14:03:28 -0700230 glEnable(p);
231}
232
Jason Samse5769102009-06-19 16:03:18 -0700233extern "C" void disable(uint32_t p)
Jason Sams326e0dd2009-05-22 14:03:28 -0700234{
Jason Sams326e0dd2009-05-22 14:03:28 -0700235 glDisable(p);
236}
237
Jason Samse5769102009-06-19 16:03:18 -0700238extern "C" uint32_t scriptRand(uint32_t max)
Jason Sams326e0dd2009-05-22 14:03:28 -0700239{
240 return (uint32_t)(((float)rand()) * max / RAND_MAX);
241}
242
243// Assumes (GL_FIXED) x,y,z (GL_UNSIGNED_BYTE)r,g,b,a
Jason Samse5769102009-06-19 16:03:18 -0700244extern "C" void drawTriangleArray(RsAllocation alloc, uint32_t count)
Jason Sams326e0dd2009-05-22 14:03:28 -0700245{
Jason Samse5769102009-06-19 16:03:18 -0700246 GET_TLS();
247
Jason Sams326e0dd2009-05-22 14:03:28 -0700248 const Allocation *a = (const Allocation *)alloc;
249 const uint32_t *ptr = (const uint32_t *)a->getPtr();
250
Jason Samse5769102009-06-19 16:03:18 -0700251 rsc->setupCheck();
Jason Sams326e0dd2009-05-22 14:03:28 -0700252
253 glBindBuffer(GL_ARRAY_BUFFER, 0);
254 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
255
256 glEnableClientState(GL_VERTEX_ARRAY);
257 glDisableClientState(GL_NORMAL_ARRAY);
258 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
259 glEnableClientState(GL_COLOR_ARRAY);
260
261 glVertexPointer(2, GL_FIXED, 12, ptr + 1);
262 //glTexCoordPointer(2, GL_FIXED, 24, ptr + 1);
263 glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
264
265 glDrawArrays(GL_TRIANGLES, 0, count * 3);
266}
267
Jason Samse5769102009-06-19 16:03:18 -0700268extern "C" void drawRect(int32_t x1, int32_t x2, int32_t y1, int32_t y2)
Jason Sams6678e9b2009-05-27 14:45:32 -0700269{
Jason Samse5769102009-06-19 16:03:18 -0700270 GET_TLS();
Jason Sams6678e9b2009-05-27 14:45:32 -0700271 x1 = (x1 << 16);
272 x2 = (x2 << 16);
273 y1 = (y1 << 16);
274 y2 = (y2 << 16);
275
276 int32_t vtx[] = {x1,y1, x1,y2, x2,y1, x2,y2};
277 static const int32_t tex[] = {0,0, 0,0x10000, 0x10000,0, 0x10000,0x10000};
278
279
Jason Samse5769102009-06-19 16:03:18 -0700280 rsc->setupCheck();
Jason Sams6678e9b2009-05-27 14:45:32 -0700281
282 glBindBuffer(GL_ARRAY_BUFFER, 0);
283 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
284
285 glEnableClientState(GL_VERTEX_ARRAY);
286 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
287 glDisableClientState(GL_NORMAL_ARRAY);
288 glDisableClientState(GL_COLOR_ARRAY);
289
290 glVertexPointer(2, GL_FIXED, 8, vtx);
291 glTexCoordPointer(2, GL_FIXED, 8, tex);
292 //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
293
294 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
295}
296
Jason Samse5769102009-06-19 16:03:18 -0700297extern "C" void pfBindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
Jason Sams326e0dd2009-05-22 14:03:28 -0700298{
Jason Samse5769102009-06-19 16:03:18 -0700299 GET_TLS();
300 rsi_ProgramFragmentBindTexture(rsc,
Jason Sams326e0dd2009-05-22 14:03:28 -0700301 static_cast<ProgramFragment *>(vpf),
302 slot,
303 static_cast<Allocation *>(va));
304
305}
306
Jason Samse5769102009-06-19 16:03:18 -0700307extern "C" void pfBindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
Jason Sams326e0dd2009-05-22 14:03:28 -0700308{
Jason Samse5769102009-06-19 16:03:18 -0700309 GET_TLS();
310 rsi_ProgramFragmentBindSampler(rsc,
Jason Sams326e0dd2009-05-22 14:03:28 -0700311 static_cast<ProgramFragment *>(vpf),
312 slot,
313 static_cast<Sampler *>(vs));
314
315}
316
Jason Samse5769102009-06-19 16:03:18 -0700317extern "C" void contextBindProgramFragmentStore(RsProgramFragmentStore pfs)
Jason Sams326e0dd2009-05-22 14:03:28 -0700318{
Jason Samse5769102009-06-19 16:03:18 -0700319 GET_TLS();
320 rsi_ContextBindProgramFragmentStore(rsc, pfs);
Jason Sams326e0dd2009-05-22 14:03:28 -0700321
322}
323
Jason Samse5769102009-06-19 16:03:18 -0700324extern "C" void contextBindProgramFragment(RsProgramFragment pf)
Jason Sams326e0dd2009-05-22 14:03:28 -0700325{
Jason Samse5769102009-06-19 16:03:18 -0700326 GET_TLS();
327 rsi_ContextBindProgramFragment(rsc, pf);
Jason Sams326e0dd2009-05-22 14:03:28 -0700328
329}
330
331
332static rsc_FunctionTable scriptCPtrTable = {
333 loadVp,
334 loadF,
335 loadI32,
336 loadU32,
337 loadEnvVec4,
338 loadEnvMatrix,
339
340 storeF,
341 storeI32,
342 storeU32,
343 storeEnvVec4,
344 storeEnvMatrix,
345
346 matrixLoadIdentity,
347 matrixLoadFloat,
348 matrixLoadMat,
349 matrixLoadRotate,
350 matrixLoadScale,
351 matrixLoadTranslate,
352 matrixLoadMultiply,
353 matrixMultiply,
354 matrixRotate,
355 matrixScale,
356 matrixTranslate,
357
358 color,
Jason Sams326e0dd2009-05-22 14:03:28 -0700359
360 pfBindTexture,
361 pfBindSampler,
362
363 materialDiffuse,
364 materialSpecular,
365 lightPosition,
366 materialShininess,
367 uploadToTexture,
368 enable,
369 disable,
370
371 scriptRand,
Jason Sams326e0dd2009-05-22 14:03:28 -0700372 contextBindProgramFragment,
Jason Sams6678e9b2009-05-27 14:45:32 -0700373 contextBindProgramFragmentStore,
374
375
376 renderTriangleMesh,
377 renderTriangleMeshRange,
378
379 drawTriangleArray,
380 drawRect
381
Jason Sams326e0dd2009-05-22 14:03:28 -0700382};
383
384
Jason Samse5769102009-06-19 16:03:18 -0700385bool ScriptC::run(Context *rsc, uint32_t launchIndex)
Jason Sams326e0dd2009-05-22 14:03:28 -0700386{
Jason Samse5769102009-06-19 16:03:18 -0700387 Context::ScriptTLSStruct * tls =
388 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700389
390 if (mEnviroment.mFragmentStore.get()) {
391 rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
392 }
393 if (mEnviroment.mFragment.get()) {
394 rsc->setFragment(mEnviroment.mFragment.get());
395 }
Jason Sams8ce125b2009-06-17 16:52:59 -0700396 if (mEnviroment.mVertex.get()) {
397 rsc->setVertex(mEnviroment.mVertex.get());
398 }
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700399
Jason Samse5769102009-06-19 16:03:18 -0700400 tls->mScript = this;
401 return mProgram.mScript(launchIndex, &scriptCPtrTable) != 0;
402 tls->mScript = NULL;
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 Sams8ce125b2009-06-17 16:52:59 -0700451 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
452 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
453 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsa4a54e42009-06-10 18:39:40 -0700454
Jason Sams10308932009-06-09 12:15:30 -0700455 if (mProgram.mScript) {
456 const static int pragmaMax = 16;
457 ACCsizei pragmaCount;
458 ACCchar * str[pragmaMax];
459 accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
460
Jason Sams10308932009-06-09 12:15:30 -0700461 for (int ct=0; ct < pragmaCount; ct+=2) {
462 LOGE("pragma %i %s %s", ct, str[ct], str[ct+1]);
463
464 if (!strcmp(str[ct], "version")) {
465 continue;
466
467 }
468
469
470 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams8ce125b2009-06-17 16:52:59 -0700471 if (!strcmp(str[ct+1], "default")) {
472 continue;
473 }
474 if (!strcmp(str[ct+1], "parent")) {
475 mEnviroment.mVertex.clear();
476 continue;
477 }
478 ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
479 if (pv != NULL) {
480 mEnviroment.mVertex.set(pv);
481 continue;
482 }
Jason Sams10308932009-06-09 12:15:30 -0700483 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
484 }
485
486 if (!strcmp(str[ct], "stateRaster")) {
Jason Sams10308932009-06-09 12:15:30 -0700487 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
488 }
489
490 if (!strcmp(str[ct], "stateFragment")) {
Jason Sams8ce125b2009-06-17 16:52:59 -0700491 if (!strcmp(str[ct+1], "default")) {
492 continue;
493 }
494 if (!strcmp(str[ct+1], "parent")) {
495 mEnviroment.mFragment.clear();
496 continue;
497 }
498 ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700499 if (pf != NULL) {
500 mEnviroment.mFragment.set(pf);
Jason Sams10308932009-06-09 12:15:30 -0700501 continue;
502 }
503 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
504 }
505
506 if (!strcmp(str[ct], "stateFragmentStore")) {
Jason Sams8ce125b2009-06-17 16:52:59 -0700507 if (!strcmp(str[ct+1], "default")) {
508 continue;
509 }
510 if (!strcmp(str[ct+1], "parent")) {
511 mEnviroment.mFragmentStore.clear();
512 continue;
513 }
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700514 ProgramFragmentStore * pfs =
515 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
516 if (pfs != NULL) {
517 mEnviroment.mFragmentStore.set(pfs);
Jason Sams10308932009-06-09 12:15:30 -0700518 continue;
519 }
Jason Sams10308932009-06-09 12:15:30 -0700520 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
521 }
522
523 }
524
525
526 } else {
527 // Deal with an error.
528 }
529
Jason Sams326e0dd2009-05-22 14:03:28 -0700530}
531
532namespace android {
533namespace renderscript {
534
535void rsi_ScriptCBegin(Context * rsc)
536{
537 ScriptCState *ss = &rsc->mScriptC;
538 ss->clear();
539}
540
541void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
542{
543 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700544 ss->mEnviroment.mClearColor[0] = r;
545 ss->mEnviroment.mClearColor[1] = g;
546 ss->mEnviroment.mClearColor[2] = b;
547 ss->mEnviroment.mClearColor[3] = a;
Jason Sams326e0dd2009-05-22 14:03:28 -0700548}
549
550void rsi_ScriptCSetClearDepth(Context * rsc, float v)
551{
552 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700553 ss->mEnviroment.mClearDepth = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700554}
555
556void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
557{
558 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700559 ss->mEnviroment.mClearStencil = v;
Jason Sams326e0dd2009-05-22 14:03:28 -0700560}
561
562void rsi_ScriptCAddType(Context * rsc, RsType vt)
563{
564 ScriptCState *ss = &rsc->mScriptC;
565 ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
566}
567
Jason Samsefb8de12009-06-08 15:20:31 -0700568void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Sams326e0dd2009-05-22 14:03:28 -0700569{
570 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700571 ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
Jason Sams326e0dd2009-05-22 14:03:28 -0700572}
573
574void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
575{
576 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700577 ss->mEnviroment.mIsRoot = isRoot;
Jason Sams326e0dd2009-05-22 14:03:28 -0700578}
579
Jason Sams1f526332009-06-05 17:35:09 -0700580void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
581{
582 ScriptCState *ss = &rsc->mScriptC;
Jason Samsefb8de12009-06-08 15:20:31 -0700583 ss->mProgram.mScriptText = text;
584 ss->mProgram.mScriptTextLength = len;
Jason Sams1f526332009-06-05 17:35:09 -0700585}
586
587
Jason Sams326e0dd2009-05-22 14:03:28 -0700588RsScript rsi_ScriptCCreate(Context * rsc)
589{
590 ScriptCState *ss = &rsc->mScriptC;
591
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700592 ss->runCompiler(rsc);
Jason Sams1f526332009-06-05 17:35:09 -0700593
Jason Sams326e0dd2009-05-22 14:03:28 -0700594 ScriptC *s = new ScriptC();
Jason Samsefb8de12009-06-08 15:20:31 -0700595 s->incRef();
Jack Palevich1ef8b802009-05-28 15:53:04 -0700596 s->mAccScript = ss->mAccScript;
597 ss->mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -0700598 s->mEnviroment = ss->mEnviroment;
599 s->mProgram = ss->mProgram;
600 ss->clear();
Jason Sams10308932009-06-09 12:15:30 -0700601
Jason Sams326e0dd2009-05-22 14:03:28 -0700602 return s;
603}
604
605}
606}
607
608