rsScriptC.cpp revision be36bf3a76481737a7fa606a04144ceef80eb4f2
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 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 752dca84dd6c07992f78ad050177975f16486dd77eJason Samsuint32_t ScriptC::run(Context *rsc, uint32_t launchIndex) 76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 77be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if (mProgram.mRoot == NULL) { 78a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams rsc->setError(RS_ERROR_BAD_SCRIPT, "Attempted to run bad script"); 79a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams return 0; 80a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams } 81a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams 82d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams Context::ScriptTLSStruct * tls = 83e57691037aea219562ac686429b4b98202aab7bcJason Sams (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); 849e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams rsAssert(tls); 85a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams 86a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams if (mEnviroment.mFragmentStore.get()) { 87a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams rsc->setFragmentStore(mEnviroment.mFragmentStore.get()); 88a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams } 89a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams if (mEnviroment.mFragment.get()) { 90a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams rsc->setFragment(mEnviroment.mFragment.get()); 91a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams } 928ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (mEnviroment.mVertex.get()) { 938ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams rsc->setVertex(mEnviroment.mVertex.get()); 948ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 95b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (mEnviroment.mRaster.get()) { 96b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams rsc->setRaster(mEnviroment.mRaster.get()); 97b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams } 98a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams 999c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato if (launchIndex == 0) { 1009c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato mEnviroment.mStartTimeMillis 1019c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC)); 1029c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato } 103ada7f272890d8791bc518c95989ad7d13050834dJason Sams setupScript(); 1041d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams 1052dca84dd6c07992f78ad050177975f16486dd77eJason Sams uint32_t ret = 0; 106e57691037aea219562ac686429b4b98202aab7bcJason Sams tls->mScript = this; 107be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("ScriptC::run %p", mProgram.mRoot); 108be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams ret = mProgram.mRoot(); 109e57691037aea219562ac686429b4b98202aab7bcJason Sams tls->mScript = NULL; 110be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("ScriptC::run ret %i", ret); 111e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams return ret; 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 114326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState() 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 1168c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams mScript = NULL; 117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 120326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState() 121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 1228c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams delete mScript; 1238c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams mScript = NULL; 124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 126326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear() 127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 1288b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) { 1298b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams mConstantBufferTypes[ct].clear(); 13090b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams mSlotWritable[ct] = false; 1318b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams } 132efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams 1338c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams delete mScript; 134e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mScript = new ScriptC(NULL); 1351f52633fefd1862451e6a30209d590680d02beecJason Sams} 1361f52633fefd1862451e6a30209d590680d02beecJason Sams 137be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsstatic BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name) 13829df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams{ 13929df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name); 14029df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams if (sym) { 14129df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams return sym->mPtr; 14229df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams } 14329df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams LOGE("ScriptC sym lookup failed for %s", name); 14429df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams return NULL; 14529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams} 146a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 1478c6bc6930d4996b897de8e5113da4a4efae2310cJason Samsvoid ScriptCState::runCompiler(Context *rsc, ScriptC *s) 1481f52633fefd1862451e6a30209d590680d02beecJason Sams{ 149be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("ScriptCState::runCompiler "); 150be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 151be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mBccScript = bccCreateScript(); 152be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccScriptBitcode(s->mBccScript, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength); 153be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccRegisterSymbolCallback(s->mBccScript, symbolLookup, NULL); 154be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("ScriptCState::runCompiler 3"); 155be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccCompileScript(s->mBccScript); 156be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("ScriptCState::runCompiler 4"); 157be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetScriptLabel(s->mBccScript, "root", (BCCvoid**) &s->mProgram.mRoot); 158be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetScriptLabel(s->mBccScript, "init", (BCCvoid**) &s->mProgram.mInit); 159be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("root %p, init %p", s->mProgram.mRoot, s->mProgram.mInit); 160f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams 1618c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams if (s->mProgram.mInit) { 1628c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mProgram.mInit(); 1631d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams } 1641d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams 165be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mInvokeFunctions = (Script::InvokeFunc_t *)calloc(100, sizeof(void *)); 166be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams BCCchar **labels = new char*[100]; 167be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetFunctions(s->mBccScript, (BCCsizei *)&s->mEnviroment.mInvokeFunctionCount, 168be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 100, (BCCchar **)labels); 169be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("func count %i", s->mEnviroment.mInvokeFunctionCount); 170be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams for (uint32_t i=0; i < s->mEnviroment.mInvokeFunctionCount; i++) { 171be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams BCCsizei length; 172be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetFunctionBinary(s->mBccScript, labels[i], (BCCvoid **)&(s->mEnviroment.mInvokeFunctions[i]), &length); 173be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("func %i %p", i, s->mEnviroment.mInvokeFunctions[i]); 1748c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams } 1758c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams 176be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mFieldAddress = (void **)calloc(100, sizeof(void *)); 177be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetExportVars(s->mBccScript, (BCCsizei *)&s->mEnviroment.mFieldCount, 178be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 100, s->mEnviroment.mFieldAddress); 179be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("var count %i", s->mEnviroment.mFieldCount); 180be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams for (uint32_t i=0; i < s->mEnviroment.mFieldCount; i++) { 181be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("var %i %p", i, s->mEnviroment.mFieldAddress[i]); 1821d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams } 1831d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams 1848c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment()); 1858c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex()); 1868c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore()); 187b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams s->mEnviroment.mRaster.set(rsc->getDefaultProgramRaster()); 188a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 189be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if (s->mProgram.mRoot) { 1901030893d9b99b72468034da13df025bda479bb97Jason Sams const static int pragmaMax = 16; 191be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams BCCsizei pragmaCount; 192be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams BCCchar * str[pragmaMax]; 193be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams bccGetPragmas(s->mBccScript, &pragmaCount, pragmaMax, &str[0]); 1941030893d9b99b72468034da13df025bda479bb97Jason Sams 1951030893d9b99b72468034da13df025bda479bb97Jason Sams for (int ct=0; ct < pragmaCount; ct+=2) { 1961030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "version")) { 1971030893d9b99b72468034da13df025bda479bb97Jason Sams continue; 1981030893d9b99b72468034da13df025bda479bb97Jason Sams } 1991030893d9b99b72468034da13df025bda479bb97Jason Sams 2001030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateVertex")) { 2018ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 2028ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2038ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 2048ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 2058c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mVertex.clear(); 2068ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2078ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 2081030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateVertex", str[ct+1]); 2091030893d9b99b72468034da13df025bda479bb97Jason Sams } 2101030893d9b99b72468034da13df025bda479bb97Jason Sams 2111030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateRaster")) { 212b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (!strcmp(str[ct+1], "default")) { 213b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams continue; 214b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams } 215b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (!strcmp(str[ct+1], "parent")) { 216b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams s->mEnviroment.mRaster.clear(); 217b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams continue; 218b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams } 2191030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateRaster", str[ct+1]); 2201030893d9b99b72468034da13df025bda479bb97Jason Sams } 2211030893d9b99b72468034da13df025bda479bb97Jason Sams 2221030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateFragment")) { 2238ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 2248ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2258ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 2268ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 2278c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mFragment.clear(); 2288ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2298ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 2301030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateFragment", str[ct+1]); 2311030893d9b99b72468034da13df025bda479bb97Jason Sams } 2321030893d9b99b72468034da13df025bda479bb97Jason Sams 233b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams if (!strcmp(str[ct], "stateStore")) { 2348ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 2358ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2368ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 2378ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 2388c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams s->mEnviroment.mFragmentStore.clear(); 2398ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2408ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 241b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams LOGE("Unreconized value %s passed to stateStore", str[ct+1]); 2421030893d9b99b72468034da13df025bda479bb97Jason Sams } 2431030893d9b99b72468034da13df025bda479bb97Jason Sams 2441030893d9b99b72468034da13df025bda479bb97Jason Sams } 2451030893d9b99b72468034da13df025bda479bb97Jason Sams 246d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams 2471030893d9b99b72468034da13df025bda479bb97Jason Sams } else { 2481030893d9b99b72468034da13df025bda479bb97Jason Sams // Deal with an error. 2491030893d9b99b72468034da13df025bda479bb97Jason Sams } 25057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato} 2511030893d9b99b72468034da13df025bda479bb97Jason Sams 2528b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams 25357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato 254326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 255326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 256326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 257326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc) 258326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 259326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptCState *ss = &rsc->mScriptC; 260326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ss->clear(); 261326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 262326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 263efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp) 264326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 2658c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams rsAssert(0); 2668c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams //ScriptCState *ss = &rsc->mScriptC; 2678c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams //ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp); 268326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 269326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 2701f52633fefd1862451e6a30209d590680d02beecJason Samsvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) 2711f52633fefd1862451e6a30209d590680d02beecJason Sams{ 2721f52633fefd1862451e6a30209d590680d02beecJason Sams ScriptCState *ss = &rsc->mScriptC; 273e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams 274e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams char *t = (char *)malloc(len + 1); 275e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams memcpy(t, text, len); 276e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams t[len] = 0; 277e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams ss->mScript->mEnviroment.mScriptText = t; 2788c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams ss->mScript->mEnviroment.mScriptTextLength = len; 2791f52633fefd1862451e6a30209d590680d02beecJason Sams} 2801f52633fefd1862451e6a30209d590680d02beecJason Sams 2811f52633fefd1862451e6a30209d590680d02beecJason Sams 282326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc) 283326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 284326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptCState *ss = &rsc->mScriptC; 285326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 2868c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams ScriptC *s = ss->mScript; 2878c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams ss->mScript = NULL; 2881f52633fefd1862451e6a30209d590680d02beecJason Sams 2898c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams ss->runCompiler(rsc, s); 2909397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams s->incUserRef(); 291e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams s->setContext(rsc); 292fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) { 293fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get()); 29490b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams s->mSlotWritable[ct] = ss->mSlotWritable[ct]; 295fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams } 2961030893d9b99b72468034da13df025bda479bb97Jason Sams 297fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams ss->clear(); 298326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return s; 299326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 30157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onoratovoid rsi_ScriptCSetDefineF(Context *rsc, const char* name, float value) 30257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{ 303be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("Error rsi_ScriptCSetDefineF"); 30457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato} 30557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato 30657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onoratovoid rsi_ScriptCSetDefineI32(Context *rsc, const char* name, int32_t value) 30757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{ 308be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("Error rsi_ScriptCSetDefineI"); 30957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato} 31057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato 311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 315