blob: 20088da31c226ac5eb151ae47e94c9f0f6c7ae07 [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"
Joe Onorato9c4e4ca2009-08-09 11:39:02 -070022#include "utils/Timers.h"
Jack Palevich1ef8b802009-05-28 15:53:04 -070023
Jason Sams1aa5a4e2009-06-22 17:15:15 -070024#include <GLES/gl.h>
25#include <GLES/glext.h>
26
Jason Sams326e0dd2009-05-22 14:03:28 -070027using namespace android;
28using namespace android::renderscript;
29
Jason Samse5769102009-06-19 16:03:18 -070030#define GET_TLS() Context::ScriptTLSStruct * tls = \
31 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
32 Context * rsc = tls->mContext; \
33 ScriptC * sc = (ScriptC *) tls->mScript
34
Jason Sams326e0dd2009-05-22 14:03:28 -070035
Jason Samse514b452009-09-25 14:51:22 -070036ScriptC::ScriptC(Context *rsc) : Script(rsc)
Jason Sams326e0dd2009-05-22 14:03:28 -070037{
Jason Samsf2649a92009-09-25 16:37:33 -070038 mAllocFile = __FILE__;
39 mAllocLine = __LINE__;
Jack Palevich1ef8b802009-05-28 15:53:04 -070040 mAccScript = NULL;
Jason Samsefb8de12009-06-08 15:20:31 -070041 memset(&mProgram, 0, sizeof(mProgram));
Jason Sams326e0dd2009-05-22 14:03:28 -070042}
43
44ScriptC::~ScriptC()
45{
Jack Palevich1ef8b802009-05-28 15:53:04 -070046 if (mAccScript) {
47 accDeleteScript(mAccScript);
48 }
Jason Sams326e0dd2009-05-22 14:03:28 -070049}
50
Jason Samsada7f272009-09-24 14:55:38 -070051void ScriptC::setupScript()
52{
53 for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
54 if (mProgram.mSlotPointers[ct]) {
55 *mProgram.mSlotPointers[ct] = mSlots[ct]->getPtr();
56 }
57 }
58}
59
Jason Sams326e0dd2009-05-22 14:03:28 -070060
Jason Samse5769102009-06-19 16:03:18 -070061bool ScriptC::run(Context *rsc, uint32_t launchIndex)
Jason Sams326e0dd2009-05-22 14:03:28 -070062{
Jason Samsd34b7252009-08-04 16:58:20 -070063 Context::ScriptTLSStruct * tls =
Jason Samse5769102009-06-19 16:03:18 -070064 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
Jason Samsa0a1b6f2009-06-10 15:04:38 -070065
66 if (mEnviroment.mFragmentStore.get()) {
67 rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
68 }
69 if (mEnviroment.mFragment.get()) {
70 rsc->setFragment(mEnviroment.mFragment.get());
71 }
Jason Sams8ce125b2009-06-17 16:52:59 -070072 if (mEnviroment.mVertex.get()) {
73 rsc->setVertex(mEnviroment.mVertex.get());
74 }
Jason Samsb681c8a2009-09-28 18:12:56 -070075 if (mEnviroment.mRaster.get()) {
76 rsc->setRaster(mEnviroment.mRaster.get());
77 }
Jason Samsa0a1b6f2009-06-10 15:04:38 -070078
Joe Onorato9c4e4ca2009-08-09 11:39:02 -070079 if (launchIndex == 0) {
80 mEnviroment.mStartTimeMillis
81 = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
82 }
Jason Samsada7f272009-09-24 14:55:38 -070083 setupScript();
Jason Sams1d54f102009-09-03 15:43:13 -070084
Jason Samse45ac6e2009-07-20 14:31:06 -070085 bool ret = false;
Jason Samse5769102009-06-19 16:03:18 -070086 tls->mScript = this;
Jason Samse45ac6e2009-07-20 14:31:06 -070087 ret = mProgram.mScript(launchIndex) != 0;
Jason Samse5769102009-06-19 16:03:18 -070088 tls->mScript = NULL;
Jason Samse45ac6e2009-07-20 14:31:06 -070089 return ret;
Jason Sams326e0dd2009-05-22 14:03:28 -070090}
91
92ScriptCState::ScriptCState()
93{
Jason Sams8c6bc692009-09-16 15:04:38 -070094 mScript = NULL;
Jason Sams326e0dd2009-05-22 14:03:28 -070095 clear();
96}
97
98ScriptCState::~ScriptCState()
99{
Jason Sams8c6bc692009-09-16 15:04:38 -0700100 delete mScript;
101 mScript = NULL;
Jason Sams326e0dd2009-05-22 14:03:28 -0700102}
103
104void ScriptCState::clear()
105{
Jason Sams8b2c0652009-08-12 17:54:11 -0700106 for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
107 mConstantBufferTypes[ct].clear();
Jason Samsfa517192009-08-13 12:59:04 -0700108 mSlotNames[ct].setTo("");
Jason Sams8c6bc692009-09-16 15:04:38 -0700109 mInvokableNames[ct].setTo("");
Jason Sams90b36a82009-08-17 13:56:09 -0700110 mSlotWritable[ct] = false;
Jason Sams8b2c0652009-08-12 17:54:11 -0700111 }
Jason Samsefb8de12009-06-08 15:20:31 -0700112
Jason Sams8c6bc692009-09-16 15:04:38 -0700113 delete mScript;
Jason Samse514b452009-09-25 14:51:22 -0700114 mScript = new ScriptC(NULL);
Jason Samsefb8de12009-06-08 15:20:31 -0700115
Joe Onorato57b79ce2009-08-09 22:57:44 -0700116 mInt32Defines.clear();
117 mFloatDefines.clear();
Jason Sams1f526332009-06-05 17:35:09 -0700118}
119
Jason Samsd34b7252009-08-04 16:58:20 -0700120static ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name)
Jason Sams29df66f2009-07-16 15:08:06 -0700121{
122 const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
Jason Sams29df66f2009-07-16 15:08:06 -0700123 if (sym) {
124 return sym->mPtr;
125 }
Jason Sams29df66f2009-07-16 15:08:06 -0700126 LOGE("ScriptC sym lookup failed for %s", name);
Jason Sams29df66f2009-07-16 15:08:06 -0700127 return NULL;
128}
Jason Samsa4a54e42009-06-10 18:39:40 -0700129
Jason Sams8c6bc692009-09-16 15:04:38 -0700130void ScriptCState::runCompiler(Context *rsc, ScriptC *s)
Jason Sams1f526332009-06-05 17:35:09 -0700131{
Jason Sams8c6bc692009-09-16 15:04:38 -0700132 s->mAccScript = accCreateScript();
Jason Samsa4a54e42009-06-10 18:39:40 -0700133 String8 tmp;
Jason Sams1f526332009-06-05 17:35:09 -0700134
Jason Samsa4a54e42009-06-10 18:39:40 -0700135 rsc->appendNameDefines(&tmp);
Jason Samsf1685042009-07-16 17:47:40 -0700136 appendDecls(&tmp);
Joe Onorato57b79ce2009-08-09 22:57:44 -0700137 rsc->appendVarDefines(&tmp);
Jason Sams1fddd902009-09-25 15:25:00 -0700138 appendVarDefines(rsc, &tmp);
139 appendTypes(rsc, &tmp);
Jason Samsb5909ce2009-07-21 12:20:54 -0700140 tmp.append("#line 1\n");
Jason Samsa4a54e42009-06-10 18:39:40 -0700141
Jason Sams8c6bc692009-09-16 15:04:38 -0700142 const char* scriptSource[] = {tmp.string(), s->mEnviroment.mScriptText};
143 int scriptLength[] = {tmp.length(), s->mEnviroment.mScriptTextLength} ;
144 accScriptSource(s->mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
145 accRegisterSymbolCallback(s->mAccScript, symbolLookup, NULL);
146 accCompileScript(s->mAccScript);
147 accGetScriptLabel(s->mAccScript, "main", (ACCvoid**) &s->mProgram.mScript);
148 accGetScriptLabel(s->mAccScript, "init", (ACCvoid**) &s->mProgram.mInit);
149 rsAssert(s->mProgram.mScript);
Jason Sams10308932009-06-09 12:15:30 -0700150
Jason Sams8c6bc692009-09-16 15:04:38 -0700151 if (!s->mProgram.mScript) {
Jason Samsf1685042009-07-16 17:47:40 -0700152 ACCchar buf[4096];
153 ACCsizei len;
Jason Sams8c6bc692009-09-16 15:04:38 -0700154 accGetScriptInfoLog(s->mAccScript, sizeof(buf), &len, buf);
Jason Samsa8919332009-09-24 15:42:52 -0700155 LOGV(buf);
Jason Samsf1685042009-07-16 17:47:40 -0700156 }
157
Jason Sams8c6bc692009-09-16 15:04:38 -0700158 if (s->mProgram.mInit) {
159 s->mProgram.mInit();
Jason Sams1d54f102009-09-03 15:43:13 -0700160 }
161
162 for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
163 if (mSlotNames[ct].length() > 0) {
Jason Sams8c6bc692009-09-16 15:04:38 -0700164 accGetScriptLabel(s->mAccScript,
Jason Sams1d54f102009-09-03 15:43:13 -0700165 mSlotNames[ct].string(),
Jason Sams8c6bc692009-09-16 15:04:38 -0700166 (ACCvoid**) &s->mProgram.mSlotPointers[ct]);
Jason Sams1d54f102009-09-03 15:43:13 -0700167 }
168 }
169
Jason Sams8c6bc692009-09-16 15:04:38 -0700170 for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
171 if (mInvokableNames[ct].length() > 0) {
172 accGetScriptLabel(s->mAccScript,
173 mInvokableNames[ct].string(),
174 (ACCvoid**) &s->mEnviroment.mInvokables[ct]);
175 }
176 }
Jason Samsa4a54e42009-06-10 18:39:40 -0700177
Jason Sams8c6bc692009-09-16 15:04:38 -0700178 s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
179 s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
180 s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
Jason Samsb681c8a2009-09-28 18:12:56 -0700181 s->mEnviroment.mRaster.set(rsc->getDefaultProgramRaster());
Jason Sams8c6bc692009-09-16 15:04:38 -0700182
183 if (s->mProgram.mScript) {
Jason Sams10308932009-06-09 12:15:30 -0700184 const static int pragmaMax = 16;
185 ACCsizei pragmaCount;
186 ACCchar * str[pragmaMax];
Jason Sams8c6bc692009-09-16 15:04:38 -0700187 accGetPragmas(s->mAccScript, &pragmaCount, pragmaMax, &str[0]);
Jason Sams10308932009-06-09 12:15:30 -0700188
Jason Sams10308932009-06-09 12:15:30 -0700189 for (int ct=0; ct < pragmaCount; ct+=2) {
Jason Sams10308932009-06-09 12:15:30 -0700190 if (!strcmp(str[ct], "version")) {
191 continue;
Jason Sams10308932009-06-09 12:15:30 -0700192 }
193
Jason Sams10308932009-06-09 12:15:30 -0700194 if (!strcmp(str[ct], "stateVertex")) {
Jason Sams8ce125b2009-06-17 16:52:59 -0700195 if (!strcmp(str[ct+1], "default")) {
196 continue;
197 }
198 if (!strcmp(str[ct+1], "parent")) {
Jason Sams8c6bc692009-09-16 15:04:38 -0700199 s->mEnviroment.mVertex.clear();
Jason Sams8ce125b2009-06-17 16:52:59 -0700200 continue;
201 }
202 ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
203 if (pv != NULL) {
Jason Sams8c6bc692009-09-16 15:04:38 -0700204 s->mEnviroment.mVertex.set(pv);
Jason Sams8ce125b2009-06-17 16:52:59 -0700205 continue;
206 }
Jason Sams10308932009-06-09 12:15:30 -0700207 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
208 }
209
210 if (!strcmp(str[ct], "stateRaster")) {
Jason Samsb681c8a2009-09-28 18:12:56 -0700211 if (!strcmp(str[ct+1], "default")) {
212 continue;
213 }
214 if (!strcmp(str[ct+1], "parent")) {
215 s->mEnviroment.mRaster.clear();
216 continue;
217 }
218 ProgramRaster * pr = (ProgramRaster *)rsc->lookupName(str[ct+1]);
219 if (pr != NULL) {
220 s->mEnviroment.mRaster.set(pr);
221 continue;
222 }
Jason Sams10308932009-06-09 12:15:30 -0700223 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
224 }
225
226 if (!strcmp(str[ct], "stateFragment")) {
Jason Sams8ce125b2009-06-17 16:52:59 -0700227 if (!strcmp(str[ct+1], "default")) {
228 continue;
229 }
230 if (!strcmp(str[ct+1], "parent")) {
Jason Sams8c6bc692009-09-16 15:04:38 -0700231 s->mEnviroment.mFragment.clear();
Jason Sams8ce125b2009-06-17 16:52:59 -0700232 continue;
233 }
234 ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700235 if (pf != NULL) {
Jason Sams8c6bc692009-09-16 15:04:38 -0700236 s->mEnviroment.mFragment.set(pf);
Jason Sams10308932009-06-09 12:15:30 -0700237 continue;
238 }
239 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
240 }
241
Jason Samsb681c8a2009-09-28 18:12:56 -0700242 if (!strcmp(str[ct], "stateStore")) {
Jason Sams8ce125b2009-06-17 16:52:59 -0700243 if (!strcmp(str[ct+1], "default")) {
244 continue;
245 }
246 if (!strcmp(str[ct+1], "parent")) {
Jason Sams8c6bc692009-09-16 15:04:38 -0700247 s->mEnviroment.mFragmentStore.clear();
Jason Sams8ce125b2009-06-17 16:52:59 -0700248 continue;
249 }
Jason Samsd34b7252009-08-04 16:58:20 -0700250 ProgramFragmentStore * pfs =
Jason Samsa0a1b6f2009-06-10 15:04:38 -0700251 (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
252 if (pfs != NULL) {
Jason Sams8c6bc692009-09-16 15:04:38 -0700253 s->mEnviroment.mFragmentStore.set(pfs);
Jason Sams10308932009-06-09 12:15:30 -0700254 continue;
255 }
Jason Samsb681c8a2009-09-28 18:12:56 -0700256 LOGE("Unreconized value %s passed to stateStore", str[ct+1]);
Jason Sams10308932009-06-09 12:15:30 -0700257 }
258
259 }
260
Jason Samsd34b7252009-08-04 16:58:20 -0700261
Jason Sams10308932009-06-09 12:15:30 -0700262 } else {
263 // Deal with an error.
264 }
Jason Sams326e0dd2009-05-22 14:03:28 -0700265}
266
Jason Sams1d54f102009-09-03 15:43:13 -0700267static void appendElementBody(String8 *s, const Element *e)
268{
269 s->append(" {\n");
270 for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
271 const Component *c = e->getComponent(ct2);
272 s->append(" ");
273 s->append(c->getCType());
274 s->append(" ");
275 s->append(c->getComponentName());
276 s->append(";\n");
277 }
278 s->append("}");
279}
Joe Onorato57b79ce2009-08-09 22:57:44 -0700280
Jason Sams1fddd902009-09-25 15:25:00 -0700281void ScriptCState::appendVarDefines(const Context *rsc, String8 *str)
Joe Onorato57b79ce2009-08-09 22:57:44 -0700282{
283 char buf[256];
Jason Sams1fddd902009-09-25 15:25:00 -0700284 if (rsc->props.mLogScripts) {
285 LOGD("appendVarDefines mInt32Defines.size()=%d mFloatDefines.size()=%d\n",
286 mInt32Defines.size(), mFloatDefines.size());
287 }
Joe Onorato57b79ce2009-08-09 22:57:44 -0700288 for (size_t ct=0; ct < mInt32Defines.size(); ct++) {
289 str->append("#define ");
290 str->append(mInt32Defines.keyAt(ct));
291 str->append(" ");
292 sprintf(buf, "%i\n", (int)mInt32Defines.valueAt(ct));
293 str->append(buf);
294 }
295 for (size_t ct=0; ct < mFloatDefines.size(); ct++) {
296 str->append("#define ");
297 str->append(mFloatDefines.keyAt(ct));
298 str->append(" ");
299 sprintf(buf, "%ff\n", mFloatDefines.valueAt(ct));
300 str->append(buf);
301 }
302}
303
Jason Sams1d54f102009-09-03 15:43:13 -0700304
305
Jason Sams1fddd902009-09-25 15:25:00 -0700306void ScriptCState::appendTypes(const Context *rsc, String8 *str)
Jason Sams8b2c0652009-08-12 17:54:11 -0700307{
308 char buf[256];
Jason Samsfa517192009-08-13 12:59:04 -0700309 String8 tmp;
Jason Sams8b2c0652009-08-12 17:54:11 -0700310
Jason Samsa57c0a72009-09-04 14:42:41 -0700311 str->append("struct vec2_s {float x; float y;};");
312 str->append("struct vec3_s {float x; float y; float z;};");
313 str->append("struct vec4_s {float x; float y; float z; float w;};");
314
Jason Samsfa517192009-08-13 12:59:04 -0700315 for (size_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
Jason Sams8b2c0652009-08-12 17:54:11 -0700316 const Type *t = mConstantBufferTypes[ct].get();
Jason Samsfa517192009-08-13 12:59:04 -0700317 if (!t) {
Jason Sams8b2c0652009-08-12 17:54:11 -0700318 continue;
319 }
Jason Samsfa517192009-08-13 12:59:04 -0700320 const Element *e = t->getElement();
Jason Sams1d54f102009-09-03 15:43:13 -0700321 if (e->getName() && (e->getComponentCount() > 1)) {
322 String8 s("struct struct_");
323 s.append(e->getName());
324 appendElementBody(&s, e);
325 s.append(";\n");
326 s.append("#define ");
327 s.append(e->getName());
328 s.append("_t struct struct_");
329 s.append(e->getName());
330 s.append("\n\n");
Jason Sams1fddd902009-09-25 15:25:00 -0700331 if (rsc->props.mLogScripts) {
332 LOGV(s);
333 }
Jason Sams1d54f102009-09-03 15:43:13 -0700334 str->append(s);
335 }
Jason Samsfa517192009-08-13 12:59:04 -0700336
337 if (t->getName()) {
338 for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
339 const Component *c = e->getComponent(ct2);
340 tmp.setTo("#define OFFSETOF_");
341 tmp.append(t->getName());
342 tmp.append("_");
343 tmp.append(c->getComponentName());
344 sprintf(buf, " %i\n", ct2);
345 tmp.append(buf);
Jason Sams1fddd902009-09-25 15:25:00 -0700346 if (rsc->props.mLogScripts) {
347 LOGV(tmp);
348 }
Jason Samsfa517192009-08-13 12:59:04 -0700349 str->append(tmp);
350 }
Jason Sams8b2c0652009-08-12 17:54:11 -0700351 }
352
Jason Samsfa517192009-08-13 12:59:04 -0700353 if (mSlotNames[ct].length() > 0) {
Jason Sams1d54f102009-09-03 15:43:13 -0700354 String8 s;
355 if (e->getComponentCount() > 1) {
356 if (e->getName()) {
357 // Use the named struct
358 s.setTo(e->getName());
359 s.append("_t *");
360 } else {
361 // create an struct named from the slot.
362 s.setTo("struct ");
363 s.append(mSlotNames[ct]);
364 s.append("_s");
365 appendElementBody(&s, e);
366 s.append(";\n");
367 s.append("struct ");
368 s.append(mSlotNames[ct]);
369 s.append("_s * ");
370 }
371 } else {
372 // Just make an array
373 s.setTo(e->getComponent(0)->getCType());
374 s.append("_t *");
375 }
376 s.append(mSlotNames[ct]);
377 s.append(";\n");
Jason Sams1fddd902009-09-25 15:25:00 -0700378 if (rsc->props.mLogScripts) {
379 LOGV(s);
380 }
Jason Sams1d54f102009-09-03 15:43:13 -0700381 str->append(s);
Jason Samsfa517192009-08-13 12:59:04 -0700382 }
Jason Sams8b2c0652009-08-12 17:54:11 -0700383 }
Jason Sams8b2c0652009-08-12 17:54:11 -0700384}
385
Joe Onorato57b79ce2009-08-09 22:57:44 -0700386
Jason Sams326e0dd2009-05-22 14:03:28 -0700387namespace android {
388namespace renderscript {
389
390void rsi_ScriptCBegin(Context * rsc)
391{
392 ScriptCState *ss = &rsc->mScriptC;
393 ss->clear();
394}
395
Jason Samsefb8de12009-06-08 15:20:31 -0700396void rsi_ScriptCSetScript(Context * rsc, void *vp)
Jason Sams326e0dd2009-05-22 14:03:28 -0700397{
Jason Sams8c6bc692009-09-16 15:04:38 -0700398 rsAssert(0);
399 //ScriptCState *ss = &rsc->mScriptC;
400 //ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp);
Jason Sams326e0dd2009-05-22 14:03:28 -0700401}
402
Jason Sams1f526332009-06-05 17:35:09 -0700403void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
404{
405 ScriptCState *ss = &rsc->mScriptC;
Jason Sams8c6bc692009-09-16 15:04:38 -0700406 ss->mScript->mEnviroment.mScriptText = text;
407 ss->mScript->mEnviroment.mScriptTextLength = len;
Jason Sams1f526332009-06-05 17:35:09 -0700408}
409
410
Jason Sams326e0dd2009-05-22 14:03:28 -0700411RsScript rsi_ScriptCCreate(Context * rsc)
412{
413 ScriptCState *ss = &rsc->mScriptC;
414
Jason Sams8c6bc692009-09-16 15:04:38 -0700415 ScriptC *s = ss->mScript;
416 ss->mScript = NULL;
Jason Sams1f526332009-06-05 17:35:09 -0700417
Jason Sams8c6bc692009-09-16 15:04:38 -0700418 ss->runCompiler(rsc, s);
Jason Sams9397e302009-08-27 20:23:34 -0700419 s->incUserRef();
Jason Samse514b452009-09-25 14:51:22 -0700420 s->setContext(rsc);
Jason Samsfa517192009-08-13 12:59:04 -0700421 for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
422 s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get());
423 s->mSlotNames[ct] = ss->mSlotNames[ct];
Jason Sams90b36a82009-08-17 13:56:09 -0700424 s->mSlotWritable[ct] = ss->mSlotWritable[ct];
Jason Samsfa517192009-08-13 12:59:04 -0700425 }
Jason Sams10308932009-06-09 12:15:30 -0700426
Jason Samsfa517192009-08-13 12:59:04 -0700427 ss->clear();
Jason Sams326e0dd2009-05-22 14:03:28 -0700428 return s;
429}
430
Joe Onorato57b79ce2009-08-09 22:57:44 -0700431void rsi_ScriptCSetDefineF(Context *rsc, const char* name, float value)
432{
433 ScriptCState *ss = &rsc->mScriptC;
434 ss->mFloatDefines.add(String8(name), value);
435}
436
437void rsi_ScriptCSetDefineI32(Context *rsc, const char* name, int32_t value)
438{
439 ScriptCState *ss = &rsc->mScriptC;
440 ss->mInt32Defines.add(String8(name), value);
441}
442
Jason Sams326e0dd2009-05-22 14:03:28 -0700443}
444}
445
446