rsScriptC.cpp revision be36bf3a76481737a7fa606a04144ceef80eb4f2
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"
20be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams#include "../../../external/llvm/libbcc/include/bcc/bcc.h"
219c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato#include "utils/Timers.h"
221ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich
231aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/gl.h>
241aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/glext.h>
251aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
29e57691037aea219562ac686429b4b98202aab7bcJason Sams#define GET_TLS()  Context::ScriptTLSStruct * tls = \
30e57691037aea219562ac686429b4b98202aab7bcJason Sams    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
31e57691037aea219562ac686429b4b98202aab7bcJason Sams    Context * rsc = tls->mContext; \
32e57691037aea219562ac686429b4b98202aab7bcJason Sams    ScriptC * sc = (ScriptC *) tls->mScript
33e57691037aea219562ac686429b4b98202aab7bcJason Sams
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
35e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsScriptC::ScriptC(Context *rsc) : Script(rsc)
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
37f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
38f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
39be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    mBccScript = NULL;
40efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    memset(&mProgram, 0, sizeof(mProgram));
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
43326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptC::~ScriptC()
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
45be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    if (mBccScript) {
46be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        bccDeleteScript(mBccScript);
471ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    }
48e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    free(mEnviroment.mScriptText);
49e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    mEnviroment.mScriptText = NULL;
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
52ada7f272890d8791bc518c95989ad7d13050834dJason Samsvoid ScriptC::setupScript()
53ada7f272890d8791bc518c95989ad7d13050834dJason Sams{
54be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    for (uint32_t ct=0; ct < mEnviroment.mFieldCount; ct++) {
55be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        if (!mSlots[ct].get())
56be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams            continue;
57be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        void *ptr = mSlots[ct]->getPtr();
58be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        void **dest = ((void ***)mEnviroment.mFieldAddress)[ct];
59be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //LOGE("setupScript %i %p = %p    %p %i", ct, dest, ptr, mSlots[ct]->getType(), mSlots[ct]->getType()->getDimX());
60be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
61be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //const uint32_t *p32 = (const uint32_t *)ptr;
62be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //for (uint32_t ct2=0; ct2 < mSlots[ct]->getType()->getDimX(); ct2++) {
63be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams            //LOGE("  %i = 0x%08x ", ct2, p32[ct2]);
64be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //}
65be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
66be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        if (dest) {
67be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams            *dest = ptr;
68be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        } else {
69be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams            LOGE("ScriptC::setupScript, NULL var binding address.");
70ada7f272890d8791bc518c95989ad7d13050834dJason Sams        }
71ada7f272890d8791bc518c95989ad7d13050834dJason Sams    }
72ada7f272890d8791bc518c95989ad7d13050834dJason Sams}
73ada7f272890d8791bc518c95989ad7d13050834dJason Sams
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
752dca84dd6c07992f78ad050177975f16486dd77eJason Samsuint32_t ScriptC::run(Context *rsc, uint32_t launchIndex)
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
77be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    if (mProgram.mRoot == NULL) {
78a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        rsc->setError(RS_ERROR_BAD_SCRIPT, "Attempted to run bad script");
79a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        return 0;
80a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams    }
81a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams
82d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    Context::ScriptTLSStruct * tls =
83e57691037aea219562ac686429b4b98202aab7bcJason Sams    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
849e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams    rsAssert(tls);
85a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
86a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragmentStore.get()) {
87a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
88a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
89a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragment.get()) {
90a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragment(mEnviroment.mFragment.get());
91a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
928ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    if (mEnviroment.mVertex.get()) {
938ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams        rsc->setVertex(mEnviroment.mVertex.get());
948ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    }
95b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    if (mEnviroment.mRaster.get()) {
96b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams        rsc->setRaster(mEnviroment.mRaster.get());
97b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    }
98a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
999c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    if (launchIndex == 0) {
1009c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato        mEnviroment.mStartTimeMillis
1019c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato                = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
1029c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    }
103ada7f272890d8791bc518c95989ad7d13050834dJason Sams    setupScript();
1041d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
1052dca84dd6c07992f78ad050177975f16486dd77eJason Sams    uint32_t ret = 0;
106e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = this;
107be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("ScriptC::run %p", mProgram.mRoot);
108be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    ret = mProgram.mRoot();
109e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = NULL;
110be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("ScriptC::run ret %i", ret);
111e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    return ret;
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
114326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState()
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1168c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    mScript = NULL;
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
120326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState()
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1228c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    delete mScript;
1238c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    mScript = NULL;
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
126326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear()
127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1288b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
1298b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams        mConstantBufferTypes[ct].clear();
13090b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams        mSlotWritable[ct] = false;
1318b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    }
132efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
1338c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    delete mScript;
134e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mScript = new ScriptC(NULL);
1351f52633fefd1862451e6a30209d590680d02beecJason Sams}
1361f52633fefd1862451e6a30209d590680d02beecJason Sams
137be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsstatic BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name)
13829df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams{
13929df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
14029df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    if (sym) {
14129df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams        return sym->mPtr;
14229df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    }
14329df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    LOGE("ScriptC sym lookup failed for %s", name);
14429df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    return NULL;
14529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams}
146a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
1478c6bc6930d4996b897de8e5113da4a4efae2310cJason Samsvoid ScriptCState::runCompiler(Context *rsc, ScriptC *s)
1481f52633fefd1862451e6a30209d590680d02beecJason Sams{
149be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("ScriptCState::runCompiler ");
150be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
151be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mBccScript = bccCreateScript();
152be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccScriptBitcode(s->mBccScript, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength);
153be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccRegisterSymbolCallback(s->mBccScript, symbolLookup, NULL);
154be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("ScriptCState::runCompiler 3");
155be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccCompileScript(s->mBccScript);
156be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("ScriptCState::runCompiler 4");
157be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetScriptLabel(s->mBccScript, "root", (BCCvoid**) &s->mProgram.mRoot);
158be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetScriptLabel(s->mBccScript, "init", (BCCvoid**) &s->mProgram.mInit);
159be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("root %p,  init %p", s->mProgram.mRoot, s->mProgram.mInit);
160f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams
1618c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    if (s->mProgram.mInit) {
1628c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        s->mProgram.mInit();
1631d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
1641d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
165be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mEnviroment.mInvokeFunctions = (Script::InvokeFunc_t *)calloc(100, sizeof(void *));
166be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    BCCchar **labels = new char*[100];
167be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetFunctions(s->mBccScript, (BCCsizei *)&s->mEnviroment.mInvokeFunctionCount,
168be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams                    100, (BCCchar **)labels);
169be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("func count %i", s->mEnviroment.mInvokeFunctionCount);
170be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    for (uint32_t i=0; i < s->mEnviroment.mInvokeFunctionCount; i++) {
171be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        BCCsizei length;
172be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        bccGetFunctionBinary(s->mBccScript, labels[i], (BCCvoid **)&(s->mEnviroment.mInvokeFunctions[i]), &length);
173be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //LOGE("func %i %p", i, s->mEnviroment.mInvokeFunctions[i]);
1748c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    }
1758c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
176be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mEnviroment.mFieldAddress = (void **)calloc(100, sizeof(void *));
177be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetExportVars(s->mBccScript, (BCCsizei *)&s->mEnviroment.mFieldCount,
178be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams                     100, s->mEnviroment.mFieldAddress);
179be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("var count %i", s->mEnviroment.mFieldCount);
180be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    for (uint32_t i=0; i < s->mEnviroment.mFieldCount; i++) {
181be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //LOGE("var %i %p", i, s->mEnviroment.mFieldAddress[i]);
1821d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
1831d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
1848c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
1858c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
1868c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
187b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    s->mEnviroment.mRaster.set(rsc->getDefaultProgramRaster());
188a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
189be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    if (s->mProgram.mRoot) {
1901030893d9b99b72468034da13df025bda479bb97Jason Sams        const static int pragmaMax = 16;
191be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        BCCsizei pragmaCount;
192be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        BCCchar * str[pragmaMax];
193be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        bccGetPragmas(s->mBccScript, &pragmaCount, pragmaMax, &str[0]);
1941030893d9b99b72468034da13df025bda479bb97Jason Sams
1951030893d9b99b72468034da13df025bda479bb97Jason Sams        for (int ct=0; ct < pragmaCount; ct+=2) {
1961030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "version")) {
1971030893d9b99b72468034da13df025bda479bb97Jason Sams                continue;
1981030893d9b99b72468034da13df025bda479bb97Jason Sams            }
1991030893d9b99b72468034da13df025bda479bb97Jason Sams
2001030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateVertex")) {
2018ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
2028ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2038ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2048ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
2058c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mVertex.clear();
2068ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2078ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2081030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
2091030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2101030893d9b99b72468034da13df025bda479bb97Jason Sams
2111030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateRaster")) {
212b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                if (!strcmp(str[ct+1], "default")) {
213b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    continue;
214b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                }
215b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                if (!strcmp(str[ct+1], "parent")) {
216b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    s->mEnviroment.mRaster.clear();
217b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    continue;
218b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                }
2191030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
2201030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2211030893d9b99b72468034da13df025bda479bb97Jason Sams
2221030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragment")) {
2238ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
2248ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2258ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2268ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
2278c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragment.clear();
2288ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2298ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2301030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
2311030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2321030893d9b99b72468034da13df025bda479bb97Jason Sams
233b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams            if (!strcmp(str[ct], "stateStore")) {
2348ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
2358ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2368ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2378ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
2388c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragmentStore.clear();
2398ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2408ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
241b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                LOGE("Unreconized value %s passed to stateStore", str[ct+1]);
2421030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2431030893d9b99b72468034da13df025bda479bb97Jason Sams
2441030893d9b99b72468034da13df025bda479bb97Jason Sams        }
2451030893d9b99b72468034da13df025bda479bb97Jason Sams
246d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams
2471030893d9b99b72468034da13df025bda479bb97Jason Sams    } else {
2481030893d9b99b72468034da13df025bda479bb97Jason Sams        // Deal with an error.
2491030893d9b99b72468034da13df025bda479bb97Jason Sams    }
25057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato}
2511030893d9b99b72468034da13df025bda479bb97Jason Sams
2528b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams
25357b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
254326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
255326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
256326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
257326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc)
258326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
259326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
260326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->clear();
261326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
262326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
263efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp)
264326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
2658c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    rsAssert(0);
2668c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    //ScriptCState *ss = &rsc->mScriptC;
2678c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    //ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp);
268326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
269326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2701f52633fefd1862451e6a30209d590680d02beecJason Samsvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
2711f52633fefd1862451e6a30209d590680d02beecJason Sams{
2721f52633fefd1862451e6a30209d590680d02beecJason Sams    ScriptCState *ss = &rsc->mScriptC;
273e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams
274e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    char *t = (char *)malloc(len + 1);
275e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    memcpy(t, text, len);
276e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    t[len] = 0;
277e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    ss->mScript->mEnviroment.mScriptText = t;
2788c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript->mEnviroment.mScriptTextLength = len;
2791f52633fefd1862451e6a30209d590680d02beecJason Sams}
2801f52633fefd1862451e6a30209d590680d02beecJason Sams
2811f52633fefd1862451e6a30209d590680d02beecJason Sams
282326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc)
283326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
284326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
285326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2868c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ScriptC *s = ss->mScript;
2878c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript = NULL;
2881f52633fefd1862451e6a30209d590680d02beecJason Sams
2898c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->runCompiler(rsc, s);
2909397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    s->incUserRef();
291e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    s->setContext(rsc);
292fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
293fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get());
29490b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams        s->mSlotWritable[ct] = ss->mSlotWritable[ct];
295fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    }
2961030893d9b99b72468034da13df025bda479bb97Jason Sams
297fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    ss->clear();
298326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return s;
299326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
30157b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onoratovoid rsi_ScriptCSetDefineF(Context *rsc, const char* name, float value)
30257b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{
303be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("Error rsi_ScriptCSetDefineF");
30457b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato}
30557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
30657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onoratovoid rsi_ScriptCSetDefineI32(Context *rsc, const char* name, int32_t value)
30757b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato{
308be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("Error rsi_ScriptCSetDefineI");
30957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato}
31057b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
315