rsScriptC.cpp revision 9c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2
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"
22a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams#include "utils/String8.h"
239c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato#include "utils/Timers.h"
241ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich
251aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/gl.h>
261aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/glext.h>
271aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
31e57691037aea219562ac686429b4b98202aab7bcJason Sams#define GET_TLS()  Context::ScriptTLSStruct * tls = \
32e57691037aea219562ac686429b4b98202aab7bcJason Sams    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
33e57691037aea219562ac686429b4b98202aab7bcJason Sams    Context * rsc = tls->mContext; \
34e57691037aea219562ac686429b4b98202aab7bcJason Sams    ScriptC * sc = (ScriptC *) tls->mScript
35e57691037aea219562ac686429b4b98202aab7bcJason Sams
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
37326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptC::ScriptC()
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
391ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    mAccScript = NULL;
40efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    memset(&mProgram, 0, sizeof(mProgram));
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
43326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptC::~ScriptC()
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
451ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    if (mAccScript) {
461ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich        accDeleteScript(mAccScript);
471ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    }
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
51e57691037aea219562ac686429b4b98202aab7bcJason Samsbool ScriptC::run(Context *rsc, uint32_t launchIndex)
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
53d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    Context::ScriptTLSStruct * tls =
54e57691037aea219562ac686429b4b98202aab7bcJason Sams    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
55a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
56a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragmentStore.get()) {
57a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
58a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
59a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragment.get()) {
60a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragment(mEnviroment.mFragment.get());
61a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
628ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    if (mEnviroment.mVertex.get()) {
638ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams        rsc->setVertex(mEnviroment.mVertex.get());
648ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    }
65a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
669c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    if (launchIndex == 0) {
679c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato        mEnviroment.mStartTimeMillis
689c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato                = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
699c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    }
709c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato
71e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    bool ret = false;
72e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = this;
73e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    ret = mProgram.mScript(launchIndex) != 0;
74e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = NULL;
75e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    return ret;
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
78326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState()
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
83326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState()
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
851ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    if (mAccScript) {
861ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich        accDeleteScript(mAccScript);
871ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    }
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear()
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
92efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    memset(&mProgram, 0, sizeof(mProgram));
93efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mConstantBufferTypes.clear();
95efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
96efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    memset(&mEnviroment, 0, sizeof(mEnviroment));
97efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[0] = 0;
98efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[1] = 0;
99efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[2] = 0;
100efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[3] = 1;
101efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearDepth = 1;
102efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearStencil = 0;
103efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mIsRoot = false;
104efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
1051ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    mAccScript = NULL;
106efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
1071f52633fefd1862451e6a30209d590680d02beecJason Sams}
1081f52633fefd1862451e6a30209d590680d02beecJason Sams
109d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsstatic ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name)
11029df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams{
11129df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
11229df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    if (sym) {
11329df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams        return sym->mPtr;
11429df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    }
11529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    LOGE("ScriptC sym lookup failed for %s", name);
11629df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    return NULL;
11729df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams}
118a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
119a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsvoid ScriptCState::runCompiler(Context *rsc)
1201f52633fefd1862451e6a30209d590680d02beecJason Sams{
1211f52633fefd1862451e6a30209d590680d02beecJason Sams    mAccScript = accCreateScript();
122a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    String8 tmp;
123a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
124a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    rsc->appendNameDefines(&tmp);
125f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams    appendDecls(&tmp);
126b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    tmp.append("#line 1\n");
1271f52633fefd1862451e6a30209d590680d02beecJason Sams
128a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
129a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
130a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
13129df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    accRegisterSymbolCallback(mAccScript, symbolLookup, NULL);
1321f52633fefd1862451e6a30209d590680d02beecJason Sams    accCompileScript(mAccScript);
133efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
1341030893d9b99b72468034da13df025bda479bb97Jason Sams    rsAssert(mProgram.mScript);
1351030893d9b99b72468034da13df025bda479bb97Jason Sams
136f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams    if (!mProgram.mScript) {
137f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        ACCchar buf[4096];
138f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        ACCsizei len;
139f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        accGetScriptInfoLog(mAccScript, sizeof(buf), &len, buf);
140f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        LOGE(buf);
141f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams
142f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams    }
143f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams
1448ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
1458ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
1468ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
147a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
1481030893d9b99b72468034da13df025bda479bb97Jason Sams    if (mProgram.mScript) {
1491030893d9b99b72468034da13df025bda479bb97Jason Sams        const static int pragmaMax = 16;
1501030893d9b99b72468034da13df025bda479bb97Jason Sams        ACCsizei pragmaCount;
1511030893d9b99b72468034da13df025bda479bb97Jason Sams        ACCchar * str[pragmaMax];
1521030893d9b99b72468034da13df025bda479bb97Jason Sams        accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
1531030893d9b99b72468034da13df025bda479bb97Jason Sams
1541030893d9b99b72468034da13df025bda479bb97Jason Sams        for (int ct=0; ct < pragmaCount; ct+=2) {
1551030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "version")) {
1561030893d9b99b72468034da13df025bda479bb97Jason Sams                continue;
1571030893d9b99b72468034da13df025bda479bb97Jason Sams            }
1581030893d9b99b72468034da13df025bda479bb97Jason Sams
1591030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateVertex")) {
1608ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
1618ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1628ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1638ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
1648ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mVertex.clear();
1658ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1668ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1678ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
1688ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (pv != NULL) {
1698ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mVertex.set(pv);
1708ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1718ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1721030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
1731030893d9b99b72468034da13df025bda479bb97Jason Sams            }
1741030893d9b99b72468034da13df025bda479bb97Jason Sams
1751030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateRaster")) {
1761030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
1771030893d9b99b72468034da13df025bda479bb97Jason Sams            }
1781030893d9b99b72468034da13df025bda479bb97Jason Sams
1791030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragment")) {
1808ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
1818ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1828ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1838ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
1848ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mFragment.clear();
1858ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1868ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1878ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
188a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                if (pf != NULL) {
189a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                    mEnviroment.mFragment.set(pf);
1901030893d9b99b72468034da13df025bda479bb97Jason Sams                    continue;
1911030893d9b99b72468034da13df025bda479bb97Jason Sams                }
1921030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
1931030893d9b99b72468034da13df025bda479bb97Jason Sams            }
1941030893d9b99b72468034da13df025bda479bb97Jason Sams
1951030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragmentStore")) {
1968ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
1978ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1988ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1998ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
2008ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mFragmentStore.clear();
2018ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2028ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
203d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams                ProgramFragmentStore * pfs =
204a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                    (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
205a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                if (pfs != NULL) {
206a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                    mEnviroment.mFragmentStore.set(pfs);
2071030893d9b99b72468034da13df025bda479bb97Jason Sams                    continue;
2081030893d9b99b72468034da13df025bda479bb97Jason Sams                }
2091030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
2101030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2111030893d9b99b72468034da13df025bda479bb97Jason Sams
2121030893d9b99b72468034da13df025bda479bb97Jason Sams        }
2131030893d9b99b72468034da13df025bda479bb97Jason Sams
214d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams
2151030893d9b99b72468034da13df025bda479bb97Jason Sams    } else {
2161030893d9b99b72468034da13df025bda479bb97Jason Sams        // Deal with an error.
2171030893d9b99b72468034da13df025bda479bb97Jason Sams    }
2181030893d9b99b72468034da13df025bda479bb97Jason Sams
219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
221326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
222326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
224326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc)
225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->clear();
228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
230326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCAddType(Context * rsc, RsType vt)
231326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
232326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
233326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
234326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
235326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
236efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp)
237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
239e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp);
240326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
241326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
242326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
243326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
244326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
245efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mIsRoot = isRoot;
246326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
247326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2481f52633fefd1862451e6a30209d590680d02beecJason Samsvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
2491f52633fefd1862451e6a30209d590680d02beecJason Sams{
2501f52633fefd1862451e6a30209d590680d02beecJason Sams    ScriptCState *ss = &rsc->mScriptC;
251efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mProgram.mScriptText = text;
252efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mProgram.mScriptTextLength = len;
2531f52633fefd1862451e6a30209d590680d02beecJason Sams}
2541f52633fefd1862451e6a30209d590680d02beecJason Sams
2551f52633fefd1862451e6a30209d590680d02beecJason Sams
256326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc)
257326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
258326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
259326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
260a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    ss->runCompiler(rsc);
2611f52633fefd1862451e6a30209d590680d02beecJason Sams
262326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC *s = new ScriptC();
263efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    s->incRef();
2641ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    s->mAccScript = ss->mAccScript;
2651ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    ss->mAccScript = NULL;
266efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    s->mEnviroment = ss->mEnviroment;
267efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    s->mProgram = ss->mProgram;
268efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->clear();
2691030893d9b99b72468034da13df025bda479bb97Jason Sams
270326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return s;
271326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
272326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
273326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
274326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
275326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
276326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
277