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