| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2009 The Android Open Source Project | 
 | 3 |  * | 
 | 4 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 |  * you may not use this file except in compliance with the License. | 
 | 6 |  * You may obtain a copy of the License at | 
 | 7 |  * | 
 | 8 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 |  * | 
 | 10 |  * Unless required by applicable law or agreed to in writing, software | 
 | 11 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 |  * See the License for the specific language governing permissions and | 
 | 14 |  * limitations under the License. | 
 | 15 |  */ | 
 | 16 |  | 
 | 17 | #include "rsContext.h" | 
 | 18 | #include "rsScriptC.h" | 
 | 19 | #include "rsMatrix.h" | 
 | 20 |  | 
| Jack Palevich | 1ef8b80 | 2009-05-28 15:53:04 -0700 | [diff] [blame] | 21 | #include "acc/acc.h" | 
| Joe Onorato | 9c4e4ca | 2009-08-09 11:39:02 -0700 | [diff] [blame] | 22 | #include "utils/Timers.h" | 
| Jack Palevich | 1ef8b80 | 2009-05-28 15:53:04 -0700 | [diff] [blame] | 23 |  | 
| Jason Sams | 1aa5a4e | 2009-06-22 17:15:15 -0700 | [diff] [blame] | 24 | #include <GLES/gl.h> | 
 | 25 | #include <GLES/glext.h> | 
 | 26 |  | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 27 | using namespace android; | 
 | 28 | using namespace android::renderscript; | 
 | 29 |  | 
| Jason Sams | e576910 | 2009-06-19 16:03:18 -0700 | [diff] [blame] | 30 | #define GET_TLS()  Context::ScriptTLSStruct * tls = \ | 
 | 31 |     (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \ | 
 | 32 |     Context * rsc = tls->mContext; \ | 
 | 33 |     ScriptC * sc = (ScriptC *) tls->mScript | 
 | 34 |  | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 35 |  | 
| Jason Sams | e514b45 | 2009-09-25 14:51:22 -0700 | [diff] [blame] | 36 | ScriptC::ScriptC(Context *rsc) : Script(rsc) | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 37 | { | 
| Jason Sams | f2649a9 | 2009-09-25 16:37:33 -0700 | [diff] [blame] | 38 |     mAllocFile = __FILE__; | 
 | 39 |     mAllocLine = __LINE__; | 
| Jack Palevich | 1ef8b80 | 2009-05-28 15:53:04 -0700 | [diff] [blame] | 40 |     mAccScript = NULL; | 
| Jason Sams | efb8de1 | 2009-06-08 15:20:31 -0700 | [diff] [blame] | 41 |     memset(&mProgram, 0, sizeof(mProgram)); | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 42 | } | 
 | 43 |  | 
 | 44 | ScriptC::~ScriptC() | 
 | 45 | { | 
| Jack Palevich | 1ef8b80 | 2009-05-28 15:53:04 -0700 | [diff] [blame] | 46 |     if (mAccScript) { | 
 | 47 |         accDeleteScript(mAccScript); | 
 | 48 |     } | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 49 | } | 
 | 50 |  | 
| Jason Sams | ada7f27 | 2009-09-24 14:55:38 -0700 | [diff] [blame] | 51 | void ScriptC::setupScript() | 
 | 52 | { | 
 | 53 |     for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) { | 
 | 54 |         if (mProgram.mSlotPointers[ct]) { | 
 | 55 |             *mProgram.mSlotPointers[ct] = mSlots[ct]->getPtr(); | 
 | 56 |         } | 
 | 57 |     } | 
 | 58 | } | 
 | 59 |  | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 60 |  | 
| Jason Sams | e576910 | 2009-06-19 16:03:18 -0700 | [diff] [blame] | 61 | bool ScriptC::run(Context *rsc, uint32_t launchIndex) | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 62 | { | 
| Jason Sams | d34b725 | 2009-08-04 16:58:20 -0700 | [diff] [blame] | 63 |     Context::ScriptTLSStruct * tls = | 
| Jason Sams | e576910 | 2009-06-19 16:03:18 -0700 | [diff] [blame] | 64 |     (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); | 
| Jason Sams | 9e4e13d | 2009-10-06 17:16:55 -0700 | [diff] [blame] | 65 |     rsAssert(tls); | 
| Jason Sams | a0a1b6f | 2009-06-10 15:04:38 -0700 | [diff] [blame] | 66 |  | 
 | 67 |     if (mEnviroment.mFragmentStore.get()) { | 
 | 68 |         rsc->setFragmentStore(mEnviroment.mFragmentStore.get()); | 
 | 69 |     } | 
 | 70 |     if (mEnviroment.mFragment.get()) { | 
 | 71 |         rsc->setFragment(mEnviroment.mFragment.get()); | 
 | 72 |     } | 
| Jason Sams | 8ce125b | 2009-06-17 16:52:59 -0700 | [diff] [blame] | 73 |     if (mEnviroment.mVertex.get()) { | 
 | 74 |         rsc->setVertex(mEnviroment.mVertex.get()); | 
 | 75 |     } | 
| Jason Sams | b681c8a | 2009-09-28 18:12:56 -0700 | [diff] [blame] | 76 |     if (mEnviroment.mRaster.get()) { | 
 | 77 |         rsc->setRaster(mEnviroment.mRaster.get()); | 
 | 78 |     } | 
| Jason Sams | a0a1b6f | 2009-06-10 15:04:38 -0700 | [diff] [blame] | 79 |  | 
| Joe Onorato | 9c4e4ca | 2009-08-09 11:39:02 -0700 | [diff] [blame] | 80 |     if (launchIndex == 0) { | 
 | 81 |         mEnviroment.mStartTimeMillis | 
 | 82 |                 = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC)); | 
 | 83 |     } | 
| Jason Sams | ada7f27 | 2009-09-24 14:55:38 -0700 | [diff] [blame] | 84 |     setupScript(); | 
| Jason Sams | 1d54f10 | 2009-09-03 15:43:13 -0700 | [diff] [blame] | 85 |  | 
| Jason Sams | e45ac6e | 2009-07-20 14:31:06 -0700 | [diff] [blame] | 86 |     bool ret = false; | 
| Jason Sams | e576910 | 2009-06-19 16:03:18 -0700 | [diff] [blame] | 87 |     tls->mScript = this; | 
| Jason Sams | e45ac6e | 2009-07-20 14:31:06 -0700 | [diff] [blame] | 88 |     ret = mProgram.mScript(launchIndex) != 0; | 
| Jason Sams | e576910 | 2009-06-19 16:03:18 -0700 | [diff] [blame] | 89 |     tls->mScript = NULL; | 
| Jason Sams | e45ac6e | 2009-07-20 14:31:06 -0700 | [diff] [blame] | 90 |     return ret; | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 91 | } | 
 | 92 |  | 
 | 93 | ScriptCState::ScriptCState() | 
 | 94 | { | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 95 |     mScript = NULL; | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 96 |     clear(); | 
 | 97 | } | 
 | 98 |  | 
 | 99 | ScriptCState::~ScriptCState() | 
 | 100 | { | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 101 |     delete mScript; | 
 | 102 |     mScript = NULL; | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 103 | } | 
 | 104 |  | 
 | 105 | void ScriptCState::clear() | 
 | 106 | { | 
| Jason Sams | 8b2c065 | 2009-08-12 17:54:11 -0700 | [diff] [blame] | 107 |     for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) { | 
 | 108 |         mConstantBufferTypes[ct].clear(); | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 109 |         mSlotNames[ct].setTo(""); | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 110 |         mInvokableNames[ct].setTo(""); | 
| Jason Sams | 90b36a8 | 2009-08-17 13:56:09 -0700 | [diff] [blame] | 111 |         mSlotWritable[ct] = false; | 
| Jason Sams | 8b2c065 | 2009-08-12 17:54:11 -0700 | [diff] [blame] | 112 |     } | 
| Jason Sams | efb8de1 | 2009-06-08 15:20:31 -0700 | [diff] [blame] | 113 |  | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 114 |     delete mScript; | 
| Jason Sams | e514b45 | 2009-09-25 14:51:22 -0700 | [diff] [blame] | 115 |     mScript = new ScriptC(NULL); | 
| Jason Sams | efb8de1 | 2009-06-08 15:20:31 -0700 | [diff] [blame] | 116 |  | 
| Joe Onorato | 57b79ce | 2009-08-09 22:57:44 -0700 | [diff] [blame] | 117 |     mInt32Defines.clear(); | 
 | 118 |     mFloatDefines.clear(); | 
| Jason Sams | 1f52633 | 2009-06-05 17:35:09 -0700 | [diff] [blame] | 119 | } | 
 | 120 |  | 
| Jason Sams | d34b725 | 2009-08-04 16:58:20 -0700 | [diff] [blame] | 121 | static ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name) | 
| Jason Sams | 29df66f | 2009-07-16 15:08:06 -0700 | [diff] [blame] | 122 | { | 
 | 123 |     const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name); | 
| Jason Sams | 29df66f | 2009-07-16 15:08:06 -0700 | [diff] [blame] | 124 |     if (sym) { | 
 | 125 |         return sym->mPtr; | 
 | 126 |     } | 
| Jason Sams | 29df66f | 2009-07-16 15:08:06 -0700 | [diff] [blame] | 127 |     LOGE("ScriptC sym lookup failed for %s", name); | 
| Jason Sams | 29df66f | 2009-07-16 15:08:06 -0700 | [diff] [blame] | 128 |     return NULL; | 
 | 129 | } | 
| Jason Sams | a4a54e4 | 2009-06-10 18:39:40 -0700 | [diff] [blame] | 130 |  | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 131 | void ScriptCState::runCompiler(Context *rsc, ScriptC *s) | 
| Jason Sams | 1f52633 | 2009-06-05 17:35:09 -0700 | [diff] [blame] | 132 | { | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 133 |     s->mAccScript = accCreateScript(); | 
| Jason Sams | a4a54e4 | 2009-06-10 18:39:40 -0700 | [diff] [blame] | 134 |     String8 tmp; | 
| Jason Sams | 1f52633 | 2009-06-05 17:35:09 -0700 | [diff] [blame] | 135 |  | 
| Jason Sams | a4a54e4 | 2009-06-10 18:39:40 -0700 | [diff] [blame] | 136 |     rsc->appendNameDefines(&tmp); | 
| Jason Sams | f168504 | 2009-07-16 17:47:40 -0700 | [diff] [blame] | 137 |     appendDecls(&tmp); | 
| Joe Onorato | 57b79ce | 2009-08-09 22:57:44 -0700 | [diff] [blame] | 138 |     rsc->appendVarDefines(&tmp); | 
| Jason Sams | 1fddd90 | 2009-09-25 15:25:00 -0700 | [diff] [blame] | 139 |     appendVarDefines(rsc, &tmp); | 
 | 140 |     appendTypes(rsc, &tmp); | 
| Jason Sams | b5909ce | 2009-07-21 12:20:54 -0700 | [diff] [blame] | 141 |     tmp.append("#line 1\n"); | 
| Jason Sams | a4a54e4 | 2009-06-10 18:39:40 -0700 | [diff] [blame] | 142 |  | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 143 |     const char* scriptSource[] = {tmp.string(), s->mEnviroment.mScriptText}; | 
 | 144 |     int scriptLength[] = {tmp.length(), s->mEnviroment.mScriptTextLength} ; | 
 | 145 |     accScriptSource(s->mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength); | 
 | 146 |     accRegisterSymbolCallback(s->mAccScript, symbolLookup, NULL); | 
 | 147 |     accCompileScript(s->mAccScript); | 
 | 148 |     accGetScriptLabel(s->mAccScript, "main", (ACCvoid**) &s->mProgram.mScript); | 
 | 149 |     accGetScriptLabel(s->mAccScript, "init", (ACCvoid**) &s->mProgram.mInit); | 
 | 150 |     rsAssert(s->mProgram.mScript); | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 151 |  | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 152 |     if (!s->mProgram.mScript) { | 
| Jason Sams | f168504 | 2009-07-16 17:47:40 -0700 | [diff] [blame] | 153 |         ACCchar buf[4096]; | 
 | 154 |         ACCsizei len; | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 155 |         accGetScriptInfoLog(s->mAccScript, sizeof(buf), &len, buf); | 
| Jason Sams | a891933 | 2009-09-24 15:42:52 -0700 | [diff] [blame] | 156 |         LOGV(buf); | 
| Jason Sams | f168504 | 2009-07-16 17:47:40 -0700 | [diff] [blame] | 157 |     } | 
 | 158 |  | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 159 |     if (s->mProgram.mInit) { | 
 | 160 |         s->mProgram.mInit(); | 
| Jason Sams | 1d54f10 | 2009-09-03 15:43:13 -0700 | [diff] [blame] | 161 |     } | 
 | 162 |  | 
 | 163 |     for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) { | 
 | 164 |         if (mSlotNames[ct].length() > 0) { | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 165 |             accGetScriptLabel(s->mAccScript, | 
| Jason Sams | 1d54f10 | 2009-09-03 15:43:13 -0700 | [diff] [blame] | 166 |                               mSlotNames[ct].string(), | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 167 |                               (ACCvoid**) &s->mProgram.mSlotPointers[ct]); | 
| Jason Sams | 1d54f10 | 2009-09-03 15:43:13 -0700 | [diff] [blame] | 168 |         } | 
 | 169 |     } | 
 | 170 |  | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 171 |     for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) { | 
 | 172 |         if (mInvokableNames[ct].length() > 0) { | 
 | 173 |             accGetScriptLabel(s->mAccScript, | 
 | 174 |                               mInvokableNames[ct].string(), | 
 | 175 |                               (ACCvoid**) &s->mEnviroment.mInvokables[ct]); | 
 | 176 |         } | 
 | 177 |     } | 
| Jason Sams | a4a54e4 | 2009-06-10 18:39:40 -0700 | [diff] [blame] | 178 |  | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 179 |     s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment()); | 
 | 180 |     s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex()); | 
 | 181 |     s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore()); | 
| Jason Sams | b681c8a | 2009-09-28 18:12:56 -0700 | [diff] [blame] | 182 |     s->mEnviroment.mRaster.set(rsc->getDefaultProgramRaster()); | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 183 |  | 
 | 184 |     if (s->mProgram.mScript) { | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 185 |         const static int pragmaMax = 16; | 
 | 186 |         ACCsizei pragmaCount; | 
 | 187 |         ACCchar * str[pragmaMax]; | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 188 |         accGetPragmas(s->mAccScript, &pragmaCount, pragmaMax, &str[0]); | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 189 |  | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 190 |         for (int ct=0; ct < pragmaCount; ct+=2) { | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 191 |             if (!strcmp(str[ct], "version")) { | 
 | 192 |                 continue; | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 193 |             } | 
 | 194 |  | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 195 |             if (!strcmp(str[ct], "stateVertex")) { | 
| Jason Sams | 8ce125b | 2009-06-17 16:52:59 -0700 | [diff] [blame] | 196 |                 if (!strcmp(str[ct+1], "default")) { | 
 | 197 |                     continue; | 
 | 198 |                 } | 
 | 199 |                 if (!strcmp(str[ct+1], "parent")) { | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 200 |                     s->mEnviroment.mVertex.clear(); | 
| Jason Sams | 8ce125b | 2009-06-17 16:52:59 -0700 | [diff] [blame] | 201 |                     continue; | 
 | 202 |                 } | 
 | 203 |                 ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]); | 
 | 204 |                 if (pv != NULL) { | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 205 |                     s->mEnviroment.mVertex.set(pv); | 
| Jason Sams | 8ce125b | 2009-06-17 16:52:59 -0700 | [diff] [blame] | 206 |                     continue; | 
 | 207 |                 } | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 208 |                 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]); | 
 | 209 |             } | 
 | 210 |  | 
 | 211 |             if (!strcmp(str[ct], "stateRaster")) { | 
| Jason Sams | b681c8a | 2009-09-28 18:12:56 -0700 | [diff] [blame] | 212 |                 if (!strcmp(str[ct+1], "default")) { | 
 | 213 |                     continue; | 
 | 214 |                 } | 
 | 215 |                 if (!strcmp(str[ct+1], "parent")) { | 
 | 216 |                     s->mEnviroment.mRaster.clear(); | 
 | 217 |                     continue; | 
 | 218 |                 } | 
 | 219 |                 ProgramRaster * pr = (ProgramRaster *)rsc->lookupName(str[ct+1]); | 
 | 220 |                 if (pr != NULL) { | 
 | 221 |                     s->mEnviroment.mRaster.set(pr); | 
 | 222 |                     continue; | 
 | 223 |                 } | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 224 |                 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]); | 
 | 225 |             } | 
 | 226 |  | 
 | 227 |             if (!strcmp(str[ct], "stateFragment")) { | 
| Jason Sams | 8ce125b | 2009-06-17 16:52:59 -0700 | [diff] [blame] | 228 |                 if (!strcmp(str[ct+1], "default")) { | 
 | 229 |                     continue; | 
 | 230 |                 } | 
 | 231 |                 if (!strcmp(str[ct+1], "parent")) { | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 232 |                     s->mEnviroment.mFragment.clear(); | 
| Jason Sams | 8ce125b | 2009-06-17 16:52:59 -0700 | [diff] [blame] | 233 |                     continue; | 
 | 234 |                 } | 
 | 235 |                 ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]); | 
| Jason Sams | a0a1b6f | 2009-06-10 15:04:38 -0700 | [diff] [blame] | 236 |                 if (pf != NULL) { | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 237 |                     s->mEnviroment.mFragment.set(pf); | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 238 |                     continue; | 
 | 239 |                 } | 
 | 240 |                 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]); | 
 | 241 |             } | 
 | 242 |  | 
| Jason Sams | b681c8a | 2009-09-28 18:12:56 -0700 | [diff] [blame] | 243 |             if (!strcmp(str[ct], "stateStore")) { | 
| Jason Sams | 8ce125b | 2009-06-17 16:52:59 -0700 | [diff] [blame] | 244 |                 if (!strcmp(str[ct+1], "default")) { | 
 | 245 |                     continue; | 
 | 246 |                 } | 
 | 247 |                 if (!strcmp(str[ct+1], "parent")) { | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 248 |                     s->mEnviroment.mFragmentStore.clear(); | 
| Jason Sams | 8ce125b | 2009-06-17 16:52:59 -0700 | [diff] [blame] | 249 |                     continue; | 
 | 250 |                 } | 
| Jason Sams | d34b725 | 2009-08-04 16:58:20 -0700 | [diff] [blame] | 251 |                 ProgramFragmentStore * pfs = | 
| Jason Sams | a0a1b6f | 2009-06-10 15:04:38 -0700 | [diff] [blame] | 252 |                     (ProgramFragmentStore *)rsc->lookupName(str[ct+1]); | 
 | 253 |                 if (pfs != NULL) { | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 254 |                     s->mEnviroment.mFragmentStore.set(pfs); | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 255 |                     continue; | 
 | 256 |                 } | 
| Jason Sams | b681c8a | 2009-09-28 18:12:56 -0700 | [diff] [blame] | 257 |                 LOGE("Unreconized value %s passed to stateStore", str[ct+1]); | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 258 |             } | 
 | 259 |  | 
 | 260 |         } | 
 | 261 |  | 
| Jason Sams | d34b725 | 2009-08-04 16:58:20 -0700 | [diff] [blame] | 262 |  | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 263 |     } else { | 
 | 264 |         // Deal with an error. | 
 | 265 |     } | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 266 | } | 
 | 267 |  | 
| Jason Sams | 1d54f10 | 2009-09-03 15:43:13 -0700 | [diff] [blame] | 268 | static void appendElementBody(String8 *s, const Element *e) | 
 | 269 | { | 
 | 270 |     s->append(" {\n"); | 
 | 271 |     for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) { | 
 | 272 |         const Component *c = e->getComponent(ct2); | 
 | 273 |         s->append("    "); | 
 | 274 |         s->append(c->getCType()); | 
 | 275 |         s->append(" "); | 
 | 276 |         s->append(c->getComponentName()); | 
 | 277 |         s->append(";\n"); | 
 | 278 |     } | 
 | 279 |     s->append("}"); | 
 | 280 | } | 
| Joe Onorato | 57b79ce | 2009-08-09 22:57:44 -0700 | [diff] [blame] | 281 |  | 
| Jason Sams | 1fddd90 | 2009-09-25 15:25:00 -0700 | [diff] [blame] | 282 | void ScriptCState::appendVarDefines(const Context *rsc, String8 *str) | 
| Joe Onorato | 57b79ce | 2009-08-09 22:57:44 -0700 | [diff] [blame] | 283 | { | 
 | 284 |     char buf[256]; | 
| Jason Sams | 1fddd90 | 2009-09-25 15:25:00 -0700 | [diff] [blame] | 285 |     if (rsc->props.mLogScripts) { | 
 | 286 |         LOGD("appendVarDefines mInt32Defines.size()=%d mFloatDefines.size()=%d\n", | 
 | 287 |                 mInt32Defines.size(), mFloatDefines.size()); | 
 | 288 |     } | 
| Joe Onorato | 57b79ce | 2009-08-09 22:57:44 -0700 | [diff] [blame] | 289 |     for (size_t ct=0; ct < mInt32Defines.size(); ct++) { | 
 | 290 |         str->append("#define "); | 
 | 291 |         str->append(mInt32Defines.keyAt(ct)); | 
 | 292 |         str->append(" "); | 
 | 293 |         sprintf(buf, "%i\n", (int)mInt32Defines.valueAt(ct)); | 
 | 294 |         str->append(buf); | 
 | 295 |     } | 
 | 296 |     for (size_t ct=0; ct < mFloatDefines.size(); ct++) { | 
 | 297 |         str->append("#define "); | 
 | 298 |         str->append(mFloatDefines.keyAt(ct)); | 
 | 299 |         str->append(" "); | 
 | 300 |         sprintf(buf, "%ff\n", mFloatDefines.valueAt(ct)); | 
 | 301 |         str->append(buf); | 
 | 302 |     } | 
 | 303 | } | 
 | 304 |  | 
| Jason Sams | 1d54f10 | 2009-09-03 15:43:13 -0700 | [diff] [blame] | 305 |  | 
 | 306 |  | 
| Jason Sams | 1fddd90 | 2009-09-25 15:25:00 -0700 | [diff] [blame] | 307 | void ScriptCState::appendTypes(const Context *rsc, String8 *str) | 
| Jason Sams | 8b2c065 | 2009-08-12 17:54:11 -0700 | [diff] [blame] | 308 | { | 
 | 309 |     char buf[256]; | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 310 |     String8 tmp; | 
| Jason Sams | 8b2c065 | 2009-08-12 17:54:11 -0700 | [diff] [blame] | 311 |  | 
| Jason Sams | a57c0a7 | 2009-09-04 14:42:41 -0700 | [diff] [blame] | 312 |     str->append("struct vec2_s {float x; float y;};"); | 
 | 313 |     str->append("struct vec3_s {float x; float y; float z;};"); | 
 | 314 |     str->append("struct vec4_s {float x; float y; float z; float w;};"); | 
 | 315 |  | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 316 |     for (size_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) { | 
| Jason Sams | 8b2c065 | 2009-08-12 17:54:11 -0700 | [diff] [blame] | 317 |         const Type *t = mConstantBufferTypes[ct].get(); | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 318 |         if (!t) { | 
| Jason Sams | 8b2c065 | 2009-08-12 17:54:11 -0700 | [diff] [blame] | 319 |             continue; | 
 | 320 |         } | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 321 |         const Element *e = t->getElement(); | 
| Jason Sams | 1d54f10 | 2009-09-03 15:43:13 -0700 | [diff] [blame] | 322 |         if (e->getName() && (e->getComponentCount() > 1)) { | 
 | 323 |             String8 s("struct struct_"); | 
 | 324 |             s.append(e->getName()); | 
 | 325 |             appendElementBody(&s, e); | 
 | 326 |             s.append(";\n"); | 
 | 327 |             s.append("#define "); | 
 | 328 |             s.append(e->getName()); | 
 | 329 |             s.append("_t struct struct_"); | 
 | 330 |             s.append(e->getName()); | 
 | 331 |             s.append("\n\n"); | 
| Jason Sams | 1fddd90 | 2009-09-25 15:25:00 -0700 | [diff] [blame] | 332 |             if (rsc->props.mLogScripts) { | 
 | 333 |                 LOGV(s); | 
 | 334 |             } | 
| Jason Sams | 1d54f10 | 2009-09-03 15:43:13 -0700 | [diff] [blame] | 335 |             str->append(s); | 
 | 336 |         } | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 337 |  | 
 | 338 |         if (t->getName()) { | 
 | 339 |             for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) { | 
 | 340 |                 const Component *c = e->getComponent(ct2); | 
 | 341 |                 tmp.setTo("#define OFFSETOF_"); | 
 | 342 |                 tmp.append(t->getName()); | 
 | 343 |                 tmp.append("_"); | 
 | 344 |                 tmp.append(c->getComponentName()); | 
 | 345 |                 sprintf(buf, " %i\n", ct2); | 
 | 346 |                 tmp.append(buf); | 
| Jason Sams | 1fddd90 | 2009-09-25 15:25:00 -0700 | [diff] [blame] | 347 |                 if (rsc->props.mLogScripts) { | 
 | 348 |                     LOGV(tmp); | 
 | 349 |                 } | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 350 |                 str->append(tmp); | 
 | 351 |             } | 
| Jason Sams | 8b2c065 | 2009-08-12 17:54:11 -0700 | [diff] [blame] | 352 |         } | 
 | 353 |  | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 354 |         if (mSlotNames[ct].length() > 0) { | 
| Jason Sams | 1d54f10 | 2009-09-03 15:43:13 -0700 | [diff] [blame] | 355 |             String8 s; | 
 | 356 |             if (e->getComponentCount() > 1) { | 
 | 357 |                 if (e->getName()) { | 
 | 358 |                     // Use the named struct | 
 | 359 |                     s.setTo(e->getName()); | 
 | 360 |                     s.append("_t *"); | 
 | 361 |                 } else { | 
 | 362 |                     // create an struct named from the slot. | 
 | 363 |                     s.setTo("struct "); | 
 | 364 |                     s.append(mSlotNames[ct]); | 
 | 365 |                     s.append("_s"); | 
 | 366 |                     appendElementBody(&s, e); | 
 | 367 |                     s.append(";\n"); | 
 | 368 |                     s.append("struct "); | 
 | 369 |                     s.append(mSlotNames[ct]); | 
 | 370 |                     s.append("_s * "); | 
 | 371 |                 } | 
 | 372 |             } else { | 
 | 373 |                 // Just make an array | 
 | 374 |                 s.setTo(e->getComponent(0)->getCType()); | 
 | 375 |                 s.append("_t *"); | 
 | 376 |             } | 
 | 377 |             s.append(mSlotNames[ct]); | 
 | 378 |             s.append(";\n"); | 
| Jason Sams | 1fddd90 | 2009-09-25 15:25:00 -0700 | [diff] [blame] | 379 |             if (rsc->props.mLogScripts) { | 
 | 380 |                 LOGV(s); | 
 | 381 |             } | 
| Jason Sams | 1d54f10 | 2009-09-03 15:43:13 -0700 | [diff] [blame] | 382 |             str->append(s); | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 383 |         } | 
| Jason Sams | 8b2c065 | 2009-08-12 17:54:11 -0700 | [diff] [blame] | 384 |     } | 
| Jason Sams | 8b2c065 | 2009-08-12 17:54:11 -0700 | [diff] [blame] | 385 | } | 
 | 386 |  | 
| Joe Onorato | 57b79ce | 2009-08-09 22:57:44 -0700 | [diff] [blame] | 387 |  | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 388 | namespace android { | 
 | 389 | namespace renderscript { | 
 | 390 |  | 
 | 391 | void rsi_ScriptCBegin(Context * rsc) | 
 | 392 | { | 
 | 393 |     ScriptCState *ss = &rsc->mScriptC; | 
 | 394 |     ss->clear(); | 
 | 395 | } | 
 | 396 |  | 
| Jason Sams | efb8de1 | 2009-06-08 15:20:31 -0700 | [diff] [blame] | 397 | void rsi_ScriptCSetScript(Context * rsc, void *vp) | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 398 | { | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 399 |     rsAssert(0); | 
 | 400 |     //ScriptCState *ss = &rsc->mScriptC; | 
 | 401 |     //ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp); | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 402 | } | 
 | 403 |  | 
| Jason Sams | 1f52633 | 2009-06-05 17:35:09 -0700 | [diff] [blame] | 404 | void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) | 
 | 405 | { | 
 | 406 |     ScriptCState *ss = &rsc->mScriptC; | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 407 |     ss->mScript->mEnviroment.mScriptText = text; | 
 | 408 |     ss->mScript->mEnviroment.mScriptTextLength = len; | 
| Jason Sams | 1f52633 | 2009-06-05 17:35:09 -0700 | [diff] [blame] | 409 | } | 
 | 410 |  | 
 | 411 |  | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 412 | RsScript rsi_ScriptCCreate(Context * rsc) | 
 | 413 | { | 
 | 414 |     ScriptCState *ss = &rsc->mScriptC; | 
 | 415 |  | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 416 |     ScriptC *s = ss->mScript; | 
 | 417 |     ss->mScript = NULL; | 
| Jason Sams | 1f52633 | 2009-06-05 17:35:09 -0700 | [diff] [blame] | 418 |  | 
| Jason Sams | 8c6bc69 | 2009-09-16 15:04:38 -0700 | [diff] [blame] | 419 |     ss->runCompiler(rsc, s); | 
| Jason Sams | 9397e30 | 2009-08-27 20:23:34 -0700 | [diff] [blame] | 420 |     s->incUserRef(); | 
| Jason Sams | e514b45 | 2009-09-25 14:51:22 -0700 | [diff] [blame] | 421 |     s->setContext(rsc); | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 422 |     for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) { | 
 | 423 |         s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get()); | 
 | 424 |         s->mSlotNames[ct] = ss->mSlotNames[ct]; | 
| Jason Sams | 90b36a8 | 2009-08-17 13:56:09 -0700 | [diff] [blame] | 425 |         s->mSlotWritable[ct] = ss->mSlotWritable[ct]; | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 426 |     } | 
| Jason Sams | 1030893 | 2009-06-09 12:15:30 -0700 | [diff] [blame] | 427 |  | 
| Jason Sams | fa51719 | 2009-08-13 12:59:04 -0700 | [diff] [blame] | 428 |     ss->clear(); | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 429 |     return s; | 
 | 430 | } | 
 | 431 |  | 
| Joe Onorato | 57b79ce | 2009-08-09 22:57:44 -0700 | [diff] [blame] | 432 | void rsi_ScriptCSetDefineF(Context *rsc, const char* name, float value) | 
 | 433 | { | 
 | 434 |     ScriptCState *ss = &rsc->mScriptC; | 
 | 435 |     ss->mFloatDefines.add(String8(name), value); | 
 | 436 | } | 
 | 437 |  | 
 | 438 | void rsi_ScriptCSetDefineI32(Context *rsc, const char* name, int32_t value) | 
 | 439 | { | 
 | 440 |     ScriptCState *ss = &rsc->mScriptC; | 
 | 441 |     ss->mInt32Defines.add(String8(name), value); | 
 | 442 | } | 
 | 443 |  | 
| Jason Sams | 326e0dd | 2009-05-22 14:03:28 -0700 | [diff] [blame] | 444 | } | 
 | 445 | } | 
 | 446 |  | 
 | 447 |  |