rsScriptC.cpp revision ce92d4baf7a5bce097228fdd4498601764cd4014
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
74ce92d4baf7a5bce097228fdd4498601764cd4014Jason Samsconst Allocation *ScriptC::ptrToAllocation(const void *ptr) const
75ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams{
76ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    if (!ptr) {
77ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams        return NULL;
78ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    }
79ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    for (uint32_t ct=0; ct < mEnviroment.mFieldCount; ct++) {
80ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams        if (!mSlots[ct].get())
81ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams            continue;
82ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams        if (mSlots[ct]->getPtr() == ptr) {
83ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams            return mSlots[ct].get();
84ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams        }
85ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    }
86ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    LOGE("ScriptC::ptrToAllocation, failed to find %p", ptr);
87ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    return NULL;
88ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams}
89ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
912dca84dd6c07992f78ad050177975f16486dd77eJason Samsuint32_t ScriptC::run(Context *rsc, uint32_t launchIndex)
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
93be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    if (mProgram.mRoot == NULL) {
94a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        rsc->setError(RS_ERROR_BAD_SCRIPT, "Attempted to run bad script");
95a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        return 0;
96a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams    }
97a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams
98d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    Context::ScriptTLSStruct * tls =
99e57691037aea219562ac686429b4b98202aab7bcJason Sams    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
1009e4e13d87e834b1cb770407cef0778c262b02b72Jason Sams    rsAssert(tls);
101a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
102a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragmentStore.get()) {
103a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
104a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
105a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragment.get()) {
106a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragment(mEnviroment.mFragment.get());
107a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
1088ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    if (mEnviroment.mVertex.get()) {
1098ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams        rsc->setVertex(mEnviroment.mVertex.get());
1108ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    }
111b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    if (mEnviroment.mRaster.get()) {
112b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams        rsc->setRaster(mEnviroment.mRaster.get());
113b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    }
114a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
1159c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    if (launchIndex == 0) {
1169c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato        mEnviroment.mStartTimeMillis
1179c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato                = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
1189c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    }
119ada7f272890d8791bc518c95989ad7d13050834dJason Sams    setupScript();
1201d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
1212dca84dd6c07992f78ad050177975f16486dd77eJason Sams    uint32_t ret = 0;
122e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = this;
123be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("ScriptC::run %p", mProgram.mRoot);
124be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    ret = mProgram.mRoot();
125e57691037aea219562ac686429b4b98202aab7bcJason Sams    tls->mScript = NULL;
126be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("ScriptC::run ret %i", ret);
127e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    return ret;
128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
130326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState()
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1328c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    mScript = NULL;
133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
136326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState()
137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1388c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    delete mScript;
1398c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    mScript = NULL;
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear()
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1448b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
1458b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams        mConstantBufferTypes[ct].clear();
14690b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams        mSlotWritable[ct] = false;
1478b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    }
148efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
1498c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    delete mScript;
150e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mScript = new ScriptC(NULL);
1511f52633fefd1862451e6a30209d590680d02beecJason Sams}
1521f52633fefd1862451e6a30209d590680d02beecJason Sams
153be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsstatic BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name)
15429df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams{
15529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
15629df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    if (sym) {
15729df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams        return sym->mPtr;
15829df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    }
15929df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    LOGE("ScriptC sym lookup failed for %s", name);
16029df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    return NULL;
16129df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams}
162a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
1638c6bc6930d4996b897de8e5113da4a4efae2310cJason Samsvoid ScriptCState::runCompiler(Context *rsc, ScriptC *s)
1641f52633fefd1862451e6a30209d590680d02beecJason Sams{
165be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("ScriptCState::runCompiler ");
166be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
167be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mBccScript = bccCreateScript();
168be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccScriptBitcode(s->mBccScript, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength);
169be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccRegisterSymbolCallback(s->mBccScript, symbolLookup, NULL);
170be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("ScriptCState::runCompiler 3");
171be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccCompileScript(s->mBccScript);
172be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("ScriptCState::runCompiler 4");
173be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetScriptLabel(s->mBccScript, "root", (BCCvoid**) &s->mProgram.mRoot);
174be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetScriptLabel(s->mBccScript, "init", (BCCvoid**) &s->mProgram.mInit);
175be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("root %p,  init %p", s->mProgram.mRoot, s->mProgram.mInit);
176f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams
1778c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    if (s->mProgram.mInit) {
1788c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        s->mProgram.mInit();
1791d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
1801d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
181be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mEnviroment.mInvokeFunctions = (Script::InvokeFunc_t *)calloc(100, sizeof(void *));
182be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    BCCchar **labels = new char*[100];
183be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetFunctions(s->mBccScript, (BCCsizei *)&s->mEnviroment.mInvokeFunctionCount,
184be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams                    100, (BCCchar **)labels);
185be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("func count %i", s->mEnviroment.mInvokeFunctionCount);
186be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    for (uint32_t i=0; i < s->mEnviroment.mInvokeFunctionCount; i++) {
187be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        BCCsizei length;
188be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        bccGetFunctionBinary(s->mBccScript, labels[i], (BCCvoid **)&(s->mEnviroment.mInvokeFunctions[i]), &length);
189be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //LOGE("func %i %p", i, s->mEnviroment.mInvokeFunctions[i]);
1908c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    }
1918c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
192be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mEnviroment.mFieldAddress = (void **)calloc(100, sizeof(void *));
193be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetExportVars(s->mBccScript, (BCCsizei *)&s->mEnviroment.mFieldCount,
194be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams                     100, s->mEnviroment.mFieldAddress);
195be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("var count %i", s->mEnviroment.mFieldCount);
196be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    for (uint32_t i=0; i < s->mEnviroment.mFieldCount; i++) {
197be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //LOGE("var %i %p", i, s->mEnviroment.mFieldAddress[i]);
1981d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
1991d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
2008c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
2018c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
202ccc010bb7c0f89e162bf60033968a20be90a903aJason Sams    s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramStore());
203b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    s->mEnviroment.mRaster.set(rsc->getDefaultProgramRaster());
204a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
205be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    if (s->mProgram.mRoot) {
2061030893d9b99b72468034da13df025bda479bb97Jason Sams        const static int pragmaMax = 16;
207be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        BCCsizei pragmaCount;
208be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        BCCchar * str[pragmaMax];
209be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        bccGetPragmas(s->mBccScript, &pragmaCount, pragmaMax, &str[0]);
2101030893d9b99b72468034da13df025bda479bb97Jason Sams
2111030893d9b99b72468034da13df025bda479bb97Jason Sams        for (int ct=0; ct < pragmaCount; ct+=2) {
2121030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "version")) {
2131030893d9b99b72468034da13df025bda479bb97Jason Sams                continue;
2141030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2151030893d9b99b72468034da13df025bda479bb97Jason Sams
2161030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateVertex")) {
2178ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
2188ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2198ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2208ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
2218c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mVertex.clear();
2228ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2238ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2241030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
2251030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2261030893d9b99b72468034da13df025bda479bb97Jason Sams
2271030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateRaster")) {
228b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                if (!strcmp(str[ct+1], "default")) {
229b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    continue;
230b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                }
231b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                if (!strcmp(str[ct+1], "parent")) {
232b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    s->mEnviroment.mRaster.clear();
233b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    continue;
234b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                }
2351030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
2361030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2371030893d9b99b72468034da13df025bda479bb97Jason Sams
2381030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragment")) {
2398ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
2408ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2418ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2428ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
2438c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragment.clear();
2448ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2458ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2461030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
2471030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2481030893d9b99b72468034da13df025bda479bb97Jason Sams
249b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams            if (!strcmp(str[ct], "stateStore")) {
2508ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
2518ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2528ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2538ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
2548c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragmentStore.clear();
2558ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2568ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
257b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                LOGE("Unreconized value %s passed to stateStore", str[ct+1]);
2581030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2591030893d9b99b72468034da13df025bda479bb97Jason Sams
2601030893d9b99b72468034da13df025bda479bb97Jason Sams        }
2611030893d9b99b72468034da13df025bda479bb97Jason Sams
262d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams
2631030893d9b99b72468034da13df025bda479bb97Jason Sams    } else {
2641030893d9b99b72468034da13df025bda479bb97Jason Sams        // Deal with an error.
2651030893d9b99b72468034da13df025bda479bb97Jason Sams    }
26657b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato}
2671030893d9b99b72468034da13df025bda479bb97Jason Sams
2688b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams
26957b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
270326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
271326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
272326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
273326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc)
274326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
275326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
276326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->clear();
277326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
278326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
279efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp)
280326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
2818c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    rsAssert(0);
2828c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    //ScriptCState *ss = &rsc->mScriptC;
2838c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    //ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp);
284326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
285326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2861f52633fefd1862451e6a30209d590680d02beecJason Samsvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
2871f52633fefd1862451e6a30209d590680d02beecJason Sams{
2881f52633fefd1862451e6a30209d590680d02beecJason Sams    ScriptCState *ss = &rsc->mScriptC;
289e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams
290e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    char *t = (char *)malloc(len + 1);
291e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    memcpy(t, text, len);
292e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    t[len] = 0;
293e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    ss->mScript->mEnviroment.mScriptText = t;
2948c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript->mEnviroment.mScriptTextLength = len;
2951f52633fefd1862451e6a30209d590680d02beecJason Sams}
2961f52633fefd1862451e6a30209d590680d02beecJason Sams
2971f52633fefd1862451e6a30209d590680d02beecJason Sams
298326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc)
299326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
301326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3028c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ScriptC *s = ss->mScript;
3038c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript = NULL;
3041f52633fefd1862451e6a30209d590680d02beecJason Sams
3058c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->runCompiler(rsc, s);
3069397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    s->incUserRef();
307e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    s->setContext(rsc);
308fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
309fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get());
31090b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams        s->mSlotWritable[ct] = ss->mSlotWritable[ct];
311fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    }
3121030893d9b99b72468034da13df025bda479bb97Jason Sams
313fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    ss->clear();
314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return s;
315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
321