rsScriptC.cpp revision f2649a961db2995e9e24a6c98f8a419f1496c1b7
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    }
75a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
769c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    if (launchIndex == 0) {
779c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato        mEnviroment.mStartTimeMillis
789c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato                = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
799c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    }
80ada7f272890d8791bc518c95989ad7d13050834dJason Sams    setupScript();
811d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
82e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    bool ret = false;
83e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = this;
84e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    ret = mProgram.mScript(launchIndex) != 0;
85e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = NULL;
86e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    return ret;
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
89326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState()
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
918c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    mScript = NULL;
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
95326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState()
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
978c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    delete mScript;
988c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    mScript = NULL;
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear()
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1038b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
1048b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams        mConstantBufferTypes[ct].clear();
105fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        mSlotNames[ct].setTo("");
1068c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        mInvokableNames[ct].setTo("");
10790b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams        mSlotWritable[ct] = false;
1088b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    }
109efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
1108c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    delete mScript;
111e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mScript = new ScriptC(NULL);
112efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
11357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    mInt32Defines.clear();
11457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    mFloatDefines.clear();
1151f52633fefd1862451e6a30209d590680d02beecJason Sams}
1161f52633fefd1862451e6a30209d590680d02beecJason Sams
117d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsstatic ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name)
11829df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams{
11929df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
12029df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    if (sym) {
12129df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams        return sym->mPtr;
12229df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    }
12329df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    LOGE("ScriptC sym lookup failed for %s", name);
12429df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    return NULL;
12529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams}
126a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
1278c6bc6930d4996b897de8e5113da4a4efae2310cJason Samsvoid ScriptCState::runCompiler(Context *rsc, ScriptC *s)
1281f52633fefd1862451e6a30209d590680d02beecJason Sams{
1298c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mAccScript = accCreateScript();
130a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    String8 tmp;
131a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
132a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    rsc->appendNameDefines(&tmp);
133f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams    appendDecls(&tmp);
13457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    rsc->appendVarDefines(&tmp);
1351fddd90849deaae89b546ff492c345d485bbce42Jason Sams    appendVarDefines(rsc, &tmp);
1361fddd90849deaae89b546ff492c345d485bbce42Jason Sams    appendTypes(rsc, &tmp);
137b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    tmp.append("#line 1\n");
1381f52633fefd1862451e6a30209d590680d02beecJason Sams
1398c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    const char* scriptSource[] = {tmp.string(), s->mEnviroment.mScriptText};
1408c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    int scriptLength[] = {tmp.length(), s->mEnviroment.mScriptTextLength} ;
1418c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    accScriptSource(s->mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
1428c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    accRegisterSymbolCallback(s->mAccScript, symbolLookup, NULL);
1438c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    accCompileScript(s->mAccScript);
1448c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    accGetScriptLabel(s->mAccScript, "main", (ACCvoid**) &s->mProgram.mScript);
1458c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    accGetScriptLabel(s->mAccScript, "init", (ACCvoid**) &s->mProgram.mInit);
1468c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    rsAssert(s->mProgram.mScript);
1471030893d9b99b72468034da13df025bda479bb97Jason Sams
1488c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    if (!s->mProgram.mScript) {
149f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        ACCchar buf[4096];
150f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        ACCsizei len;
1518c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        accGetScriptInfoLog(s->mAccScript, sizeof(buf), &len, buf);
152a891933b4c5ab1b63103add167269cfc404c2adfJason Sams        LOGV(buf);
153f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams    }
154f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams
1558c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    if (s->mProgram.mInit) {
1568c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        s->mProgram.mInit();
1571d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
1581d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
1591d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
1601d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        if (mSlotNames[ct].length() > 0) {
1618c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams            accGetScriptLabel(s->mAccScript,
1621d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                              mSlotNames[ct].string(),
1638c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                              (ACCvoid**) &s->mProgram.mSlotPointers[ct]);
1648c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        }
1658c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    }
1668c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
1678c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
1688c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        if (mInvokableNames[ct].length() > 0) {
1698c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams            accGetScriptLabel(s->mAccScript,
1708c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                              mInvokableNames[ct].string(),
1718c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                              (ACCvoid**) &s->mEnviroment.mInvokables[ct]);
1721d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        }
1731d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
1741d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
1758c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
1768c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
1778c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
178a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
1798c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    if (s->mProgram.mScript) {
1801030893d9b99b72468034da13df025bda479bb97Jason Sams        const static int pragmaMax = 16;
1811030893d9b99b72468034da13df025bda479bb97Jason Sams        ACCsizei pragmaCount;
1821030893d9b99b72468034da13df025bda479bb97Jason Sams        ACCchar * str[pragmaMax];
1838c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        accGetPragmas(s->mAccScript, &pragmaCount, pragmaMax, &str[0]);
1841030893d9b99b72468034da13df025bda479bb97Jason Sams
1851030893d9b99b72468034da13df025bda479bb97Jason Sams        for (int ct=0; ct < pragmaCount; ct+=2) {
1861030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "version")) {
1871030893d9b99b72468034da13df025bda479bb97Jason Sams                continue;
1881030893d9b99b72468034da13df025bda479bb97Jason Sams            }
1891030893d9b99b72468034da13df025bda479bb97Jason Sams
1901030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateVertex")) {
1918ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
1928ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1938ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1948ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
1958c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mVertex.clear();
1968ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1978ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1988ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
1998ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (pv != NULL) {
2008c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mVertex.set(pv);
2018ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2028ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2031030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
2041030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2051030893d9b99b72468034da13df025bda479bb97Jason Sams
2061030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateRaster")) {
2071030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
2081030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2091030893d9b99b72468034da13df025bda479bb97Jason Sams
2101030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragment")) {
2118ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
2128ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2138ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2148ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
2158c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragment.clear();
2168ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2178ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2188ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
219a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                if (pf != NULL) {
2208c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragment.set(pf);
2211030893d9b99b72468034da13df025bda479bb97Jason Sams                    continue;
2221030893d9b99b72468034da13df025bda479bb97Jason Sams                }
2231030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
2241030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2251030893d9b99b72468034da13df025bda479bb97Jason Sams
2261030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragmentStore")) {
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.mFragmentStore.clear();
2328ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2338ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
234d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams                ProgramFragmentStore * pfs =
235a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                    (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
236a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                if (pfs != NULL) {
2378c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragmentStore.set(pfs);
2381030893d9b99b72468034da13df025bda479bb97Jason Sams                    continue;
2391030893d9b99b72468034da13df025bda479bb97Jason Sams                }
2401030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
2411030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2421030893d9b99b72468034da13df025bda479bb97Jason Sams
2431030893d9b99b72468034da13df025bda479bb97Jason Sams        }
2441030893d9b99b72468034da13df025bda479bb97Jason Sams
245d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams
2461030893d9b99b72468034da13df025bda479bb97Jason Sams    } else {
2471030893d9b99b72468034da13df025bda479bb97Jason Sams        // Deal with an error.
2481030893d9b99b72468034da13df025bda479bb97Jason Sams    }
24957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato}
2501030893d9b99b72468034da13df025bda479bb97Jason Sams
2511d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Samsstatic void appendElementBody(String8 *s, const Element *e)
2521d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams{
2531d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    s->append(" {\n");
2541d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
2551d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        const Component *c = e->getComponent(ct2);
2561d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        s->append("    ");
2571d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        s->append(c->getCType());
2581d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        s->append(" ");
2591d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        s->append(c->getComponentName());
2601d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        s->append(";\n");
2611d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
2621d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    s->append("}");
2631d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams}
26457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
2651fddd90849deaae89b546ff492c345d485bbce42Jason Samsvoid ScriptCState::appendVarDefines(const Context *rsc, String8 *str)
26657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{
26757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    char buf[256];
2681fddd90849deaae89b546ff492c345d485bbce42Jason Sams    if (rsc->props.mLogScripts) {
2691fddd90849deaae89b546ff492c345d485bbce42Jason Sams        LOGD("appendVarDefines mInt32Defines.size()=%d mFloatDefines.size()=%d\n",
2701fddd90849deaae89b546ff492c345d485bbce42Jason Sams                mInt32Defines.size(), mFloatDefines.size());
2711fddd90849deaae89b546ff492c345d485bbce42Jason Sams    }
27257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    for (size_t ct=0; ct < mInt32Defines.size(); ct++) {
27357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append("#define ");
27457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(mInt32Defines.keyAt(ct));
27557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(" ");
27657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        sprintf(buf, "%i\n", (int)mInt32Defines.valueAt(ct));
27757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(buf);
27857b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    }
27957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    for (size_t ct=0; ct < mFloatDefines.size(); ct++) {
28057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append("#define ");
28157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(mFloatDefines.keyAt(ct));
28257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(" ");
28357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        sprintf(buf, "%ff\n", mFloatDefines.valueAt(ct));
28457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato        str->append(buf);
28557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    }
286326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
287326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2881d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
2891d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
2901fddd90849deaae89b546ff492c345d485bbce42Jason Samsvoid ScriptCState::appendTypes(const Context *rsc, String8 *str)
2918b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams{
2928b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    char buf[256];
293fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    String8 tmp;
2948b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams
295a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams    str->append("struct vec2_s {float x; float y;};");
296a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams    str->append("struct vec3_s {float x; float y; float z;};");
297a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams    str->append("struct vec4_s {float x; float y; float z; float w;};");
298a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
299fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    for (size_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
3008b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams        const Type *t = mConstantBufferTypes[ct].get();
301fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        if (!t) {
3028b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams            continue;
3038b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams        }
304fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        const Element *e = t->getElement();
3051d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        if (e->getName() && (e->getComponentCount() > 1)) {
3061d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            String8 s("struct struct_");
3071d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(e->getName());
3081d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            appendElementBody(&s, e);
3091d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(";\n");
3101d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append("#define ");
3111d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(e->getName());
3121d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append("_t struct struct_");
3131d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(e->getName());
3141d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append("\n\n");
3151fddd90849deaae89b546ff492c345d485bbce42Jason Sams            if (rsc->props.mLogScripts) {
3161fddd90849deaae89b546ff492c345d485bbce42Jason Sams                LOGV(s);
3171fddd90849deaae89b546ff492c345d485bbce42Jason Sams            }
3181d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            str->append(s);
3191d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams        }
320fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams
321fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        if (t->getName()) {
322fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams            for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
323fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                const Component *c = e->getComponent(ct2);
324fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                tmp.setTo("#define OFFSETOF_");
325fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                tmp.append(t->getName());
326fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                tmp.append("_");
327fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                tmp.append(c->getComponentName());
328fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                sprintf(buf, " %i\n", ct2);
329fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                tmp.append(buf);
3301fddd90849deaae89b546ff492c345d485bbce42Jason Sams                if (rsc->props.mLogScripts) {
3311fddd90849deaae89b546ff492c345d485bbce42Jason Sams                    LOGV(tmp);
3321fddd90849deaae89b546ff492c345d485bbce42Jason Sams                }
333fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams                str->append(tmp);
334fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams            }
3358b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams        }
3368b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams
337fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        if (mSlotNames[ct].length() > 0) {
3381d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            String8 s;
3391d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            if (e->getComponentCount() > 1) {
3401d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                if (e->getName()) {
3411d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    // Use the named struct
3421d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.setTo(e->getName());
3431d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append("_t *");
3441d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                } else {
3451d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    // create an struct named from the slot.
3461d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.setTo("struct ");
3471d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append(mSlotNames[ct]);
3481d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append("_s");
3491d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    appendElementBody(&s, e);
3501d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append(";\n");
3511d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append("struct ");
3521d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append(mSlotNames[ct]);
3531d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                    s.append("_s * ");
3541d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                }
3551d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            } else {
3561d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                // Just make an array
3571d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                s.setTo(e->getComponent(0)->getCType());
3581d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams                s.append("_t *");
3591d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            }
3601d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(mSlotNames[ct]);
3611d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            s.append(";\n");
3621fddd90849deaae89b546ff492c345d485bbce42Jason Sams            if (rsc->props.mLogScripts) {
3631fddd90849deaae89b546ff492c345d485bbce42Jason Sams                LOGV(s);
3641fddd90849deaae89b546ff492c345d485bbce42Jason Sams            }
3651d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams            str->append(s);
366fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        }
3678b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    }
3688b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams}
3698b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams
37057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
371326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
372326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
374326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc)
375326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->clear();
378326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
379326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
380efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp)
381326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
3828c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    rsAssert(0);
3838c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    //ScriptCState *ss = &rsc->mScriptC;
3848c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    //ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp);
385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3871f52633fefd1862451e6a30209d590680d02beecJason Samsvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
3881f52633fefd1862451e6a30209d590680d02beecJason Sams{
3891f52633fefd1862451e6a30209d590680d02beecJason Sams    ScriptCState *ss = &rsc->mScriptC;
3908c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript->mEnviroment.mScriptText = text;
3918c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript->mEnviroment.mScriptTextLength = len;
3921f52633fefd1862451e6a30209d590680d02beecJason Sams}
3931f52633fefd1862451e6a30209d590680d02beecJason Sams
3941f52633fefd1862451e6a30209d590680d02beecJason Sams
395326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc)
396326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
397326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
398326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3998c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ScriptC *s = ss->mScript;
4008c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript = NULL;
4011f52633fefd1862451e6a30209d590680d02beecJason Sams
4028c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->runCompiler(rsc, s);
4039397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    s->incUserRef();
404e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    s->setContext(rsc);
405fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
406fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get());
407fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        s->mSlotNames[ct] = ss->mSlotNames[ct];
40890b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams        s->mSlotWritable[ct] = ss->mSlotWritable[ct];
409fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    }
4101030893d9b99b72468034da13df025bda479bb97Jason Sams
411fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    ss->clear();
412326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return s;
413326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
414326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
41557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onoratovoid rsi_ScriptCSetDefineF(Context *rsc, const char* name, float value)
41657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{
41757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    ScriptCState *ss = &rsc->mScriptC;
41857b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    ss->mFloatDefines.add(String8(name), value);
41957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato}
42057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
42157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onoratovoid rsi_ScriptCSetDefineI32(Context *rsc, const char* name, int32_t value)
42257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{
42357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    ScriptCState *ss = &rsc->mScriptC;
42457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato    ss->mInt32Defines.add(String8(name), value);
42557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato}
42657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
427326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
428326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
429326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
430326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
431