rsScriptC.cpp revision b681c8af69ef6938c80dd5cc5fc920db94ee9f43
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
36e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsScriptC::ScriptC(Context *rsc) : Script(rsc)
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
38f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
39f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
401ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    mAccScript = NULL;
41efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    memset(&mProgram, 0, sizeof(mProgram));
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
44326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptC::~ScriptC()
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
461ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    if (mAccScript) {
471ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich        accDeleteScript(mAccScript);
481ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    }
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
51ada7f272890d8791bc518c95989ad7d13050834dJason Samsvoid ScriptC::setupScript()
52ada7f272890d8791bc518c95989ad7d13050834dJason Sams{
53ada7f272890d8791bc518c95989ad7d13050834dJason Sams    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
54ada7f272890d8791bc518c95989ad7d13050834dJason Sams        if (mProgram.mSlotPointers[ct]) {
55ada7f272890d8791bc518c95989ad7d13050834dJason Sams            *mProgram.mSlotPointers[ct] = mSlots[ct]->getPtr();
56ada7f272890d8791bc518c95989ad7d13050834dJason Sams        }
57ada7f272890d8791bc518c95989ad7d13050834dJason Sams    }
58ada7f272890d8791bc518c95989ad7d13050834dJason Sams}
59ada7f272890d8791bc518c95989ad7d13050834dJason Sams
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
61e57691037aea219562ac686429b4b98202aab7bcJason Samsbool ScriptC::run(Context *rsc, uint32_t launchIndex)
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
63d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    Context::ScriptTLSStruct * tls =
64e57691037aea219562ac686429b4b98202aab7bcJason Sams    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
65a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
66a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragmentStore.get()) {
67a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
68a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
69a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragment.get()) {
70a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragment(mEnviroment.mFragment.get());
71a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
728ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    if (mEnviroment.mVertex.get()) {
738ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams        rsc->setVertex(mEnviroment.mVertex.get());
748ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    }
75b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    if (mEnviroment.mRaster.get()) {
76b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams        rsc->setRaster(mEnviroment.mRaster.get());
77b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    }
78a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
799c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    if (launchIndex == 0) {
809c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato        mEnviroment.mStartTimeMillis
819c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato                = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
829c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    }
83ada7f272890d8791bc518c95989ad7d13050834dJason Sams    setupScript();
841d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
85e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    bool ret = false;
86e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = this;
87e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    ret = mProgram.mScript(launchIndex) != 0;
88e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = NULL;
89e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    return ret;
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
92326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState()
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
948c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    mScript = NULL;
95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
98326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState()
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1008c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    delete mScript;
1018c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    mScript = NULL;
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear()
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1068b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
1078b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams        mConstantBufferTypes[ct].clear();
108fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        mSlotNames[ct].setTo("");
1098c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        mInvokableNames[ct].setTo("");
11090b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams        mSlotWritable[ct] = false;
1118b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    }
112efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
1138c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    delete mScript;
114e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mScript = new ScriptC(NULL);
115efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
11657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    mInt32Defines.clear();
11757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    mFloatDefines.clear();
1181f52633fefd1862451e6a30209d590680d02beecJason Sams}
1191f52633fefd1862451e6a30209d590680d02beecJason Sams
120d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsstatic ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name)
12129df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams{
12229df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
12329df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    if (sym) {
12429df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams        return sym->mPtr;
12529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    }
12629df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    LOGE("ScriptC sym lookup failed for %s", name);
12729df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    return NULL;
12829df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams}
129a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
1308c6bc6930d4996b897de8e5113da4a4efae2310cJason Samsvoid ScriptCState::runCompiler(Context *rsc, ScriptC *s)
1311f52633fefd1862451e6a30209d590680d02beecJason Sams{
1328c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mAccScript = accCreateScript();
133a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    String8 tmp;
134a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
135a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    rsc->appendNameDefines(&tmp);
136f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams    appendDecls(&tmp);
13757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    rsc->appendVarDefines(&tmp);
1381fddd90849deaae89b546ff492c345d485bbce42Jason Sams    appendVarDefines(rsc, &tmp);
1391fddd90849deaae89b546ff492c345d485bbce42Jason Sams    appendTypes(rsc, &tmp);
140b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    tmp.append("#line 1\n");
1411f52633fefd1862451e6a30209d590680d02beecJason Sams
1428c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    const char* scriptSource[] = {tmp.string(), s->mEnviroment.mScriptText};
1438c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    int scriptLength[] = {tmp.length(), s->mEnviroment.mScriptTextLength} ;
1448c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    accScriptSource(s->mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
1458c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    accRegisterSymbolCallback(s->mAccScript, symbolLookup, NULL);
1468c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    accCompileScript(s->mAccScript);
1478c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    accGetScriptLabel(s->mAccScript, "main", (ACCvoid**) &s->mProgram.mScript);
1488c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    accGetScriptLabel(s->mAccScript, "init", (ACCvoid**) &s->mProgram.mInit);
1498c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    rsAssert(s->mProgram.mScript);
1501030893d9b99b72468034da13df025bda479bb97Jason Sams
1518c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    if (!s->mProgram.mScript) {
152f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        ACCchar buf[4096];
153f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        ACCsizei len;
1548c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        accGetScriptInfoLog(s->mAccScript, sizeof(buf), &len, buf);
155a891933b4c5ab1b63103add167269cfc404c2adfJason Sams        LOGV(buf);
156f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams    }
157f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams
1588c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    if (s->mProgram.mInit) {
1598c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        s->mProgram.mInit();
1601d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
1611d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
1621d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
1631d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        if (mSlotNames[ct].length() > 0) {
1648c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams            accGetScriptLabel(s->mAccScript,
1651d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                              mSlotNames[ct].string(),
1668c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                              (ACCvoid**) &s->mProgram.mSlotPointers[ct]);
1678c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        }
1688c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    }
1698c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
1708c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
1718c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        if (mInvokableNames[ct].length() > 0) {
1728c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams            accGetScriptLabel(s->mAccScript,
1738c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                              mInvokableNames[ct].string(),
1748c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                              (ACCvoid**) &s->mEnviroment.mInvokables[ct]);
1751d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        }
1761d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
1771d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
1788c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
1798c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
1808c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
181b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    s->mEnviroment.mRaster.set(rsc->getDefaultProgramRaster());
182a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
1838c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    if (s->mProgram.mScript) {
1841030893d9b99b72468034da13df025bda479bb97Jason Sams        const static int pragmaMax = 16;
1851030893d9b99b72468034da13df025bda479bb97Jason Sams        ACCsizei pragmaCount;
1861030893d9b99b72468034da13df025bda479bb97Jason Sams        ACCchar * str[pragmaMax];
1878c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        accGetPragmas(s->mAccScript, &pragmaCount, pragmaMax, &str[0]);
1881030893d9b99b72468034da13df025bda479bb97Jason Sams
1891030893d9b99b72468034da13df025bda479bb97Jason Sams        for (int ct=0; ct < pragmaCount; ct+=2) {
1901030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "version")) {
1911030893d9b99b72468034da13df025bda479bb97Jason Sams                continue;
1921030893d9b99b72468034da13df025bda479bb97Jason Sams            }
1931030893d9b99b72468034da13df025bda479bb97Jason Sams
1941030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateVertex")) {
1958ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
1968ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1978ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1988ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
1998c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mVertex.clear();
2008ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2018ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2028ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
2038ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (pv != NULL) {
2048c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mVertex.set(pv);
2058ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2068ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2071030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
2081030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2091030893d9b99b72468034da13df025bda479bb97Jason Sams
2101030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateRaster")) {
211b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                if (!strcmp(str[ct+1], "default")) {
212b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    continue;
213b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                }
214b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                if (!strcmp(str[ct+1], "parent")) {
215b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    s->mEnviroment.mRaster.clear();
216b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    continue;
217b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                }
218b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                ProgramRaster * pr = (ProgramRaster *)rsc->lookupName(str[ct+1]);
219b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                if (pr != NULL) {
220b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    s->mEnviroment.mRaster.set(pr);
221b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    continue;
222b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                }
2231030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
2241030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2251030893d9b99b72468034da13df025bda479bb97Jason Sams
2261030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragment")) {
2278ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
2288ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2298ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2308ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
2318c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragment.clear();
2328ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2338ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2348ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
235a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                if (pf != NULL) {
2368c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragment.set(pf);
2371030893d9b99b72468034da13df025bda479bb97Jason Sams                    continue;
2381030893d9b99b72468034da13df025bda479bb97Jason Sams                }
2391030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
2401030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2411030893d9b99b72468034da13df025bda479bb97Jason Sams
242b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams            if (!strcmp(str[ct], "stateStore")) {
2438ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
2448ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2458ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2468ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
2478c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragmentStore.clear();
2488ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2498ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
250d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams                ProgramFragmentStore * pfs =
251a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                    (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
252a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                if (pfs != NULL) {
2538c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragmentStore.set(pfs);
2541030893d9b99b72468034da13df025bda479bb97Jason Sams                    continue;
2551030893d9b99b72468034da13df025bda479bb97Jason Sams                }
256b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                LOGE("Unreconized value %s passed to stateStore", str[ct+1]);
2571030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2581030893d9b99b72468034da13df025bda479bb97Jason Sams
2591030893d9b99b72468034da13df025bda479bb97Jason Sams        }
2601030893d9b99b72468034da13df025bda479bb97Jason Sams
261d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams
2621030893d9b99b72468034da13df025bda479bb97Jason Sams    } else {
2631030893d9b99b72468034da13df025bda479bb97Jason Sams        // Deal with an error.
2641030893d9b99b72468034da13df025bda479bb97Jason Sams    }
26557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato}
2661030893d9b99b72468034da13df025bda479bb97Jason Sams
2671d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Samsstatic void appendElementBody(String8 *s, const Element *e)
2681d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams{
2691d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    s->append(" {\n");
2701d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
2711d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        const Component *c = e->getComponent(ct2);
2721d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        s->append("    ");
2731d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        s->append(c->getCType());
2741d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        s->append(" ");
2751d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        s->append(c->getComponentName());
2761d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        s->append(";\n");
2771d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
2781d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    s->append("}");
2791d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams}
28057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
2811fddd90849deaae89b546ff492c345d485bbce42Jason Samsvoid ScriptCState::appendVarDefines(const Context *rsc, String8 *str)
28257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{
28357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    char buf[256];
2841fddd90849deaae89b546ff492c345d485bbce42Jason Sams    if (rsc->props.mLogScripts) {
2851fddd90849deaae89b546ff492c345d485bbce42Jason Sams        LOGD("appendVarDefines mInt32Defines.size()=%d mFloatDefines.size()=%d\n",
2861fddd90849deaae89b546ff492c345d485bbce42Jason Sams                mInt32Defines.size(), mFloatDefines.size());
2871fddd90849deaae89b546ff492c345d485bbce42Jason Sams    }
28857b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    for (size_t ct=0; ct < mInt32Defines.size(); ct++) {
28957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append("#define ");
29057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(mInt32Defines.keyAt(ct));
29157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(" ");
29257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        sprintf(buf, "%i\n", (int)mInt32Defines.valueAt(ct));
29357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(buf);
29457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    }
29557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    for (size_t ct=0; ct < mFloatDefines.size(); ct++) {
29657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append("#define ");
29757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(mFloatDefines.keyAt(ct));
29857b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(" ");
29957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        sprintf(buf, "%ff\n", mFloatDefines.valueAt(ct));
30057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(buf);
30157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    }
302326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3041d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
3051d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
3061fddd90849deaae89b546ff492c345d485bbce42Jason Samsvoid ScriptCState::appendTypes(const Context *rsc, String8 *str)
3078b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams{
3088b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    char buf[256];
309fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    String8 tmp;
3108b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams
311a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams    str->append("struct vec2_s {float x; float y;};");
312a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams    str->append("struct vec3_s {float x; float y; float z;};");
313a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams    str->append("struct vec4_s {float x; float y; float z; float w;};");
314a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
315fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    for (size_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
3168b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams        const Type *t = mConstantBufferTypes[ct].get();
317fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        if (!t) {
3188b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams            continue;
3198b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams        }
320fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        const Element *e = t->getElement();
3211d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        if (e->getName() && (e->getComponentCount() > 1)) {
3221d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            String8 s("struct struct_");
3231d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(e->getName());
3241d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            appendElementBody(&s, e);
3251d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(";\n");
3261d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append("#define ");
3271d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(e->getName());
3281d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append("_t struct struct_");
3291d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(e->getName());
3301d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append("\n\n");
3311fddd90849deaae89b546ff492c345d485bbce42Jason Sams            if (rsc->props.mLogScripts) {
3321fddd90849deaae89b546ff492c345d485bbce42Jason Sams                LOGV(s);
3331fddd90849deaae89b546ff492c345d485bbce42Jason Sams            }
3341d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            str->append(s);
3351d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        }
336fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams
337fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        if (t->getName()) {
338fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams            for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
339fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                const Component *c = e->getComponent(ct2);
340fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                tmp.setTo("#define OFFSETOF_");
341fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                tmp.append(t->getName());
342fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                tmp.append("_");
343fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                tmp.append(c->getComponentName());
344fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                sprintf(buf, " %i\n", ct2);
345fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                tmp.append(buf);
3461fddd90849deaae89b546ff492c345d485bbce42Jason Sams                if (rsc->props.mLogScripts) {
3471fddd90849deaae89b546ff492c345d485bbce42Jason Sams                    LOGV(tmp);
3481fddd90849deaae89b546ff492c345d485bbce42Jason Sams                }
349fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                str->append(tmp);
350fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams            }
3518b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams        }
3528b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams
353fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        if (mSlotNames[ct].length() > 0) {
3541d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            String8 s;
3551d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            if (e->getComponentCount() > 1) {
3561d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                if (e->getName()) {
3571d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    // Use the named struct
3581d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.setTo(e->getName());
3591d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append("_t *");
3601d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                } else {
3611d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    // create an struct named from the slot.
3621d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.setTo("struct ");
3631d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append(mSlotNames[ct]);
3641d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append("_s");
3651d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    appendElementBody(&s, e);
3661d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append(";\n");
3671d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append("struct ");
3681d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append(mSlotNames[ct]);
3691d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append("_s * ");
3701d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                }
3711d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            } else {
3721d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                // Just make an array
3731d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                s.setTo(e->getComponent(0)->getCType());
3741d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                s.append("_t *");
3751d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            }
3761d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(mSlotNames[ct]);
3771d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(";\n");
3781fddd90849deaae89b546ff492c345d485bbce42Jason Sams            if (rsc->props.mLogScripts) {
3791fddd90849deaae89b546ff492c345d485bbce42Jason Sams                LOGV(s);
3801fddd90849deaae89b546ff492c345d485bbce42Jason Sams            }
3811d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            str->append(s);
382fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        }
3838b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    }
3848b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams}
3858b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams
38657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
387326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
388326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
389326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
390326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc)
391326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
392326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
393326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->clear();
394326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
395326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
396efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp)
397326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
3988c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    rsAssert(0);
3998c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    //ScriptCState *ss = &rsc->mScriptC;
4008c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    //ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp);
401326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
402326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
4031f52633fefd1862451e6a30209d590680d02beecJason Samsvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
4041f52633fefd1862451e6a30209d590680d02beecJason Sams{
4051f52633fefd1862451e6a30209d590680d02beecJason Sams    ScriptCState *ss = &rsc->mScriptC;
4068c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript->mEnviroment.mScriptText = text;
4078c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript->mEnviroment.mScriptTextLength = len;
4081f52633fefd1862451e6a30209d590680d02beecJason Sams}
4091f52633fefd1862451e6a30209d590680d02beecJason Sams
4101f52633fefd1862451e6a30209d590680d02beecJason Sams
411326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc)
412326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
413326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
414326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
4158c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ScriptC *s = ss->mScript;
4168c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript = NULL;
4171f52633fefd1862451e6a30209d590680d02beecJason Sams
4188c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->runCompiler(rsc, s);
4199397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    s->incUserRef();
420e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    s->setContext(rsc);
421fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
422fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get());
423fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        s->mSlotNames[ct] = ss->mSlotNames[ct];
42490b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams        s->mSlotWritable[ct] = ss->mSlotWritable[ct];
425fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    }
4261030893d9b99b72468034da13df025bda479bb97Jason Sams
427fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    ss->clear();
428326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return s;
429326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
430326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
43157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onoratovoid rsi_ScriptCSetDefineF(Context *rsc, const char* name, float value)
43257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{
43357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    ScriptCState *ss = &rsc->mScriptC;
43457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    ss->mFloatDefines.add(String8(name), value);
43557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato}
43657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
43757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onoratovoid rsi_ScriptCSetDefineI32(Context *rsc, const char* name, int32_t value)
43857b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{
43957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    ScriptCState *ss = &rsc->mScriptC;
44057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    ss->mInt32Defines.add(String8(name), value);
44157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato}
44257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
443326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
444326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
445326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
446326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
447