rsScriptC.cpp revision a6ebec8cf4a9c420fba74a80c7238b5f20b5966a
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h" 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsScriptC.h" 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsMatrix.h" 20e7b4b86cf8ff443ce4f7bdf7050ab9e3cf39a6d5Anatol Pomazau#include "../../compile/libbcc/include/bcc/bcc.h" 219c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato#include "utils/Timers.h" 22b26fb04770442244233b630960f419cb154abc77Alex Sakhartchouk#include "utils/StopWatch.h" 23ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liaoextern "C" { 24ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao#include "libdex/ZipArchive.h" 25ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao} 261ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich 271aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/gl.h> 281aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/glext.h> 291aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 33e57691037aea219562ac686429b4b98202aab7bcJason Sams#define GET_TLS() Context::ScriptTLSStruct * tls = \ 34e57691037aea219562ac686429b4b98202aab7bcJason Sams (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \ 35e57691037aea219562ac686429b4b98202aab7bcJason Sams Context * rsc = tls->mContext; \ 36e57691037aea219562ac686429b4b98202aab7bcJason Sams ScriptC * sc = (ScriptC *) tls->mScript 37e57691037aea219562ac686429b4b98202aab7bcJason Sams 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 39afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukScriptC::ScriptC(Context *rsc) : Script(rsc) { 40a6ebec8cf4a9c420fba74a80c7238b5f20b5966aShih-wei Liao LOGD(">>>> ScriptC ctor called, obj=%x", this); 41be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams mBccScript = NULL; 42efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams memset(&mProgram, 0, sizeof(mProgram)); 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 45afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukScriptC::~ScriptC() { 46a6ebec8cf4a9c420fba74a80c7238b5f20b5966aShih-wei Liao LOGD(">>>> ~ScriptC()"); 47be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if (mBccScript) { 48be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccDeleteScript(mBccScript); 49a6ebec8cf4a9c420fba74a80c7238b5f20b5966aShih-wei Liao LOGD(">>>> ~ScriptC(mBCCScript)"); 501ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich } 51e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams free(mEnviroment.mScriptText); 52e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams mEnviroment.mScriptText = NULL; 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 55afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ScriptC::setupScript(Context *rsc) { 56c61346b91434307c5003029017b54ce9c49112beJason Sams mEnviroment.mStartTimeMillis 57c61346b91434307c5003029017b54ce9c49112beJason Sams = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC)); 58c61346b91434307c5003029017b54ce9c49112beJason Sams 59be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams for (uint32_t ct=0; ct < mEnviroment.mFieldCount; ct++) { 60900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams if (mSlots[ct].get() && !mTypes[ct].get()) { 61900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams mTypes[ct].set(mSlots[ct]->getType()); 62900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams } 63900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams 64900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams if (!mTypes[ct].get()) 65be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams continue; 66900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams void *ptr = NULL; 67900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams if (mSlots[ct].get()) { 68900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams ptr = mSlots[ct]->getPtr(); 69900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams } 70be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams void **dest = ((void ***)mEnviroment.mFieldAddress)[ct]; 71be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 72b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams if (rsc->props.mLogScripts) { 732fad7e47a8177235bb88fe271572bd986a7e4136Jason Sams if (mSlots[ct].get() != NULL) { 742fad7e47a8177235bb88fe271572bd986a7e4136Jason Sams LOGV("%p ScriptC::setupScript slot=%i dst=%p src=%p type=%p", rsc, ct, dest, ptr, mSlots[ct]->getType()); 752fad7e47a8177235bb88fe271572bd986a7e4136Jason Sams } else { 762fad7e47a8177235bb88fe271572bd986a7e4136Jason Sams LOGV("%p ScriptC::setupScript slot=%i dst=%p src=%p type=null", rsc, ct, dest, ptr); 772fad7e47a8177235bb88fe271572bd986a7e4136Jason Sams } 78b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams } 79be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 80be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if (dest) { 81be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams *dest = ptr; 82ada7f272890d8791bc518c95989ad7d13050834dJason Sams } 83ada7f272890d8791bc518c95989ad7d13050834dJason Sams } 84ada7f272890d8791bc518c95989ad7d13050834dJason Sams} 85ada7f272890d8791bc518c95989ad7d13050834dJason Sams 86afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukconst Allocation *ScriptC::ptrToAllocation(const void *ptr) const { 87ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams if (!ptr) { 88ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams return NULL; 89ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams } 90ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams for (uint32_t ct=0; ct < mEnviroment.mFieldCount; ct++) { 91ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams if (!mSlots[ct].get()) 92ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams continue; 93ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams if (mSlots[ct]->getPtr() == ptr) { 94ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams return mSlots[ct].get(); 95ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams } 96ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams } 97ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams LOGE("ScriptC::ptrToAllocation, failed to find %p", ptr); 98ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams return NULL; 99ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams} 100ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams 101afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukScript * ScriptC::setTLS(Script *sc) { 10222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams Context::ScriptTLSStruct * tls = (Context::ScriptTLSStruct *) 10322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams pthread_getspecific(Context::gThreadTLSKey); 10422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams rsAssert(tls); 105c61346b91434307c5003029017b54ce9c49112beJason Sams Script *old = tls->mScript; 106c61346b91434307c5003029017b54ce9c49112beJason Sams tls->mScript = sc; 107c61346b91434307c5003029017b54ce9c49112beJason Sams return old; 10822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams} 10922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 110afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ScriptC::setupGLState(Context *rsc) { 111a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams if (mEnviroment.mFragmentStore.get()) { 11260709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->setProgramStore(mEnviroment.mFragmentStore.get()); 113a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams } 114a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams if (mEnviroment.mFragment.get()) { 11560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->setProgramFragment(mEnviroment.mFragment.get()); 116a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams } 1178ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (mEnviroment.mVertex.get()) { 11860709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->setProgramVertex(mEnviroment.mVertex.get()); 1198ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 120b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (mEnviroment.mRaster.get()) { 12160709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->setProgramRaster(mEnviroment.mRaster.get()); 122b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams } 123c61346b91434307c5003029017b54ce9c49112beJason Sams} 124a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams 125afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukuint32_t ScriptC::run(Context *rsc) { 126c61346b91434307c5003029017b54ce9c49112beJason Sams if (mProgram.mRoot == NULL) { 127c61346b91434307c5003029017b54ce9c49112beJason Sams rsc->setError(RS_ERROR_BAD_SCRIPT, "Attempted to run bad script"); 128c61346b91434307c5003029017b54ce9c49112beJason Sams return 0; 1299c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato } 130c61346b91434307c5003029017b54ce9c49112beJason Sams 1311f24db404b2cf8768bf2bd53a3caeb5812b8ce9fJason Sams setupGLState(rsc); 132c61346b91434307c5003029017b54ce9c49112beJason Sams setupScript(rsc); 1331d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams 1342dca84dd6c07992f78ad050177975f16486dd77eJason Sams uint32_t ret = 0; 135c61346b91434307c5003029017b54ce9c49112beJason Sams Script * oldTLS = setTLS(this); 136b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams 137b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams if (rsc->props.mLogScripts) { 138b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams LOGV("%p ScriptC::run invoking root, ptr %p", rsc, mProgram.mRoot); 139b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams } 140b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams 141be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams ret = mProgram.mRoot(); 142b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams 143b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams if (rsc->props.mLogScripts) { 144b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams LOGV("%p ScriptC::run invoking complete, ret=%i", rsc, ret); 145b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams } 146b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams 147c61346b91434307c5003029017b54ce9c49112beJason Sams setTLS(oldTLS); 148e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams return ret; 149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1517bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Samstypedef struct { 1527bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams Context *rsc; 1537bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams ScriptC *script; 1547bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams const Allocation * ain; 1557bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams Allocation * aout; 1567bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams const void * usr; 1577bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 1587bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t mSliceSize; 1597bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams volatile int mSliceNum; 1607bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 1617bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams const uint8_t *ptrIn; 1627bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t eStrideIn; 1637bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint8_t *ptrOut; 1647bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t eStrideOut; 1657bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 1667bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t xStart; 1677bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t xEnd; 1687bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t yStart; 1697bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t yEnd; 1707bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t zStart; 1717bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t zEnd; 1727bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t arrayStart; 1737bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t arrayEnd; 1747bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 1757bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t dimX; 1767bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t dimY; 1777bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t dimZ; 1787bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t dimArray; 1797bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams} MTLaunchStruct; 1807bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Samstypedef int (*rs_t)(const void *, void *, const void *, uint32_t, uint32_t, uint32_t, uint32_t); 1817bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 182afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void wc_xy(void *usr, uint32_t idx) { 1837bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams MTLaunchStruct *mtls = (MTLaunchStruct *)usr; 1847bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 1857bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams while (1) { 1867bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum); 1877bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t yStart = mtls->yStart + slice * mtls->mSliceSize; 1887bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t yEnd = yStart + mtls->mSliceSize; 1897bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams yEnd = rsMin(yEnd, mtls->yEnd); 1907bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams if (yEnd <= yStart) { 1917bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams return; 1927bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams } 1937bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 1947bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams //LOGE("usr idx %i, x %i,%i y %i,%i", idx, mtls->xStart, mtls->xEnd, yStart, yEnd); 1958d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams //LOGE("usr ptr in %p, out %p", mtls->ptrIn, mtls->ptrOut); 1967bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams for (uint32_t y = yStart; y < yEnd; y++) { 1977bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint32_t offset = mtls->dimX * y; 1987bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams uint8_t *xPtrOut = mtls->ptrOut + (mtls->eStrideOut * offset); 1997bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams const uint8_t *xPtrIn = mtls->ptrIn + (mtls->eStrideIn * offset); 2007bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 2017bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams for (uint32_t x = mtls->xStart; x < mtls->xEnd; x++) { 2027bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams ((rs_t)mtls->script->mProgram.mRoot) (xPtrIn, xPtrOut, mtls->usr, x, y, 0, 0); 2037bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams xPtrIn += mtls->eStrideIn; 2047bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams xPtrOut += mtls->eStrideOut; 2057bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams } 2067bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams } 2077bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams } 2087bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams} 2097bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 210afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void wc_x(void *usr, uint32_t idx) { 211177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams MTLaunchStruct *mtls = (MTLaunchStruct *)usr; 212177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams 213177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams while (1) { 214177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum); 215177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams uint32_t xStart = mtls->xStart + slice * mtls->mSliceSize; 216177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams uint32_t xEnd = xStart + mtls->mSliceSize; 217177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams xEnd = rsMin(xEnd, mtls->xEnd); 218177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams if (xEnd <= xStart) { 219177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams return; 220177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams } 221177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams 222177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams //LOGE("usr idx %i, x %i,%i y %i,%i", idx, mtls->xStart, mtls->xEnd, yStart, yEnd); 223177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams //LOGE("usr ptr in %p, out %p", mtls->ptrIn, mtls->ptrOut); 224177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams uint8_t *xPtrOut = mtls->ptrOut + (mtls->eStrideOut * xStart); 225177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams const uint8_t *xPtrIn = mtls->ptrIn + (mtls->eStrideIn * xStart); 226177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams for (uint32_t x = xStart; x < xEnd; x++) { 227177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams ((rs_t)mtls->script->mProgram.mRoot) (xPtrIn, xPtrOut, mtls->usr, x, 0, 0, 0); 228177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams xPtrIn += mtls->eStrideIn; 229177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams xPtrOut += mtls->eStrideOut; 230177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams } 231177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams } 232177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams} 233177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams 234ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Samsvoid ScriptC::runForEach(Context *rsc, 235ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams const Allocation * ain, 236ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams Allocation * aout, 237ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams const void * usr, 238afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk const RsScriptCall *sc) { 2397bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams MTLaunchStruct mtls; 2407bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams memset(&mtls, 0, sizeof(mtls)); 24160709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams Context::PushState ps(rsc); 2427bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 2437bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams if (ain) { 2447bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.dimX = ain->getType()->getDimX(); 2457bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.dimY = ain->getType()->getDimY(); 2467bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.dimZ = ain->getType()->getDimZ(); 2477bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams //mtls.dimArray = ain->getType()->getDimArray(); 2487bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams } else if (aout) { 2497bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.dimX = aout->getType()->getDimX(); 2507bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.dimY = aout->getType()->getDimY(); 2517bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.dimZ = aout->getType()->getDimZ(); 2527bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams //mtls.dimArray = aout->getType()->getDimArray(); 2537bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams } else { 2547bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams rsc->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations"); 2557bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams return; 2567bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams } 257ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams 258ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams if (!sc || (sc->xEnd == 0)) { 2597bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.xEnd = mtls.dimX; 260ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams } else { 2617bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams rsAssert(sc->xStart < mtls.dimX); 2627bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams rsAssert(sc->xEnd <= mtls.dimX); 263ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams rsAssert(sc->xStart < sc->xEnd); 2647bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.xStart = rsMin(mtls.dimX, sc->xStart); 2657bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.xEnd = rsMin(mtls.dimX, sc->xEnd); 2667bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams if (mtls.xStart >= mtls.xEnd) return; 267ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams } 268c61346b91434307c5003029017b54ce9c49112beJason Sams 269ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams if (!sc || (sc->yEnd == 0)) { 2707bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.yEnd = mtls.dimY; 271ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams } else { 2727bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams rsAssert(sc->yStart < mtls.dimY); 2737bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams rsAssert(sc->yEnd <= mtls.dimY); 274ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams rsAssert(sc->yStart < sc->yEnd); 2757bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.yStart = rsMin(mtls.dimY, sc->yStart); 2767bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.yEnd = rsMin(mtls.dimY, sc->yEnd); 2777bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams if (mtls.yStart >= mtls.yEnd) return; 278ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams } 279ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams 2807bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.xEnd = rsMax((uint32_t)1, mtls.xEnd); 2817bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.yEnd = rsMax((uint32_t)1, mtls.yEnd); 2827bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.zEnd = rsMax((uint32_t)1, mtls.zEnd); 2837bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.arrayEnd = rsMax((uint32_t)1, mtls.arrayEnd); 284ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams 285ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams rsAssert(ain->getType()->getDimZ() == 0); 286c61346b91434307c5003029017b54ce9c49112beJason Sams 2871f24db404b2cf8768bf2bd53a3caeb5812b8ce9fJason Sams setupGLState(rsc); 288c61346b91434307c5003029017b54ce9c49112beJason Sams setupScript(rsc); 289c61346b91434307c5003029017b54ce9c49112beJason Sams Script * oldTLS = setTLS(this); 290c61346b91434307c5003029017b54ce9c49112beJason Sams 2917bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.rsc = rsc; 2927bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.ain = ain; 2937bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.aout = aout; 2947bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.script = this; 2957bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.usr = usr; 2967bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.mSliceSize = 10; 2977bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.mSliceNum = 0; 2987bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 2997bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.ptrIn = NULL; 3007bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.eStrideIn = 0; 3017bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams if (ain) { 3027bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.ptrIn = (const uint8_t *)ain->getPtr(); 3037bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.eStrideIn = ain->getType()->getElementSizeBytes(); 3047bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams } 305c61346b91434307c5003029017b54ce9c49112beJason Sams 3067bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.ptrOut = NULL; 3077bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.eStrideOut = 0; 308c61346b91434307c5003029017b54ce9c49112beJason Sams if (aout) { 3097bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.ptrOut = (uint8_t *)aout->getPtr(); 3107bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams mtls.eStrideOut = aout->getType()->getElementSizeBytes(); 311c61346b91434307c5003029017b54ce9c49112beJason Sams } 312c61346b91434307c5003029017b54ce9c49112beJason Sams 313177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams if ((rsc->getWorkerPoolSize() > 1) && mEnviroment.mIsThreadable) { 314177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams if (mtls.dimY > 1) { 315177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams rsc->launchThreads(wc_xy, &mtls); 316177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams } else { 317177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams rsc->launchThreads(wc_x, &mtls); 318177f8446d58e5b1a4258935371a9450dbe34dca6Jason Sams } 3197bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 320181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams //LOGE("launch 1"); 321181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams } else { 3228d957fa762eff6c03a93ddea9405d9575665f1ecJason Sams //LOGE("launch 3"); 323181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams for (uint32_t ar = mtls.arrayStart; ar < mtls.arrayEnd; ar++) { 324181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams for (uint32_t z = mtls.zStart; z < mtls.zEnd; z++) { 325181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams for (uint32_t y = mtls.yStart; y < mtls.yEnd; y++) { 326181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams uint32_t offset = mtls.dimX * mtls.dimY * mtls.dimZ * ar + 327181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams mtls.dimX * mtls.dimY * z + 328181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams mtls.dimX * y; 329181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams uint8_t *xPtrOut = mtls.ptrOut + (mtls.eStrideOut * offset); 330181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams const uint8_t *xPtrIn = mtls.ptrIn + (mtls.eStrideIn * offset); 331181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams 332181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams for (uint32_t x = mtls.xStart; x < mtls.xEnd; x++) { 333181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams ((rs_t)mProgram.mRoot) (xPtrIn, xPtrOut, usr, x, y, z, ar); 334181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams xPtrIn += mtls.eStrideIn; 335181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams xPtrOut += mtls.eStrideOut; 336181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams } 337ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams } 338ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams } 339ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams } 340c61346b91434307c5003029017b54ce9c49112beJason Sams } 341181334092f78273d0da2d854ebbe7b24508d3bfcJason Sams 342c61346b91434307c5003029017b54ce9c49112beJason Sams setTLS(oldTLS); 343c61346b91434307c5003029017b54ce9c49112beJason Sams} 344c61346b91434307c5003029017b54ce9c49112beJason Sams 345afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ScriptC::Invoke(Context *rsc, uint32_t slot, const void *data, uint32_t len) { 34622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams if ((slot >= mEnviroment.mInvokeFunctionCount) || 34722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams (mEnviroment.mInvokeFunctions[slot] == NULL)) { 34822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script"); 34922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams return; 35022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams } 351c61346b91434307c5003029017b54ce9c49112beJason Sams setupScript(rsc); 352c61346b91434307c5003029017b54ce9c49112beJason Sams Script * oldTLS = setTLS(this); 35322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 354b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams if (rsc->props.mLogScripts) { 355b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams LOGV("%p ScriptC::Invoke invoking slot %i, ptr %p", rsc, slot, mEnviroment.mInvokeFunctions[slot]); 356b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams } 3572a63bf6c293d89c8e3725cfb7ee2add3dd3f0246Jason Sams ((void (*)(const void *, uint32_t)) 3582a63bf6c293d89c8e3725cfb7ee2add3dd3f0246Jason Sams mEnviroment.mInvokeFunctions[slot])(data, len); 359b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams if (rsc->props.mLogScripts) { 360b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams LOGV("%p ScriptC::Invoke complete", rsc); 361b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams } 3622a63bf6c293d89c8e3725cfb7ee2add3dd3f0246Jason Sams 363c61346b91434307c5003029017b54ce9c49112beJason Sams setTLS(oldTLS); 36422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams} 36522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 366afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukScriptCState::ScriptCState() { 36701b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines mScript.clear(); 368326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 369326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 370afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukScriptCState::~ScriptCState() { 37101b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines mScript.clear(); 372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 374afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ScriptCState::init(Context *rsc) { 37501b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines clear(rsc); 37601b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines} 37701b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines 378afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ScriptCState::clear(Context *rsc) { 37901b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines rsAssert(rsc); 38001b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines mScript.clear(); 38101b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines mScript.set(new ScriptC(rsc)); 3821f52633fefd1862451e6a30209d590680d02beecJason Sams} 3831f52633fefd1862451e6a30209d590680d02beecJason Sams 384afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name) { 385aeb094b520d8ea49b74129927578f18f758c873eJason Sams const ScriptCState::SymbolTable_t *sym; 386dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams ScriptC *s = (ScriptC *)pContext; 387f17b13be814135b85e6aed7e3cca441c8e00e8c4Shih-wei Liao if (!strcmp(name, "__isThreadable")) { 388f17b13be814135b85e6aed7e3cca441c8e00e8c4Shih-wei Liao return (BCCvoid*) s->mEnviroment.mIsThreadable; 389f17b13be814135b85e6aed7e3cca441c8e00e8c4Shih-wei Liao } else if (!strcmp(name, "__clearThreadable")) { 390f17b13be814135b85e6aed7e3cca441c8e00e8c4Shih-wei Liao s->mEnviroment.mIsThreadable = false; 391f17b13be814135b85e6aed7e3cca441c8e00e8c4Shih-wei Liao return NULL; 392f17b13be814135b85e6aed7e3cca441c8e00e8c4Shih-wei Liao } 393aeb094b520d8ea49b74129927578f18f758c873eJason Sams sym = ScriptCState::lookupSymbol(name); 3946bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams if (!sym) { 3956bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams sym = ScriptCState::lookupSymbolCL(name); 396aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 3976bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams if (!sym) { 3986bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams sym = ScriptCState::lookupSymbolGL(name); 399aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 40029df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams if (sym) { 4016bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams s->mEnviroment.mIsThreadable &= sym->threadable; 40229df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams return sym->mPtr; 40329df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams } 40429df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams LOGE("ScriptC sym lookup failed for %s", name); 40529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams return NULL; 40629df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams} 407a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 4081f9ba735cc429ae8df140644f6f0a4481f2a8068Shih-wei Liaoextern const char rs_runtime_lib_bc[]; 4091f9ba735cc429ae8df140644f6f0a4481f2a8068Shih-wei Liaoextern unsigned rs_runtime_lib_bc_size; 4101f9ba735cc429ae8df140644f6f0a4481f2a8068Shih-wei Liao 411ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liaovoid ScriptCState::runCompiler(Context *rsc, 412ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao ScriptC *s, 413ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao long modWhen, 414ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao long crc32, 415ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao const char *resName, 416ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao const char *cacheDir) { 417b26fb04770442244233b630960f419cb154abc77Alex Sakhartchouk { 418b26fb04770442244233b630960f419cb154abc77Alex Sakhartchouk s->mBccScript = bccCreateScript(); 419b26fb04770442244233b630960f419cb154abc77Alex Sakhartchouk s->mEnviroment.mIsThreadable = true; 420b26fb04770442244233b630960f419cb154abc77Alex Sakhartchouk bccRegisterSymbolCallback(s->mBccScript, symbolLookup, s); 4219503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao // bccReadBC() reads in the BitCode, if no cache file corresponding to 4229503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao // the resName is found. Otherwise, bccReadBC() returns a negative value 4239503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao // and the "else" branch will be taken. 4249503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao if (bccReadBC(s->mBccScript, 4259503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao s->mEnviroment.mScriptText, 4269503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao s->mEnviroment.mScriptTextLength, 427ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao modWhen, 428ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao crc32, 42915849d9a926fbd83587b9da30b8888574998a0fdShih-wei Liao resName, 43015849d9a926fbd83587b9da30b8888574998a0fdShih-wei Liao cacheDir) >= 0) { 4319503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao //bccLinkBC(s->mBccScript, rs_runtime_lib_bc, rs_runtime_lib_bc_size); 4329503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao bccCompileBC(s->mBccScript); 4339503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao } else { 4349503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao // bccReadBC returns a neagative value: Didn't read any script, 4359503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao // So, use cached binary instead 436ff8ce9cd935cd03ec8a7c564b7cf06783c8f8c73Shih-wei Liao if (bccLoadBinary(s->mBccScript)) { // LoadBinary fails ==> Recompile 437ff8ce9cd935cd03ec8a7c564b7cf06783c8f8c73Shih-wei Liao bccReadBC(s->mBccScript, 438ff8ce9cd935cd03ec8a7c564b7cf06783c8f8c73Shih-wei Liao s->mEnviroment.mScriptText, 439ff8ce9cd935cd03ec8a7c564b7cf06783c8f8c73Shih-wei Liao s->mEnviroment.mScriptTextLength, 440ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao modWhen, 441ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao crc32, 442a6ebec8cf4a9c420fba74a80c7238b5f20b5966aShih-wei Liao resName, 443ff8ce9cd935cd03ec8a7c564b7cf06783c8f8c73Shih-wei Liao cacheDir); 444ff8ce9cd935cd03ec8a7c564b7cf06783c8f8c73Shih-wei Liao bccCompileBC(s->mBccScript); 445ff8ce9cd935cd03ec8a7c564b7cf06783c8f8c73Shih-wei Liao } 4469503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao } 447b26fb04770442244233b630960f419cb154abc77Alex Sakhartchouk bccGetScriptLabel(s->mBccScript, "root", (BCCvoid**) &s->mProgram.mRoot); 448b26fb04770442244233b630960f419cb154abc77Alex Sakhartchouk bccGetScriptLabel(s->mBccScript, "init", (BCCvoid**) &s->mProgram.mInit); 449b26fb04770442244233b630960f419cb154abc77Alex Sakhartchouk } 450b9077f48e2c5aff1838bbbeccf56c2b5f5490ab6Jason Sams LOGV("%p ScriptCState::runCompiler root %p, init %p", rsc, s->mProgram.mRoot, s->mProgram.mInit); 451f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams 4528c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams if (s->mProgram.mInit) { 4538c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mProgram.mInit(); 4541d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams } 4551d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams 4568c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams bccGetExportFuncs(s->mBccScript, (BCCsizei*) &s->mEnviroment.mInvokeFunctionCount, 0, NULL); 457afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (s->mEnviroment.mInvokeFunctionCount <= 0) 4588c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams s->mEnviroment.mInvokeFunctions = NULL; 4598c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams else { 4608c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams s->mEnviroment.mInvokeFunctions = (Script::InvokeFunc_t*) calloc(s->mEnviroment.mInvokeFunctionCount, sizeof(Script::InvokeFunc_t)); 4618c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams bccGetExportFuncs(s->mBccScript, NULL, s->mEnviroment.mInvokeFunctionCount, (BCCvoid **) s->mEnviroment.mInvokeFunctions); 4628c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams } 4638c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams 464a226b166dde77ae4bf4202a60afd14339b040dd3Shih-wei Liao bccGetExportVars(s->mBccScript, (BCCsizei*) &s->mEnviroment.mFieldCount, 0, NULL); 465afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (s->mEnviroment.mFieldCount <= 0) 466a226b166dde77ae4bf4202a60afd14339b040dd3Shih-wei Liao s->mEnviroment.mFieldAddress = NULL; 467a226b166dde77ae4bf4202a60afd14339b040dd3Shih-wei Liao else { 468a226b166dde77ae4bf4202a60afd14339b040dd3Shih-wei Liao s->mEnviroment.mFieldAddress = (void **) calloc(s->mEnviroment.mFieldCount, sizeof(void *)); 469a226b166dde77ae4bf4202a60afd14339b040dd3Shih-wei Liao bccGetExportVars(s->mBccScript, NULL, s->mEnviroment.mFieldCount, (BCCvoid **) s->mEnviroment.mFieldAddress); 470700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk s->initSlots(); 471a226b166dde77ae4bf4202a60afd14339b040dd3Shih-wei Liao } 4721d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams 4738c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment()); 4748c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex()); 475ccc010bb7c0f89e162bf60033968a20be90a903aJason Sams s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramStore()); 476b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams s->mEnviroment.mRaster.set(rsc->getDefaultProgramRaster()); 477a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 478be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if (s->mProgram.mRoot) { 4791030893d9b99b72468034da13df025bda479bb97Jason Sams const static int pragmaMax = 16; 480be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams BCCsizei pragmaCount; 481be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams BCCchar * str[pragmaMax]; 482be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetPragmas(s->mBccScript, &pragmaCount, pragmaMax, &str[0]); 4831030893d9b99b72468034da13df025bda479bb97Jason Sams 4841030893d9b99b72468034da13df025bda479bb97Jason Sams for (int ct=0; ct < pragmaCount; ct+=2) { 485aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("pragme %s %s", str[ct], str[ct+1]); 4861030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "version")) { 4871030893d9b99b72468034da13df025bda479bb97Jason Sams continue; 4881030893d9b99b72468034da13df025bda479bb97Jason Sams } 4891030893d9b99b72468034da13df025bda479bb97Jason Sams 4901030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateVertex")) { 4918ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 4928ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 4938ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 4948ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 4958c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mVertex.clear(); 4968ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 4978ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 4981030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateVertex", str[ct+1]); 4991030893d9b99b72468034da13df025bda479bb97Jason Sams } 5001030893d9b99b72468034da13df025bda479bb97Jason Sams 5011030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateRaster")) { 502b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (!strcmp(str[ct+1], "default")) { 503b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams continue; 504b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams } 505b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (!strcmp(str[ct+1], "parent")) { 506b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams s->mEnviroment.mRaster.clear(); 507b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams continue; 508b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams } 5091030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateRaster", str[ct+1]); 5101030893d9b99b72468034da13df025bda479bb97Jason Sams } 5111030893d9b99b72468034da13df025bda479bb97Jason Sams 5121030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateFragment")) { 5138ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 5148ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 5158ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 5168ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 5178c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mFragment.clear(); 5188ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 5198ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 5201030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateFragment", str[ct+1]); 5211030893d9b99b72468034da13df025bda479bb97Jason Sams } 5221030893d9b99b72468034da13df025bda479bb97Jason Sams 523b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (!strcmp(str[ct], "stateStore")) { 5248ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 5258ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 5268ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 5278ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 5288c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mFragmentStore.clear(); 5298ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 5308ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 531b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams LOGE("Unreconized value %s passed to stateStore", str[ct+1]); 5321030893d9b99b72468034da13df025bda479bb97Jason Sams } 5331030893d9b99b72468034da13df025bda479bb97Jason Sams 5341030893d9b99b72468034da13df025bda479bb97Jason Sams } 5351030893d9b99b72468034da13df025bda479bb97Jason Sams 536d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams 5371030893d9b99b72468034da13df025bda479bb97Jason Sams } else { 5381030893d9b99b72468034da13df025bda479bb97Jason Sams // Deal with an error. 5391030893d9b99b72468034da13df025bda479bb97Jason Sams } 54057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato} 5411030893d9b99b72468034da13df025bda479bb97Jason Sams 542326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 543326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 544326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 545afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_ScriptCBegin(Context * rsc) { 546326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptCState *ss = &rsc->mScriptC; 54701b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines ss->clear(rsc); 548326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 549326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 550afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) { 5511f52633fefd1862451e6a30209d590680d02beecJason Sams ScriptCState *ss = &rsc->mScriptC; 552e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams 553e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams char *t = (char *)malloc(len + 1); 554e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams memcpy(t, text, len); 555e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams t[len] = 0; 556e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams ss->mScript->mEnviroment.mScriptText = t; 5578c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams ss->mScript->mEnviroment.mScriptTextLength = len; 5581f52633fefd1862451e6a30209d590680d02beecJason Sams} 5591f52633fefd1862451e6a30209d590680d02beecJason Sams 560ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao 561ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei LiaoRsScript rsi_ScriptCCreate(Context *rsc, 562ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao const char *packageName, 563ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao const char *resName, 564ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao const char *cacheDir) 5659503b66e5329703535f7cc71a0755e6f3b1e39a6Shih-wei Liao{ 566326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptCState *ss = &rsc->mScriptC; 567326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 568225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams ObjectBaseRef<ScriptC> s(ss->mScript); 56901b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines ss->mScript.clear(); 570225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams s->incUserRef(); 5711f52633fefd1862451e6a30209d590680d02beecJason Sams 572ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao // Open the apk and return the ZipArchive: 573ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao // int dexZipOpenArchive(const char* fileName, ZipArchive* pArchive) 574ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao ZipArchive archive; 575ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao long modWhen; 576ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao long crc32; 577ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao if (!dexZipOpenArchive(packageName, &archive)) { // Success 578ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao ZipEntry entry = dexZipFindEntry(&archive, resName); 579ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao 580ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao int method; 581ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao size_t uncompLen; 582ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao size_t compLen; 583ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao off_t offset; 584ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao if (!dexZipGetEntryInfo(&archive, 585ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao entry, 586ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao &method, 587ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao &uncompLen, 588ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao &compLen, 589ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao &offset, 590ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao &modWhen, 591ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao &crc32)) { 592ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao } else { 593ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao LOGI("Coudn't get entry info for the bitcode in an apk"); 594ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao } 595ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao } else { 596ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao LOGI("Couldn't open the archive and read the bitcode"); 597ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao } 598ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao 599ce8a079bd4d296f9f1a24d7a5808d57f71dfc2e4Shih-wei Liao ss->runCompiler(rsc, s.get(), modWhen, crc32, resName, cacheDir); 60001b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines ss->clear(rsc); 60101b7d2995f9cbd33a9ccdf861fe959743a4b9954Stephen Hines return s.get(); 602326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 603326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 604326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 605326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 606