rsScriptC.cpp revision e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fd
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"
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{
52e57691037aea219562ac686429b4b98202aab7bcJason 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
65e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    bool ret = false;
66e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = this;
67e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    ret = mProgram.mScript(launchIndex) != 0;
68e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = NULL;
69e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    return ret;
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
72326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState()
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
77326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState()
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
791ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    if (mAccScript) {
801ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich        accDeleteScript(mAccScript);
811ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    }
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear()
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
86efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    memset(&mProgram, 0, sizeof(mProgram));
87efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mConstantBufferTypes.clear();
89efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
90efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    memset(&mEnviroment, 0, sizeof(mEnviroment));
91efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[0] = 0;
92efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[1] = 0;
93efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[2] = 0;
94efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[3] = 1;
95efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearDepth = 1;
96efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearStencil = 0;
97efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mIsRoot = false;
98efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
991ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    mAccScript = NULL;
100efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
1011f52633fefd1862451e6a30209d590680d02beecJason Sams}
1021f52633fefd1862451e6a30209d590680d02beecJason Sams
10329df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Samsstatic ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name)
10429df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams{
10529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
10629df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams
10729df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    if (sym) {
10829df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams        return sym->mPtr;
10929df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    }
11029df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams
11129df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    LOGE("ScriptC sym lookup failed for %s", name);
11229df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams
11329df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    // Default to calling dlsym to allow any global symbol:
11429df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    return NULL;
11529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams}
116a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
117a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsvoid ScriptCState::runCompiler(Context *rsc)
1181f52633fefd1862451e6a30209d590680d02beecJason Sams{
1191f52633fefd1862451e6a30209d590680d02beecJason Sams    mAccScript = accCreateScript();
120a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    String8 tmp;
121a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
122a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    rsc->appendNameDefines(&tmp);
123f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams    appendDecls(&tmp);
124f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams    //tmp.append("#line 1\n");
1251f52633fefd1862451e6a30209d590680d02beecJason Sams
126a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
127a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
128a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
12929df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    accRegisterSymbolCallback(mAccScript, symbolLookup, NULL);
1301f52633fefd1862451e6a30209d590680d02beecJason Sams    accCompileScript(mAccScript);
131efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
1321030893d9b99b72468034da13df025bda479bb97Jason Sams    rsAssert(mProgram.mScript);
1331030893d9b99b72468034da13df025bda479bb97Jason Sams
134f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams    if (!mProgram.mScript) {
135f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        ACCchar buf[4096];
136f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        ACCsizei len;
137f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        accGetScriptInfoLog(mAccScript, sizeof(buf), &len, buf);
138f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams        LOGE(buf);
139f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams
140f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams    }
141f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams
1428ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
1438ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
1448ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
145a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
1461030893d9b99b72468034da13df025bda479bb97Jason Sams    if (mProgram.mScript) {
1471030893d9b99b72468034da13df025bda479bb97Jason Sams        const static int pragmaMax = 16;
1481030893d9b99b72468034da13df025bda479bb97Jason Sams        ACCsizei pragmaCount;
1491030893d9b99b72468034da13df025bda479bb97Jason Sams        ACCchar * str[pragmaMax];
1501030893d9b99b72468034da13df025bda479bb97Jason Sams        accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
1511030893d9b99b72468034da13df025bda479bb97Jason Sams
1521030893d9b99b72468034da13df025bda479bb97Jason Sams        for (int ct=0; ct < pragmaCount; ct+=2) {
1531030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "version")) {
1541030893d9b99b72468034da13df025bda479bb97Jason Sams                continue;
1551030893d9b99b72468034da13df025bda479bb97Jason Sams            }
1561030893d9b99b72468034da13df025bda479bb97Jason Sams
1571030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateVertex")) {
1588ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
1598ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1608ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1618ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
1628ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mVertex.clear();
1638ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1648ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1658ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
1668ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (pv != NULL) {
1678ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mVertex.set(pv);
1688ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1698ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1701030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
1711030893d9b99b72468034da13df025bda479bb97Jason Sams            }
1721030893d9b99b72468034da13df025bda479bb97Jason Sams
1731030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateRaster")) {
1741030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
1751030893d9b99b72468034da13df025bda479bb97Jason Sams            }
1761030893d9b99b72468034da13df025bda479bb97Jason Sams
1771030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragment")) {
1788ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
1798ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1808ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1818ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
1828ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mFragment.clear();
1838ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1848ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1858ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
186a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                if (pf != NULL) {
187a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                    mEnviroment.mFragment.set(pf);
1881030893d9b99b72468034da13df025bda479bb97Jason Sams                    continue;
1891030893d9b99b72468034da13df025bda479bb97Jason Sams                }
1901030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
1911030893d9b99b72468034da13df025bda479bb97Jason Sams            }
1921030893d9b99b72468034da13df025bda479bb97Jason Sams
1931030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragmentStore")) {
1948ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
1958ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
1968ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
1978ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
1988ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mFragmentStore.clear();
1998ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2008ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
201a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                ProgramFragmentStore * pfs =
202a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                    (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
203a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                if (pfs != NULL) {
204a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                    mEnviroment.mFragmentStore.set(pfs);
2051030893d9b99b72468034da13df025bda479bb97Jason Sams                    continue;
2061030893d9b99b72468034da13df025bda479bb97Jason Sams                }
2071030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
2081030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2091030893d9b99b72468034da13df025bda479bb97Jason Sams
2101030893d9b99b72468034da13df025bda479bb97Jason Sams        }
2111030893d9b99b72468034da13df025bda479bb97Jason Sams
2121030893d9b99b72468034da13df025bda479bb97Jason Sams
2131030893d9b99b72468034da13df025bda479bb97Jason Sams    } else {
2141030893d9b99b72468034da13df025bda479bb97Jason Sams        // Deal with an error.
2151030893d9b99b72468034da13df025bda479bb97Jason Sams    }
2161030893d9b99b72468034da13df025bda479bb97Jason Sams
217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
219326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
220326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
222326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc)
223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->clear();
226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
228326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
230326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
231efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearColor[0] = r;
232efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearColor[1] = g;
233efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearColor[2] = b;
234efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearColor[3] = a;
235326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
237326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetClearDepth(Context * rsc, float v)
238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
240efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearDepth = v;
241326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
242326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
243326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
244326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
245326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
246efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearStencil = v;
247326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
248326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
249326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCAddType(Context * rsc, RsType vt)
250326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
251326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
252326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
253326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
254326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
255efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp)
256326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
257326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
258e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp);
259326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
260326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
261326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
262326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
263326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
264efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mIsRoot = isRoot;
265326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
266326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2671f52633fefd1862451e6a30209d590680d02beecJason Samsvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
2681f52633fefd1862451e6a30209d590680d02beecJason Sams{
2691f52633fefd1862451e6a30209d590680d02beecJason Sams    ScriptCState *ss = &rsc->mScriptC;
270efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mProgram.mScriptText = text;
271efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mProgram.mScriptTextLength = len;
2721f52633fefd1862451e6a30209d590680d02beecJason Sams}
2731f52633fefd1862451e6a30209d590680d02beecJason Sams
2741f52633fefd1862451e6a30209d590680d02beecJason Sams
275326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc)
276326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
277326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
278326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
279a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    ss->runCompiler(rsc);
2801f52633fefd1862451e6a30209d590680d02beecJason Sams
281326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC *s = new ScriptC();
282efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    s->incRef();
2831ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    s->mAccScript = ss->mAccScript;
2841ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    ss->mAccScript = NULL;
285efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    s->mEnviroment = ss->mEnviroment;
286efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    s->mProgram = ss->mProgram;
287efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->clear();
2881030893d9b99b72468034da13df025bda479bb97Jason Sams
289326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return s;
290326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
291326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
292326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
293326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
294326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
295326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
296