rsScriptC.cpp revision ce92d4baf7a5bce097228fdd4498601764cd4014
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" 20be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams#include "../../../external/llvm/libbcc/include/bcc/bcc.h" 219c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato#include "utils/Timers.h" 221ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich 231aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/gl.h> 241aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/glext.h> 251aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 29e57691037aea219562ac686429b4b98202aab7bcJason Sams#define GET_TLS() Context::ScriptTLSStruct * tls = \ 30e57691037aea219562ac686429b4b98202aab7bcJason Sams (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \ 31e57691037aea219562ac686429b4b98202aab7bcJason Sams Context * rsc = tls->mContext; \ 32e57691037aea219562ac686429b4b98202aab7bcJason Sams ScriptC * sc = (ScriptC *) tls->mScript 33e57691037aea219562ac686429b4b98202aab7bcJason Sams 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 35e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsScriptC::ScriptC(Context *rsc) : Script(rsc) 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 37f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocFile = __FILE__; 38f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocLine = __LINE__; 39be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams mBccScript = NULL; 40efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams memset(&mProgram, 0, sizeof(mProgram)); 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 43326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptC::~ScriptC() 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 45be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if (mBccScript) { 46be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccDeleteScript(mBccScript); 471ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich } 48e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams free(mEnviroment.mScriptText); 49e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams mEnviroment.mScriptText = NULL; 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 52ada7f272890d8791bc518c95989ad7d13050834dJason Samsvoid ScriptC::setupScript() 53ada7f272890d8791bc518c95989ad7d13050834dJason Sams{ 54be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams for (uint32_t ct=0; ct < mEnviroment.mFieldCount; ct++) { 55be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if (!mSlots[ct].get()) 56be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams continue; 57be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams void *ptr = mSlots[ct]->getPtr(); 58be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams void **dest = ((void ***)mEnviroment.mFieldAddress)[ct]; 59be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("setupScript %i %p = %p %p %i", ct, dest, ptr, mSlots[ct]->getType(), mSlots[ct]->getType()->getDimX()); 60be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 61be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //const uint32_t *p32 = (const uint32_t *)ptr; 62be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //for (uint32_t ct2=0; ct2 < mSlots[ct]->getType()->getDimX(); ct2++) { 63be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE(" %i = 0x%08x ", ct2, p32[ct2]); 64be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //} 65be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 66be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if (dest) { 67be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams *dest = ptr; 68be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams } else { 69be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("ScriptC::setupScript, NULL var binding address."); 70ada7f272890d8791bc518c95989ad7d13050834dJason Sams } 71ada7f272890d8791bc518c95989ad7d13050834dJason Sams } 72ada7f272890d8791bc518c95989ad7d13050834dJason Sams} 73ada7f272890d8791bc518c95989ad7d13050834dJason Sams 74ce92d4baf7a5bce097228fdd4498601764cd4014Jason Samsconst Allocation *ScriptC::ptrToAllocation(const void *ptr) const 75ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams{ 76ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams if (!ptr) { 77ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams return NULL; 78ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams } 79ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams for (uint32_t ct=0; ct < mEnviroment.mFieldCount; ct++) { 80ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams if (!mSlots[ct].get()) 81ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams continue; 82ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams if (mSlots[ct]->getPtr() == ptr) { 83ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams return mSlots[ct].get(); 84ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams } 85ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams } 86ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams LOGE("ScriptC::ptrToAllocation, failed to find %p", ptr); 87ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams return NULL; 88ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams} 89ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 912dca84dd6c07992f78ad050177975f16486dd77eJason Samsuint32_t ScriptC::run(Context *rsc, uint32_t launchIndex) 92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 93be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if (mProgram.mRoot == NULL) { 94a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams rsc->setError(RS_ERROR_BAD_SCRIPT, "Attempted to run bad script"); 95a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams return 0; 96a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams } 97a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams 98d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams Context::ScriptTLSStruct * tls = 99e57691037aea219562ac686429b4b98202aab7bcJason Sams (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); 1009e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams rsAssert(tls); 101a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams 102a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams if (mEnviroment.mFragmentStore.get()) { 103a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams rsc->setFragmentStore(mEnviroment.mFragmentStore.get()); 104a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams } 105a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams if (mEnviroment.mFragment.get()) { 106a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams rsc->setFragment(mEnviroment.mFragment.get()); 107a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams } 1088ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (mEnviroment.mVertex.get()) { 1098ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams rsc->setVertex(mEnviroment.mVertex.get()); 1108ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 111b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (mEnviroment.mRaster.get()) { 112b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams rsc->setRaster(mEnviroment.mRaster.get()); 113b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams } 114a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams 1159c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato if (launchIndex == 0) { 1169c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato mEnviroment.mStartTimeMillis 1179c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC)); 1189c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato } 119ada7f272890d8791bc518c95989ad7d13050834dJason Sams setupScript(); 1201d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams 1212dca84dd6c07992f78ad050177975f16486dd77eJason Sams uint32_t ret = 0; 122e57691037aea219562ac686429b4b98202aab7bcJason Sams tls->mScript = this; 123be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("ScriptC::run %p", mProgram.mRoot); 124be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams ret = mProgram.mRoot(); 125e57691037aea219562ac686429b4b98202aab7bcJason Sams tls->mScript = NULL; 126be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("ScriptC::run ret %i", ret); 127e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams return ret; 128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 130326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState() 131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 1328c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams mScript = NULL; 133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 136326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState() 137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 1388c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams delete mScript; 1398c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams mScript = NULL; 140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 142326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear() 143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 1448b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) { 1458b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams mConstantBufferTypes[ct].clear(); 14690b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams mSlotWritable[ct] = false; 1478b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams } 148efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams 1498c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams delete mScript; 150e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mScript = new ScriptC(NULL); 1511f52633fefd1862451e6a30209d590680d02beecJason Sams} 1521f52633fefd1862451e6a30209d590680d02beecJason Sams 153be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsstatic BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name) 15429df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams{ 15529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name); 15629df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams if (sym) { 15729df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams return sym->mPtr; 15829df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams } 15929df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams LOGE("ScriptC sym lookup failed for %s", name); 16029df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams return NULL; 16129df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams} 162a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 1638c6bc6930d4996b897de8e5113da4a4efae2310cJason Samsvoid ScriptCState::runCompiler(Context *rsc, ScriptC *s) 1641f52633fefd1862451e6a30209d590680d02beecJason Sams{ 165be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("ScriptCState::runCompiler "); 166be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 167be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mBccScript = bccCreateScript(); 168be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccScriptBitcode(s->mBccScript, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength); 169be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccRegisterSymbolCallback(s->mBccScript, symbolLookup, NULL); 170be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("ScriptCState::runCompiler 3"); 171be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccCompileScript(s->mBccScript); 172be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("ScriptCState::runCompiler 4"); 173be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetScriptLabel(s->mBccScript, "root", (BCCvoid**) &s->mProgram.mRoot); 174be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetScriptLabel(s->mBccScript, "init", (BCCvoid**) &s->mProgram.mInit); 175be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("root %p, init %p", s->mProgram.mRoot, s->mProgram.mInit); 176f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams 1778c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams if (s->mProgram.mInit) { 1788c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mProgram.mInit(); 1791d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams } 1801d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams 181be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mInvokeFunctions = (Script::InvokeFunc_t *)calloc(100, sizeof(void *)); 182be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams BCCchar **labels = new char*[100]; 183be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetFunctions(s->mBccScript, (BCCsizei *)&s->mEnviroment.mInvokeFunctionCount, 184be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 100, (BCCchar **)labels); 185be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("func count %i", s->mEnviroment.mInvokeFunctionCount); 186be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams for (uint32_t i=0; i < s->mEnviroment.mInvokeFunctionCount; i++) { 187be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams BCCsizei length; 188be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetFunctionBinary(s->mBccScript, labels[i], (BCCvoid **)&(s->mEnviroment.mInvokeFunctions[i]), &length); 189be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("func %i %p", i, s->mEnviroment.mInvokeFunctions[i]); 1908c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams } 1918c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams 192be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mFieldAddress = (void **)calloc(100, sizeof(void *)); 193be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetExportVars(s->mBccScript, (BCCsizei *)&s->mEnviroment.mFieldCount, 194be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 100, s->mEnviroment.mFieldAddress); 195be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("var count %i", s->mEnviroment.mFieldCount); 196be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams for (uint32_t i=0; i < s->mEnviroment.mFieldCount; i++) { 197be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("var %i %p", i, s->mEnviroment.mFieldAddress[i]); 1981d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams } 1991d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams 2008c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment()); 2018c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex()); 202ccc010bb7c0f89e162bf60033968a20be90a903aJason Sams s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramStore()); 203b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams s->mEnviroment.mRaster.set(rsc->getDefaultProgramRaster()); 204a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 205be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if (s->mProgram.mRoot) { 2061030893d9b99b72468034da13df025bda479bb97Jason Sams const static int pragmaMax = 16; 207be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams BCCsizei pragmaCount; 208be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams BCCchar * str[pragmaMax]; 209be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetPragmas(s->mBccScript, &pragmaCount, pragmaMax, &str[0]); 2101030893d9b99b72468034da13df025bda479bb97Jason Sams 2111030893d9b99b72468034da13df025bda479bb97Jason Sams for (int ct=0; ct < pragmaCount; ct+=2) { 2121030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "version")) { 2131030893d9b99b72468034da13df025bda479bb97Jason Sams continue; 2141030893d9b99b72468034da13df025bda479bb97Jason Sams } 2151030893d9b99b72468034da13df025bda479bb97Jason Sams 2161030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateVertex")) { 2178ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 2188ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2198ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 2208ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 2218c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mVertex.clear(); 2228ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2238ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 2241030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateVertex", str[ct+1]); 2251030893d9b99b72468034da13df025bda479bb97Jason Sams } 2261030893d9b99b72468034da13df025bda479bb97Jason Sams 2271030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateRaster")) { 228b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (!strcmp(str[ct+1], "default")) { 229b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams continue; 230b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams } 231b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (!strcmp(str[ct+1], "parent")) { 232b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams s->mEnviroment.mRaster.clear(); 233b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams continue; 234b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams } 2351030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateRaster", str[ct+1]); 2361030893d9b99b72468034da13df025bda479bb97Jason Sams } 2371030893d9b99b72468034da13df025bda479bb97Jason Sams 2381030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateFragment")) { 2398ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 2408ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2418ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 2428ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 2438c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mFragment.clear(); 2448ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2458ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 2461030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateFragment", str[ct+1]); 2471030893d9b99b72468034da13df025bda479bb97Jason Sams } 2481030893d9b99b72468034da13df025bda479bb97Jason Sams 249b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (!strcmp(str[ct], "stateStore")) { 2508ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 2518ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2528ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 2538ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 2548c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mFragmentStore.clear(); 2558ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2568ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 257b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams LOGE("Unreconized value %s passed to stateStore", str[ct+1]); 2581030893d9b99b72468034da13df025bda479bb97Jason Sams } 2591030893d9b99b72468034da13df025bda479bb97Jason Sams 2601030893d9b99b72468034da13df025bda479bb97Jason Sams } 2611030893d9b99b72468034da13df025bda479bb97Jason Sams 262d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams 2631030893d9b99b72468034da13df025bda479bb97Jason Sams } else { 2641030893d9b99b72468034da13df025bda479bb97Jason Sams // Deal with an error. 2651030893d9b99b72468034da13df025bda479bb97Jason Sams } 26657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato} 2671030893d9b99b72468034da13df025bda479bb97Jason Sams 2688b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams 26957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato 270326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 271326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 272326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 273326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc) 274326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 275326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptCState *ss = &rsc->mScriptC; 276326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ss->clear(); 277326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 278326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 279efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp) 280326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 2818c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams rsAssert(0); 2828c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams //ScriptCState *ss = &rsc->mScriptC; 2838c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams //ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp); 284326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 285326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 2861f52633fefd1862451e6a30209d590680d02beecJason Samsvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) 2871f52633fefd1862451e6a30209d590680d02beecJason Sams{ 2881f52633fefd1862451e6a30209d590680d02beecJason Sams ScriptCState *ss = &rsc->mScriptC; 289e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams 290e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams char *t = (char *)malloc(len + 1); 291e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams memcpy(t, text, len); 292e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams t[len] = 0; 293e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams ss->mScript->mEnviroment.mScriptText = t; 2948c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams ss->mScript->mEnviroment.mScriptTextLength = len; 2951f52633fefd1862451e6a30209d590680d02beecJason Sams} 2961f52633fefd1862451e6a30209d590680d02beecJason Sams 2971f52633fefd1862451e6a30209d590680d02beecJason Sams 298326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc) 299326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptCState *ss = &rsc->mScriptC; 301326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 3028c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams ScriptC *s = ss->mScript; 3038c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams ss->mScript = NULL; 3041f52633fefd1862451e6a30209d590680d02beecJason Sams 3058c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams ss->runCompiler(rsc, s); 3069397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams s->incUserRef(); 307e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams s->setContext(rsc); 308fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) { 309fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get()); 31090b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams s->mSlotWritable[ct] = ss->mSlotWritable[ct]; 311fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams } 3121030893d9b99b72468034da13df025bda479bb97Jason Sams 313fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams ss->clear(); 314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return s; 315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 321