rsScriptC.cpp revision 8b2c065dfc16c148e2829a19e83d2269b9bcd4cc
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" 20326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 211ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich#include "acc/acc.h" 229c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato#include "utils/Timers.h" 231ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich 241aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/gl.h> 251aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/glext.h> 261aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 30e57691037aea219562ac686429b4b98202aab7bcJason Sams#define GET_TLS() Context::ScriptTLSStruct * tls = \ 31e57691037aea219562ac686429b4b98202aab7bcJason Sams (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \ 32e57691037aea219562ac686429b4b98202aab7bcJason Sams Context * rsc = tls->mContext; \ 33e57691037aea219562ac686429b4b98202aab7bcJason Sams ScriptC * sc = (ScriptC *) tls->mScript 34e57691037aea219562ac686429b4b98202aab7bcJason Sams 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 36326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptC::ScriptC() 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 381ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich mAccScript = NULL; 39efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams memset(&mProgram, 0, sizeof(mProgram)); 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 42326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptC::~ScriptC() 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 441ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich if (mAccScript) { 451ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich accDeleteScript(mAccScript); 461ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich } 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 50e57691037aea219562ac686429b4b98202aab7bcJason Samsbool ScriptC::run(Context *rsc, uint32_t launchIndex) 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 52d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams Context::ScriptTLSStruct * tls = 53e57691037aea219562ac686429b4b98202aab7bcJason Sams (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); 54a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams 55a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams if (mEnviroment.mFragmentStore.get()) { 56a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams rsc->setFragmentStore(mEnviroment.mFragmentStore.get()); 57a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams } 58a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams if (mEnviroment.mFragment.get()) { 59a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams rsc->setFragment(mEnviroment.mFragment.get()); 60a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams } 618ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (mEnviroment.mVertex.get()) { 628ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams rsc->setVertex(mEnviroment.mVertex.get()); 638ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 64a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams 659c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato if (launchIndex == 0) { 669c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato mEnviroment.mStartTimeMillis 679c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC)); 689c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato } 699c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato 70e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams bool ret = false; 71e57691037aea219562ac686429b4b98202aab7bcJason Sams tls->mScript = this; 72e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams ret = mProgram.mScript(launchIndex) != 0; 73e57691037aea219562ac686429b4b98202aab7bcJason Sams tls->mScript = NULL; 74e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams return ret; 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 77326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState() 78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 82326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState() 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 841ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich if (mAccScript) { 851ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich accDeleteScript(mAccScript); 861ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich } 87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 89326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear() 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 91efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams memset(&mProgram, 0, sizeof(mProgram)); 92efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams 938b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams mConstantTypeCount = 0; 948b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) { 958b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams mConstantBufferTypes[ct].clear(); 968b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams } 97efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams 98efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams memset(&mEnviroment, 0, sizeof(mEnviroment)); 99efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams mEnviroment.mClearColor[0] = 0; 100efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams mEnviroment.mClearColor[1] = 0; 101efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams mEnviroment.mClearColor[2] = 0; 102efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams mEnviroment.mClearColor[3] = 1; 103efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams mEnviroment.mClearDepth = 1; 104efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams mEnviroment.mClearStencil = 0; 105efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams mEnviroment.mIsRoot = false; 106efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams 1071ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich mAccScript = NULL; 108efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams 10957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato mInt32Defines.clear(); 11057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato mFloatDefines.clear(); 1111f52633fefd1862451e6a30209d590680d02beecJason Sams} 1121f52633fefd1862451e6a30209d590680d02beecJason Sams 113d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsstatic ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name) 11429df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams{ 11529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name); 11629df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams if (sym) { 11729df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams return sym->mPtr; 11829df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams } 11929df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams LOGE("ScriptC sym lookup failed for %s", name); 12029df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams return NULL; 12129df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams} 122a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 123a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsvoid ScriptCState::runCompiler(Context *rsc) 1241f52633fefd1862451e6a30209d590680d02beecJason Sams{ 1251f52633fefd1862451e6a30209d590680d02beecJason Sams mAccScript = accCreateScript(); 126a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams String8 tmp; 127a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 128a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams rsc->appendNameDefines(&tmp); 129f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams appendDecls(&tmp); 13057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato rsc->appendVarDefines(&tmp); 13157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato appendVarDefines(&tmp); 1328b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams appendTypes(&tmp); 133b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams tmp.append("#line 1\n"); 1341f52633fefd1862451e6a30209d590680d02beecJason Sams 135a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams const char* scriptSource[] = {tmp.string(), mProgram.mScriptText}; 136a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ; 137a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength); 13829df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams accRegisterSymbolCallback(mAccScript, symbolLookup, NULL); 1391f52633fefd1862451e6a30209d590680d02beecJason Sams accCompileScript(mAccScript); 140efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript); 1411030893d9b99b72468034da13df025bda479bb97Jason Sams rsAssert(mProgram.mScript); 1421030893d9b99b72468034da13df025bda479bb97Jason Sams 143f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams if (!mProgram.mScript) { 144f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams ACCchar buf[4096]; 145f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams ACCsizei len; 146f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams accGetScriptInfoLog(mAccScript, sizeof(buf), &len, buf); 147f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams LOGE(buf); 148f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams } 149f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams 1508ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mEnviroment.mFragment.set(rsc->getDefaultProgramFragment()); 1518ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mEnviroment.mVertex.set(rsc->getDefaultProgramVertex()); 1528ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore()); 153a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 1541030893d9b99b72468034da13df025bda479bb97Jason Sams if (mProgram.mScript) { 1551030893d9b99b72468034da13df025bda479bb97Jason Sams const static int pragmaMax = 16; 1561030893d9b99b72468034da13df025bda479bb97Jason Sams ACCsizei pragmaCount; 1571030893d9b99b72468034da13df025bda479bb97Jason Sams ACCchar * str[pragmaMax]; 1581030893d9b99b72468034da13df025bda479bb97Jason Sams accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]); 1591030893d9b99b72468034da13df025bda479bb97Jason Sams 1601030893d9b99b72468034da13df025bda479bb97Jason Sams for (int ct=0; ct < pragmaCount; ct+=2) { 1611030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "version")) { 1621030893d9b99b72468034da13df025bda479bb97Jason Sams continue; 1631030893d9b99b72468034da13df025bda479bb97Jason Sams } 1641030893d9b99b72468034da13df025bda479bb97Jason Sams 1651030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateVertex")) { 1668ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 1678ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 1688ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 1698ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 1708ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mEnviroment.mVertex.clear(); 1718ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 1728ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 1738ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]); 1748ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (pv != NULL) { 1758ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mEnviroment.mVertex.set(pv); 1768ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 1778ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 1781030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateVertex", str[ct+1]); 1791030893d9b99b72468034da13df025bda479bb97Jason Sams } 1801030893d9b99b72468034da13df025bda479bb97Jason Sams 1811030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateRaster")) { 1821030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateRaster", str[ct+1]); 1831030893d9b99b72468034da13df025bda479bb97Jason Sams } 1841030893d9b99b72468034da13df025bda479bb97Jason Sams 1851030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateFragment")) { 1868ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 1878ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 1888ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 1898ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 1908ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mEnviroment.mFragment.clear(); 1918ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 1928ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 1938ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]); 194a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams if (pf != NULL) { 195a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams mEnviroment.mFragment.set(pf); 1961030893d9b99b72468034da13df025bda479bb97Jason Sams continue; 1971030893d9b99b72468034da13df025bda479bb97Jason Sams } 1981030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateFragment", str[ct+1]); 1991030893d9b99b72468034da13df025bda479bb97Jason Sams } 2001030893d9b99b72468034da13df025bda479bb97Jason Sams 2011030893d9b99b72468034da13df025bda479bb97Jason Sams if (!strcmp(str[ct], "stateFragmentStore")) { 2028ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "default")) { 2038ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2048ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 2058ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams if (!strcmp(str[ct+1], "parent")) { 2068ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mEnviroment.mFragmentStore.clear(); 2078ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams continue; 2088ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams } 209d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams ProgramFragmentStore * pfs = 210a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams (ProgramFragmentStore *)rsc->lookupName(str[ct+1]); 211a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams if (pfs != NULL) { 212a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams mEnviroment.mFragmentStore.set(pfs); 2131030893d9b99b72468034da13df025bda479bb97Jason Sams continue; 2141030893d9b99b72468034da13df025bda479bb97Jason Sams } 2151030893d9b99b72468034da13df025bda479bb97Jason Sams LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]); 2161030893d9b99b72468034da13df025bda479bb97Jason Sams } 2171030893d9b99b72468034da13df025bda479bb97Jason Sams 2181030893d9b99b72468034da13df025bda479bb97Jason Sams } 2191030893d9b99b72468034da13df025bda479bb97Jason Sams 220d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams 2211030893d9b99b72468034da13df025bda479bb97Jason Sams } else { 2221030893d9b99b72468034da13df025bda479bb97Jason Sams // Deal with an error. 2231030893d9b99b72468034da13df025bda479bb97Jason Sams } 22457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato} 2251030893d9b99b72468034da13df025bda479bb97Jason Sams 22657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato 22757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onoratovoid ScriptCState::appendVarDefines(String8 *str) 22857b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{ 22957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato char buf[256]; 23057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato LOGD("appendVarDefines mInt32Defines.size()=%d mFloatDefines.size()=%d\n", 23157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato mInt32Defines.size(), mFloatDefines.size()); 23257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato for (size_t ct=0; ct < mInt32Defines.size(); ct++) { 23357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato str->append("#define "); 23457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato str->append(mInt32Defines.keyAt(ct)); 23557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato str->append(" "); 23657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato sprintf(buf, "%i\n", (int)mInt32Defines.valueAt(ct)); 23757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato str->append(buf); 23857b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato } 23957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato for (size_t ct=0; ct < mFloatDefines.size(); ct++) { 24057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato str->append("#define "); 24157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato str->append(mFloatDefines.keyAt(ct)); 24257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato str->append(" "); 24357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato sprintf(buf, "%ff\n", mFloatDefines.valueAt(ct)); 24457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato str->append(buf); 24557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato } 246326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 247326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 2488b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Samsvoid ScriptCState::appendTypes(String8 *str) 2498b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams{ 2508b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams char buf[256]; 2518b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams 2528b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams for (size_t ct=0; ct < mConstantTypeCount; ct++) { 2538b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams const Type *t = mConstantBufferTypes[ct].get(); 2548b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams const Element *e = t->getElement(); 2558b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams 2568b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams if (!t->getName()) { 2578b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams continue; 2588b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams } 2598b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) { 2608b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams const Component *c = e->getComponent(ct2); 2618b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams str->append("#define OFFSETOF_"); 2628b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams str->append(t->getName()); 2638b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams str->append("_"); 2648b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams str->append(c->getComponentName()); 2658b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams sprintf(buf, " %i\n", ct2); 2668b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams str->append(buf); 2678b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams } 2688b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams 2698b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams } 2708b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams 2718b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams} 2728b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams 27357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato 274326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 275326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 276326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 277326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc) 278326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 279326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptCState *ss = &rsc->mScriptC; 280326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ss->clear(); 281326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 282326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 283326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCAddType(Context * rsc, RsType vt) 284326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 285326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptCState *ss = &rsc->mScriptC; 2868b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams const Type *t = static_cast<const Type *>(vt); 2878b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams 2888b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams ss->mConstantBufferTypes[ss->mConstantTypeCount].set(t); 2898b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams ss->mConstantTypeCount ++; 290326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 291326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 292efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp) 293326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 294326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptCState *ss = &rsc->mScriptC; 295e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp); 296326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 297326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 298326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetRoot(Context * rsc, bool isRoot) 299326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptCState *ss = &rsc->mScriptC; 301efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams ss->mEnviroment.mIsRoot = isRoot; 302326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 3041f52633fefd1862451e6a30209d590680d02beecJason Samsvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) 3051f52633fefd1862451e6a30209d590680d02beecJason Sams{ 3061f52633fefd1862451e6a30209d590680d02beecJason Sams ScriptCState *ss = &rsc->mScriptC; 307efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams ss->mProgram.mScriptText = text; 308efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams ss->mProgram.mScriptTextLength = len; 3091f52633fefd1862451e6a30209d590680d02beecJason Sams} 3101f52633fefd1862451e6a30209d590680d02beecJason Sams 3111f52633fefd1862451e6a30209d590680d02beecJason Sams 312326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc) 313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptCState *ss = &rsc->mScriptC; 315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 316a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams ss->runCompiler(rsc); 3171f52633fefd1862451e6a30209d590680d02beecJason Sams 318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ScriptC *s = new ScriptC(); 319efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams s->incRef(); 3201ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich s->mAccScript = ss->mAccScript; 3211ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich ss->mAccScript = NULL; 322efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams s->mEnviroment = ss->mEnviroment; 323efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams s->mProgram = ss->mProgram; 324efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams ss->clear(); 3251030893d9b99b72468034da13df025bda479bb97Jason Sams 326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return s; 327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 328326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 32957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onoratovoid rsi_ScriptCSetDefineF(Context *rsc, const char* name, float value) 33057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{ 33157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato ScriptCState *ss = &rsc->mScriptC; 33257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato ss->mFloatDefines.add(String8(name), value); 33357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato} 33457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato 33557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onoratovoid rsi_ScriptCSetDefineI32(Context *rsc, const char* name, int32_t value) 33657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{ 33757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato ScriptCState *ss = &rsc->mScriptC; 33857b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato ss->mInt32Defines.add(String8(name), value); 33957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato} 34057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato 341326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 342326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 345