blob: f99534fa8e08b5705a8282209515c285270817ef [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"
Joe Onorato3370ec92009-08-09 11:39:02 -070020#include "utils/Timers.h"
Alex Sakhartchoukeb1a73c2010-09-24 15:18:12 -070021#include "utils/StopWatch.h"
Jack Palevichec5a20b2009-05-28 15:53:04 -070022
Jason Sams4b962e52009-06-22 17:15:15 -070023#include <GLES/gl.h>
24#include <GLES/glext.h>
25
Alex Sakhartchoukebd65bb2011-02-25 09:34:33 -080026#include <bcc/bcc.h>
27
Jason Samsd19f10d2009-05-22 14:03:28 -070028using namespace android;
29using namespace android::renderscript;
30
Jason Sams462d11b2009-06-19 16:03:18 -070031#define GET_TLS() Context::ScriptTLSStruct * tls = \
32 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
33 Context * rsc = tls->mContext; \
34 ScriptC * sc = (ScriptC *) tls->mScript
35
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080036ScriptC::ScriptC(Context *rsc) : Script(rsc) {
Jason Samsd19f10d2009-05-22 14:03:28 -070037}
38
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080039ScriptC::~ScriptC() {
Jason Samse4a06c52011-03-16 16:29:28 -070040 mRSC->mHal.funcs.script.destroy(mRSC, this);
Jason Sams38f8d9d2011-01-27 00:14:13 -080041
Jason Samse4a06c52011-03-16 16:29:28 -070042 //free(mEnviroment.mScriptText);
43 //mEnviroment.mScriptText = NULL;
Jason Samsd19f10d2009-05-22 14:03:28 -070044}
45
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080046void ScriptC::setupScript(Context *rsc) {
Jason Samsf17bccc2010-05-28 18:23:22 -070047 mEnviroment.mStartTimeMillis
48 = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
49
Jason Samse4a06c52011-03-16 16:29:28 -070050 for (uint32_t ct=0; ct < mHal.info.exportedVariableCount; ct++) {
Jason Samsd081fff2010-09-16 18:18:29 -070051 if (mSlots[ct].get() && !mTypes[ct].get()) {
52 mTypes[ct].set(mSlots[ct]->getType());
53 }
54
55 if (!mTypes[ct].get())
Jason Sams4d339932010-05-11 14:03:58 -070056 continue;
Jason Samsd081fff2010-09-16 18:18:29 -070057 void *ptr = NULL;
58 if (mSlots[ct].get()) {
59 ptr = mSlots[ct]->getPtr();
60 }
Jason Sams4d339932010-05-11 14:03:58 -070061
Jason Samse4a06c52011-03-16 16:29:28 -070062 rsc->mHal.funcs.script.setGlobalBind(rsc, this, ct, ptr);
Jason Samse60446b2009-09-24 14:55:38 -070063 }
64}
65
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080066const Allocation *ScriptC::ptrToAllocation(const void *ptr) const {
Jason Samse4a06c52011-03-16 16:29:28 -070067 //LOGE("ptr to alloc %p", ptr);
Jason Sams1de0b872010-05-17 14:55:34 -070068 if (!ptr) {
69 return NULL;
70 }
Jason Samse4a06c52011-03-16 16:29:28 -070071 for (uint32_t ct=0; ct < mHal.info.exportedVariableCount; ct++) {
Jason Sams1de0b872010-05-17 14:55:34 -070072 if (!mSlots[ct].get())
73 continue;
74 if (mSlots[ct]->getPtr() == ptr) {
75 return mSlots[ct].get();
76 }
77 }
78 LOGE("ScriptC::ptrToAllocation, failed to find %p", ptr);
79 return NULL;
80}
81
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080082Script * ScriptC::setTLS(Script *sc) {
Jason Samsd79b2e92010-05-19 17:22:57 -070083 Context::ScriptTLSStruct * tls = (Context::ScriptTLSStruct *)
84 pthread_getspecific(Context::gThreadTLSKey);
85 rsAssert(tls);
Jason Samsf17bccc2010-05-28 18:23:22 -070086 Script *old = tls->mScript;
87 tls->mScript = sc;
88 return old;
Jason Samsd79b2e92010-05-19 17:22:57 -070089}
90
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080091void ScriptC::setupGLState(Context *rsc) {
Jason Sams3eaa3382009-06-10 15:04:38 -070092 if (mEnviroment.mFragmentStore.get()) {
Jason Samsa17af042010-11-17 15:29:32 -080093 rsc->setProgramStore(mEnviroment.mFragmentStore.get());
Jason Sams3eaa3382009-06-10 15:04:38 -070094 }
95 if (mEnviroment.mFragment.get()) {
Jason Samsa17af042010-11-17 15:29:32 -080096 rsc->setProgramFragment(mEnviroment.mFragment.get());
Jason Sams3eaa3382009-06-10 15:04:38 -070097 }
Jason Sams9c54bdb2009-06-17 16:52:59 -070098 if (mEnviroment.mVertex.get()) {
Jason Samsa17af042010-11-17 15:29:32 -080099 rsc->setProgramVertex(mEnviroment.mVertex.get());
Jason Sams9c54bdb2009-06-17 16:52:59 -0700100 }
Jason Sams5235cf32009-09-28 18:12:56 -0700101 if (mEnviroment.mRaster.get()) {
Jason Samsa17af042010-11-17 15:29:32 -0800102 rsc->setProgramRaster(mEnviroment.mRaster.get());
Jason Sams5235cf32009-09-28 18:12:56 -0700103 }
Jason Samsf17bccc2010-05-28 18:23:22 -0700104}
Jason Sams3eaa3382009-06-10 15:04:38 -0700105
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800106uint32_t ScriptC::run(Context *rsc) {
Jason Samse4a06c52011-03-16 16:29:28 -0700107 if (mHal.info.root == NULL) {
Jason Samsf17bccc2010-05-28 18:23:22 -0700108 rsc->setError(RS_ERROR_BAD_SCRIPT, "Attempted to run bad script");
109 return 0;
Joe Onorato3370ec92009-08-09 11:39:02 -0700110 }
Jason Samsf17bccc2010-05-28 18:23:22 -0700111
Jason Sams4859f522010-12-11 17:42:30 -0800112 setupGLState(rsc);
Jason Samsf17bccc2010-05-28 18:23:22 -0700113 setupScript(rsc);
Jason Sams2525a812009-09-03 15:43:13 -0700114
Jason Samsb9d5c572009-12-09 11:05:45 -0800115 uint32_t ret = 0;
Jason Samsf17bccc2010-05-28 18:23:22 -0700116 Script * oldTLS = setTLS(this);
Jason Samsf119b912010-09-22 15:57:41 -0700117
118 if (rsc->props.mLogScripts) {
Jason Samse4a06c52011-03-16 16:29:28 -0700119 LOGV("%p ScriptC::run invoking root, ptr %p", rsc, mHal.info.root);
Jason Samsf119b912010-09-22 15:57:41 -0700120 }
121
Jason Samse4a06c52011-03-16 16:29:28 -0700122 ret = mHal.info.root();
Jason Samsf119b912010-09-22 15:57:41 -0700123
124 if (rsc->props.mLogScripts) {
125 LOGV("%p ScriptC::run invoking complete, ret=%i", rsc, ret);
126 }
127
Jason Samsf17bccc2010-05-28 18:23:22 -0700128 setTLS(oldTLS);
Jason Samsc97bb882009-07-20 14:31:06 -0700129 return ret;
Jason Samsd19f10d2009-05-22 14:03:28 -0700130}
131
Jason Sams8e6c17f2010-07-19 15:38:19 -0700132typedef struct {
133 Context *rsc;
134 ScriptC *script;
135 const Allocation * ain;
136 Allocation * aout;
137 const void * usr;
138
139 uint32_t mSliceSize;
140 volatile int mSliceNum;
141
142 const uint8_t *ptrIn;
143 uint32_t eStrideIn;
144 uint8_t *ptrOut;
145 uint32_t eStrideOut;
146
147 uint32_t xStart;
148 uint32_t xEnd;
149 uint32_t yStart;
150 uint32_t yEnd;
151 uint32_t zStart;
152 uint32_t zEnd;
153 uint32_t arrayStart;
154 uint32_t arrayEnd;
155
156 uint32_t dimX;
157 uint32_t dimY;
158 uint32_t dimZ;
159 uint32_t dimArray;
160} MTLaunchStruct;
161typedef int (*rs_t)(const void *, void *, const void *, uint32_t, uint32_t, uint32_t, uint32_t);
162
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800163static void wc_xy(void *usr, uint32_t idx) {
Jason Sams8e6c17f2010-07-19 15:38:19 -0700164 MTLaunchStruct *mtls = (MTLaunchStruct *)usr;
Jason Sams8e6c17f2010-07-19 15:38:19 -0700165
166 while (1) {
167 uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum);
168 uint32_t yStart = mtls->yStart + slice * mtls->mSliceSize;
169 uint32_t yEnd = yStart + mtls->mSliceSize;
170 yEnd = rsMin(yEnd, mtls->yEnd);
171 if (yEnd <= yStart) {
172 return;
173 }
174
175 //LOGE("usr idx %i, x %i,%i y %i,%i", idx, mtls->xStart, mtls->xEnd, yStart, yEnd);
Jason Samsf3470ed2010-09-28 14:41:22 -0700176 //LOGE("usr ptr in %p, out %p", mtls->ptrIn, mtls->ptrOut);
Jason Sams8e6c17f2010-07-19 15:38:19 -0700177 for (uint32_t y = yStart; y < yEnd; y++) {
178 uint32_t offset = mtls->dimX * y;
179 uint8_t *xPtrOut = mtls->ptrOut + (mtls->eStrideOut * offset);
180 const uint8_t *xPtrIn = mtls->ptrIn + (mtls->eStrideIn * offset);
181
182 for (uint32_t x = mtls->xStart; x < mtls->xEnd; x++) {
Jason Samse4a06c52011-03-16 16:29:28 -0700183 ((rs_t)mtls->script->mHal.info.root) (xPtrIn, xPtrOut, mtls->usr, x, y, 0, 0);
Jason Sams8e6c17f2010-07-19 15:38:19 -0700184 xPtrIn += mtls->eStrideIn;
185 xPtrOut += mtls->eStrideOut;
186 }
187 }
188 }
Jason Sams8e6c17f2010-07-19 15:38:19 -0700189}
190
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800191static void wc_x(void *usr, uint32_t idx) {
Jason Sams5585e362010-10-29 10:19:21 -0700192 MTLaunchStruct *mtls = (MTLaunchStruct *)usr;
193
194 while (1) {
195 uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum);
196 uint32_t xStart = mtls->xStart + slice * mtls->mSliceSize;
197 uint32_t xEnd = xStart + mtls->mSliceSize;
198 xEnd = rsMin(xEnd, mtls->xEnd);
199 if (xEnd <= xStart) {
200 return;
201 }
202
203 //LOGE("usr idx %i, x %i,%i y %i,%i", idx, mtls->xStart, mtls->xEnd, yStart, yEnd);
204 //LOGE("usr ptr in %p, out %p", mtls->ptrIn, mtls->ptrOut);
205 uint8_t *xPtrOut = mtls->ptrOut + (mtls->eStrideOut * xStart);
206 const uint8_t *xPtrIn = mtls->ptrIn + (mtls->eStrideIn * xStart);
207 for (uint32_t x = xStart; x < xEnd; x++) {
Jason Samse4a06c52011-03-16 16:29:28 -0700208 ((rs_t)mtls->script->mHal.info.root) (xPtrIn, xPtrOut, mtls->usr, x, 0, 0, 0);
Jason Sams5585e362010-10-29 10:19:21 -0700209 xPtrIn += mtls->eStrideIn;
210 xPtrOut += mtls->eStrideOut;
211 }
212 }
Jason Sams5585e362010-10-29 10:19:21 -0700213}
214
Jason Sams8f8a5722010-07-15 17:11:13 -0700215void ScriptC::runForEach(Context *rsc,
216 const Allocation * ain,
217 Allocation * aout,
218 const void * usr,
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800219 const RsScriptCall *sc) {
Jason Sams8e6c17f2010-07-19 15:38:19 -0700220 MTLaunchStruct mtls;
221 memset(&mtls, 0, sizeof(mtls));
Jason Samsa17af042010-11-17 15:29:32 -0800222 Context::PushState ps(rsc);
Jason Samsf17bccc2010-05-28 18:23:22 -0700223
Jason Samse4a06c52011-03-16 16:29:28 -0700224
Jason Sams8e6c17f2010-07-19 15:38:19 -0700225 if (ain) {
226 mtls.dimX = ain->getType()->getDimX();
227 mtls.dimY = ain->getType()->getDimY();
228 mtls.dimZ = ain->getType()->getDimZ();
229 //mtls.dimArray = ain->getType()->getDimArray();
230 } else if (aout) {
231 mtls.dimX = aout->getType()->getDimX();
232 mtls.dimY = aout->getType()->getDimY();
233 mtls.dimZ = aout->getType()->getDimZ();
234 //mtls.dimArray = aout->getType()->getDimArray();
235 } else {
236 rsc->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations");
237 return;
238 }
Jason Sams8f8a5722010-07-15 17:11:13 -0700239
240 if (!sc || (sc->xEnd == 0)) {
Jason Sams8e6c17f2010-07-19 15:38:19 -0700241 mtls.xEnd = mtls.dimX;
Jason Sams8f8a5722010-07-15 17:11:13 -0700242 } else {
Jason Sams8e6c17f2010-07-19 15:38:19 -0700243 rsAssert(sc->xStart < mtls.dimX);
244 rsAssert(sc->xEnd <= mtls.dimX);
Jason Sams8f8a5722010-07-15 17:11:13 -0700245 rsAssert(sc->xStart < sc->xEnd);
Jason Sams8e6c17f2010-07-19 15:38:19 -0700246 mtls.xStart = rsMin(mtls.dimX, sc->xStart);
247 mtls.xEnd = rsMin(mtls.dimX, sc->xEnd);
248 if (mtls.xStart >= mtls.xEnd) return;
Jason Sams8f8a5722010-07-15 17:11:13 -0700249 }
250
251 if (!sc || (sc->yEnd == 0)) {
Jason Sams8e6c17f2010-07-19 15:38:19 -0700252 mtls.yEnd = mtls.dimY;
Jason Sams8f8a5722010-07-15 17:11:13 -0700253 } else {
Jason Sams8e6c17f2010-07-19 15:38:19 -0700254 rsAssert(sc->yStart < mtls.dimY);
255 rsAssert(sc->yEnd <= mtls.dimY);
Jason Sams8f8a5722010-07-15 17:11:13 -0700256 rsAssert(sc->yStart < sc->yEnd);
Jason Sams8e6c17f2010-07-19 15:38:19 -0700257 mtls.yStart = rsMin(mtls.dimY, sc->yStart);
258 mtls.yEnd = rsMin(mtls.dimY, sc->yEnd);
259 if (mtls.yStart >= mtls.yEnd) return;
Jason Sams8f8a5722010-07-15 17:11:13 -0700260 }
261
Jason Sams8e6c17f2010-07-19 15:38:19 -0700262 mtls.xEnd = rsMax((uint32_t)1, mtls.xEnd);
263 mtls.yEnd = rsMax((uint32_t)1, mtls.yEnd);
264 mtls.zEnd = rsMax((uint32_t)1, mtls.zEnd);
265 mtls.arrayEnd = rsMax((uint32_t)1, mtls.arrayEnd);
Jason Sams8f8a5722010-07-15 17:11:13 -0700266
267 rsAssert(ain->getType()->getDimZ() == 0);
Jason Samsf17bccc2010-05-28 18:23:22 -0700268
Jason Sams4859f522010-12-11 17:42:30 -0800269 setupGLState(rsc);
Jason Samsf17bccc2010-05-28 18:23:22 -0700270 setupScript(rsc);
271 Script * oldTLS = setTLS(this);
272
Jason Sams8e6c17f2010-07-19 15:38:19 -0700273 mtls.rsc = rsc;
274 mtls.ain = ain;
275 mtls.aout = aout;
276 mtls.script = this;
277 mtls.usr = usr;
278 mtls.mSliceSize = 10;
279 mtls.mSliceNum = 0;
Jason Samsf17bccc2010-05-28 18:23:22 -0700280
Jason Sams8e6c17f2010-07-19 15:38:19 -0700281 mtls.ptrIn = NULL;
282 mtls.eStrideIn = 0;
283 if (ain) {
284 mtls.ptrIn = (const uint8_t *)ain->getPtr();
285 mtls.eStrideIn = ain->getType()->getElementSizeBytes();
Jason Samsf17bccc2010-05-28 18:23:22 -0700286 }
287
Jason Sams8e6c17f2010-07-19 15:38:19 -0700288 mtls.ptrOut = NULL;
289 mtls.eStrideOut = 0;
290 if (aout) {
291 mtls.ptrOut = (uint8_t *)aout->getPtr();
292 mtls.eStrideOut = aout->getType()->getElementSizeBytes();
293 }
294
Jason Samse4a06c52011-03-16 16:29:28 -0700295 if ((rsc->getWorkerPoolSize() > 1) && mHal.info.isThreadable) {
Jason Sams5585e362010-10-29 10:19:21 -0700296 if (mtls.dimY > 1) {
297 rsc->launchThreads(wc_xy, &mtls);
298 } else {
299 rsc->launchThreads(wc_x, &mtls);
300 }
Jason Samsc7f4e412010-07-20 15:09:00 -0700301
302 //LOGE("launch 1");
Jason Samsc7f4e412010-07-20 15:09:00 -0700303 } else {
Jason Samsf3470ed2010-09-28 14:41:22 -0700304 //LOGE("launch 3");
Jason Samsc7f4e412010-07-20 15:09:00 -0700305 for (uint32_t ar = mtls.arrayStart; ar < mtls.arrayEnd; ar++) {
306 for (uint32_t z = mtls.zStart; z < mtls.zEnd; z++) {
307 for (uint32_t y = mtls.yStart; y < mtls.yEnd; y++) {
308 uint32_t offset = mtls.dimX * mtls.dimY * mtls.dimZ * ar +
309 mtls.dimX * mtls.dimY * z +
310 mtls.dimX * y;
311 uint8_t *xPtrOut = mtls.ptrOut + (mtls.eStrideOut * offset);
312 const uint8_t *xPtrIn = mtls.ptrIn + (mtls.eStrideIn * offset);
Jason Sams8e6c17f2010-07-19 15:38:19 -0700313
Jason Samsc7f4e412010-07-20 15:09:00 -0700314 for (uint32_t x = mtls.xStart; x < mtls.xEnd; x++) {
Jason Samse4a06c52011-03-16 16:29:28 -0700315 ((rs_t)mHal.info.root) (xPtrIn, xPtrOut, usr, x, y, z, ar);
Jason Samsc7f4e412010-07-20 15:09:00 -0700316 xPtrIn += mtls.eStrideIn;
317 xPtrOut += mtls.eStrideOut;
318 }
Jason Sams8f8a5722010-07-15 17:11:13 -0700319 }
320 }
321 }
Jason Samsf17bccc2010-05-28 18:23:22 -0700322 }
Jason Samsc7f4e412010-07-20 15:09:00 -0700323
Jason Samsf17bccc2010-05-28 18:23:22 -0700324 setTLS(oldTLS);
325}
326
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800327void ScriptC::Invoke(Context *rsc, uint32_t slot, const void *data, uint32_t len) {
Jason Samse4a06c52011-03-16 16:29:28 -0700328 if (slot >= mHal.info.exportedFunctionCount) {
Jason Samsd79b2e92010-05-19 17:22:57 -0700329 rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
330 return;
331 }
Jason Samsf17bccc2010-05-28 18:23:22 -0700332 setupScript(rsc);
333 Script * oldTLS = setTLS(this);
Jason Samsd79b2e92010-05-19 17:22:57 -0700334
Jason Samsf119b912010-09-22 15:57:41 -0700335 if (rsc->props.mLogScripts) {
Jason Samse4a06c52011-03-16 16:29:28 -0700336 LOGV("%p ScriptC::Invoke invoking slot %i, ptr %p", rsc, slot, this);
Jason Samsf119b912010-09-22 15:57:41 -0700337 }
Jason Samse4a06c52011-03-16 16:29:28 -0700338 rsc->mHal.funcs.script.invokeFunction(rsc, this, slot, data, len);
Jason Samse29f3e72010-06-08 15:40:48 -0700339
Jason Samsf17bccc2010-05-28 18:23:22 -0700340 setTLS(oldTLS);
Jason Samsd79b2e92010-05-19 17:22:57 -0700341}
342
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800343ScriptCState::ScriptCState() {
Jason Samsd19f10d2009-05-22 14:03:28 -0700344}
345
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800346ScriptCState::~ScriptCState() {
Jason Sams39ddc9502009-06-05 17:35:09 -0700347}
348
Shih-wei Liao076b7702011-01-14 06:21:28 -0800349static void* symbolLookup(void* pContext, char const* name) {
Jason Sams536923d2010-05-18 13:35:45 -0700350 const ScriptCState::SymbolTable_t *sym;
Jason Sams2cbd2982010-08-11 13:26:28 -0700351 ScriptC *s = (ScriptC *)pContext;
Shih-wei Liaob7282bd2010-12-07 13:44:10 -0800352 if (!strcmp(name, "__isThreadable")) {
Jason Samse4a06c52011-03-16 16:29:28 -0700353 return (void*) s->mHal.info.isThreadable;
Shih-wei Liaob7282bd2010-12-07 13:44:10 -0800354 } else if (!strcmp(name, "__clearThreadable")) {
Jason Samse4a06c52011-03-16 16:29:28 -0700355 s->mHal.info.isThreadable = false;
Shih-wei Liaob7282bd2010-12-07 13:44:10 -0800356 return NULL;
357 }
Jason Sams536923d2010-05-18 13:35:45 -0700358 sym = ScriptCState::lookupSymbol(name);
Jason Sams8f0adba2010-11-01 14:26:30 -0700359 if (!sym) {
360 sym = ScriptCState::lookupSymbolCL(name);
Jason Sams536923d2010-05-18 13:35:45 -0700361 }
Jason Sams8f0adba2010-11-01 14:26:30 -0700362 if (!sym) {
363 sym = ScriptCState::lookupSymbolGL(name);
Jason Sams536923d2010-05-18 13:35:45 -0700364 }
Jason Sams54440a02009-07-16 15:08:06 -0700365 if (sym) {
Jason Samse4a06c52011-03-16 16:29:28 -0700366 s->mHal.info.isThreadable &= sym->threadable;
Jason Sams54440a02009-07-16 15:08:06 -0700367 return sym->mPtr;
368 }
Jason Sams54440a02009-07-16 15:08:06 -0700369 LOGE("ScriptC sym lookup failed for %s", name);
Jason Sams54440a02009-07-16 15:08:06 -0700370 return NULL;
371}
Jason Samsd5680f92009-06-10 18:39:40 -0700372
Shih-wei Liao71a2e132011-01-16 02:23:04 -0800373#if 0
Shih-wei Liao0175e012010-10-23 02:15:57 -0700374extern const char rs_runtime_lib_bc[];
375extern unsigned rs_runtime_lib_bc_size;
Shih-wei Liao71a2e132011-01-16 02:23:04 -0800376#endif
Shih-wei Liao0175e012010-10-23 02:15:57 -0700377
Jason Samse4a06c52011-03-16 16:29:28 -0700378bool ScriptC::runCompiler(Context *rsc,
379 const char *resName,
380 const char *cacheDir,
381 const uint8_t *bitcode,
382 size_t bitcodeLen) {
Shih-wei Liao9d4024d2011-01-07 18:17:07 -0800383
Jason Samse4a06c52011-03-16 16:29:28 -0700384 //LOGE("runCompiler %p %p %p %p %p %i", rsc, this, resName, cacheDir, bitcode, bitcodeLen);
Shih-wei Liao9d4024d2011-01-07 18:17:07 -0800385
Jason Samse4a06c52011-03-16 16:29:28 -0700386 rsc->mHal.funcs.script.scriptInit(rsc, this, resName, cacheDir, bitcode, bitcodeLen, 0, symbolLookup);
Shih-wei Liao9d4024d2011-01-07 18:17:07 -0800387
Jason Samse4a06c52011-03-16 16:29:28 -0700388 mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
389 mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
390 mEnviroment.mFragmentStore.set(rsc->getDefaultProgramStore());
391 mEnviroment.mRaster.set(rsc->getDefaultProgramRaster());
Shih-wei Liao9d4024d2011-01-07 18:17:07 -0800392
Jason Samse4a06c52011-03-16 16:29:28 -0700393 rsc->mHal.funcs.script.invokeInit(rsc, this);
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800394
Jason Samse4a06c52011-03-16 16:29:28 -0700395 for (size_t i=0; i < mHal.info.exportedPragmaCount; ++i) {
396 const char * key = mHal.info.exportedPragmaKeyList[i];
397 const char * value = mHal.info.exportedPragmaValueList[i];
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800398 //LOGE("pragma %s %s", keys[i], values[i]);
Jason Samse4a06c52011-03-16 16:29:28 -0700399 if (!strcmp(key, "version")) {
400 if (!strcmp(value, "1")) {
Stephen Hines5dd60be2011-01-18 14:10:44 -0800401 continue;
402 }
Jason Samse4a06c52011-03-16 16:29:28 -0700403 LOGE("Invalid version pragma value: %s\n", value);
Jason Samsfdc54a92011-01-19 16:14:21 -0800404 return false;
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800405 }
406
Jason Samse4a06c52011-03-16 16:29:28 -0700407 if (!strcmp(key, "stateVertex")) {
408 if (!strcmp(value, "default")) {
Jason Samsda423d82009-06-09 12:15:30 -0700409 continue;
Jason Samsda423d82009-06-09 12:15:30 -0700410 }
Jason Samse4a06c52011-03-16 16:29:28 -0700411 if (!strcmp(value, "parent")) {
412 mEnviroment.mVertex.clear();
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800413 continue;
Jason Samsda423d82009-06-09 12:15:30 -0700414 }
Jason Samse4a06c52011-03-16 16:29:28 -0700415 LOGE("Unrecognized value %s passed to stateVertex", value);
Jason Samsfdc54a92011-01-19 16:14:21 -0800416 return false;
Jason Samsda423d82009-06-09 12:15:30 -0700417 }
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800418
Jason Samse4a06c52011-03-16 16:29:28 -0700419 if (!strcmp(key, "stateRaster")) {
420 if (!strcmp(value, "default")) {
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800421 continue;
422 }
Jason Samse4a06c52011-03-16 16:29:28 -0700423 if (!strcmp(value, "parent")) {
424 mEnviroment.mRaster.clear();
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800425 continue;
426 }
Jason Samse4a06c52011-03-16 16:29:28 -0700427 LOGE("Unrecognized value %s passed to stateRaster", value);
Jason Samsfdc54a92011-01-19 16:14:21 -0800428 return false;
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800429 }
430
Jason Samse4a06c52011-03-16 16:29:28 -0700431 if (!strcmp(key, "stateFragment")) {
432 if (!strcmp(value, "default")) {
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800433 continue;
434 }
Jason Samse4a06c52011-03-16 16:29:28 -0700435 if (!strcmp(value, "parent")) {
436 mEnviroment.mFragment.clear();
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800437 continue;
438 }
Jason Samse4a06c52011-03-16 16:29:28 -0700439 LOGE("Unrecognized value %s passed to stateFragment", value);
Jason Samsfdc54a92011-01-19 16:14:21 -0800440 return false;
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800441 }
442
Jason Samse4a06c52011-03-16 16:29:28 -0700443 if (!strcmp(key, "stateStore")) {
444 if (!strcmp(value, "default")) {
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800445 continue;
446 }
Jason Samse4a06c52011-03-16 16:29:28 -0700447 if (!strcmp(value, "parent")) {
448 mEnviroment.mFragmentStore.clear();
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800449 continue;
450 }
Jason Samse4a06c52011-03-16 16:29:28 -0700451 LOGE("Unrecognized value %s passed to stateStore", value);
Jason Samsfdc54a92011-01-19 16:14:21 -0800452 return false;
Stephen Hines5ef3ddd2011-01-17 17:31:58 -0800453 }
Jason Samsda423d82009-06-09 12:15:30 -0700454 }
Jason Sams38f8d9d2011-01-27 00:14:13 -0800455
Jason Samse4a06c52011-03-16 16:29:28 -0700456 mSlots = new ObjectBaseRef<Allocation>[mHal.info.exportedVariableCount];
457 mTypes = new ObjectBaseRef<const Type>[mHal.info.exportedVariableCount];
Jason Sams38f8d9d2011-01-27 00:14:13 -0800458
Jason Samsfdc54a92011-01-19 16:14:21 -0800459 return true;
Jason Samsd19f10d2009-05-22 14:03:28 -0700460}
461
462namespace android {
463namespace renderscript {
464
Shih-wei Liaoeeca4352010-12-20 20:45:56 +0800465RsScript rsi_ScriptCCreate(Context *rsc,
Jason Samse4a06c52011-03-16 16:29:28 -0700466 const char *resName, const char *cacheDir,
467 const char *text, uint32_t len)
Shih-wei Liaoa914f342010-11-08 01:33:59 -0800468{
Jason Samsc55de662011-01-23 17:48:45 -0800469 ScriptC *s = new ScriptC(rsc);
Jason Sams39ddc9502009-06-05 17:35:09 -0700470
Jason Samse4a06c52011-03-16 16:29:28 -0700471 if (!s->runCompiler(rsc, resName, cacheDir, (uint8_t *)text, len)) {
Jason Samsfdc54a92011-01-19 16:14:21 -0800472 // Error during compile, destroy s and return null.
Jason Samsc55de662011-01-23 17:48:45 -0800473 delete s;
Jason Samsfdc54a92011-01-19 16:14:21 -0800474 return NULL;
475 }
Jason Samse4a06c52011-03-16 16:29:28 -0700476
477 s->incUserRef();
Jason Samsc55de662011-01-23 17:48:45 -0800478 return s;
Jason Samsd19f10d2009-05-22 14:03:28 -0700479}
480
Jason Samsd19f10d2009-05-22 14:03:28 -0700481}
482}