rsScriptC.cpp revision 22fa371bf64b8aae786acfe5d711af21afb13a93
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
9022fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsvoid ScriptC::setTLS()
9122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{
9222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    Context::ScriptTLSStruct * tls = (Context::ScriptTLSStruct *)
9322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams                                  pthread_getspecific(Context::gThreadTLSKey);
9422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    rsAssert(tls);
9522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    tls->mScript = this;
9622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
9722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
9822fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsvoid ScriptC::clearTLS()
9922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{
10022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    Context::ScriptTLSStruct * tls = (Context::ScriptTLSStruct *)
10122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams                                  pthread_getspecific(Context::gThreadTLSKey);
10222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    rsAssert(tls);
10322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    tls->mScript = NULL;
10422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
1062dca84dd6c07992f78ad050177975f16486dd77eJason Samsuint32_t ScriptC::run(Context *rsc, uint32_t launchIndex)
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
108be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    if (mProgram.mRoot == NULL) {
109a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        rsc->setError(RS_ERROR_BAD_SCRIPT, "Attempted to run bad script");
110a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        return 0;
111a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams    }
112a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams
113a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragmentStore.get()) {
114a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
115a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
116a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragment.get()) {
117a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragment(mEnviroment.mFragment.get());
118a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
1198ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    if (mEnviroment.mVertex.get()) {
1208ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams        rsc->setVertex(mEnviroment.mVertex.get());
1218ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    }
122b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    if (mEnviroment.mRaster.get()) {
123b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams        rsc->setRaster(mEnviroment.mRaster.get());
124b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    }
125a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
1269c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    if (launchIndex == 0) {
1279c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato        mEnviroment.mStartTimeMillis
1289c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato                = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
1299c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    }
130ada7f272890d8791bc518c95989ad7d13050834dJason Sams    setupScript();
1311d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
1322dca84dd6c07992f78ad050177975f16486dd77eJason Sams    uint32_t ret = 0;
13322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    setTLS();
134be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("ScriptC::run %p", mProgram.mRoot);
135be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    ret = mProgram.mRoot();
13622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    clearTLS();
137be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("ScriptC::run ret %i", ret);
138e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    return ret;
139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
14122fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsvoid ScriptC::Invoke(Context *rsc, uint32_t slot, const void *data, uint32_t len)
14222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{
14322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    //LOGE("rsi_ScriptInvoke %i", slot);
14422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    if ((slot >= mEnviroment.mInvokeFunctionCount) ||
14522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        (mEnviroment.mInvokeFunctions[slot] == NULL)) {
14622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
14722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        return;
14822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    }
14922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    setupScript();
15022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    setTLS();
15122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
15222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    const uint32_t * dPtr = (const uint32_t *)data;
15322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    switch(len) {
15422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    case 0:
15522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        mEnviroment.mInvokeFunctions[slot]();
15622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        break;
15722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    case 4:
15822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        ((void (*)(uint32_t))
15922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams         mEnviroment.mInvokeFunctions[slot])(dPtr[0]);
16022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        break;
16122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    case 8:
16222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        ((void (*)(uint32_t, uint32_t))
16322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams         mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1]);
16422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        break;
16522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    case 12:
16622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        ((void (*)(uint32_t, uint32_t, uint32_t))
16722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams         mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2]);
16822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        break;
16922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    case 16:
17022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        ((void (*)(uint32_t, uint32_t, uint32_t, uint32_t))
17122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams         mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2], dPtr[3]);
17222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        break;
17322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    case 20:
17422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        ((void (*)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t))
17522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams         mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2], dPtr[3], dPtr[4]);
17622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams        break;
17722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    }
17822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    clearTLS();
17922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
18022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
181326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState()
182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1838c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    mScript = NULL;
184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
187326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState()
188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1898c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    delete mScript;
1908c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    mScript = NULL;
191326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
193326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear()
194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1958b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
1968b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams        mConstantBufferTypes[ct].clear();
19790b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams        mSlotWritable[ct] = false;
1988b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams    }
199efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
2008c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    delete mScript;
201e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mScript = new ScriptC(NULL);
2021f52633fefd1862451e6a30209d590680d02beecJason Sams}
2031f52633fefd1862451e6a30209d590680d02beecJason Sams
204be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsstatic BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name)
20529df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams{
206aeb094b520d8ea49b74129927578f18f758c873eJason Sams    const ScriptCState::SymbolTable_t *sym;
207aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sym = ScriptCState::lookupSymbol(name);
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (sym) {
209aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return sym->mPtr;
210aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
211aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sym = ScriptCState::lookupSymbolCL(name);
212aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (sym) {
213aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return sym->mPtr;
214aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
215aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sym = ScriptCState::lookupSymbolGL(name);
21629df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    if (sym) {
21729df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams        return sym->mPtr;
21829df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    }
21929df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    LOGE("ScriptC sym lookup failed for %s", name);
22029df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams    return NULL;
22129df66f82aeef7fa7e2cf00edbf00d43c822b05aJason Sams}
222a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
2238c6bc6930d4996b897de8e5113da4a4efae2310cJason Samsvoid ScriptCState::runCompiler(Context *rsc, ScriptC *s)
2241f52633fefd1862451e6a30209d590680d02beecJason Sams{
225be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("ScriptCState::runCompiler ");
226be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
227be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mBccScript = bccCreateScript();
228be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccScriptBitcode(s->mBccScript, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength);
229be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccRegisterSymbolCallback(s->mBccScript, symbolLookup, NULL);
230be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccCompileScript(s->mBccScript);
231be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetScriptLabel(s->mBccScript, "root", (BCCvoid**) &s->mProgram.mRoot);
232be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetScriptLabel(s->mBccScript, "init", (BCCvoid**) &s->mProgram.mInit);
233be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("root %p,  init %p", s->mProgram.mRoot, s->mProgram.mInit);
234f1685045e3423f2e342c3d74c206a25d72eba89dJason Sams
2358c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    if (s->mProgram.mInit) {
2368c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams        s->mProgram.mInit();
2371d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
2381d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
239be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mEnviroment.mInvokeFunctions = (Script::InvokeFunc_t *)calloc(100, sizeof(void *));
240be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    BCCchar **labels = new char*[100];
241be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetFunctions(s->mBccScript, (BCCsizei *)&s->mEnviroment.mInvokeFunctionCount,
242be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams                    100, (BCCchar **)labels);
243be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("func count %i", s->mEnviroment.mInvokeFunctionCount);
244be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    for (uint32_t i=0; i < s->mEnviroment.mInvokeFunctionCount; i++) {
245be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        BCCsizei length;
246be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        bccGetFunctionBinary(s->mBccScript, labels[i], (BCCvoid **)&(s->mEnviroment.mInvokeFunctions[i]), &length);
247be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //LOGE("func %i %p", i, s->mEnviroment.mInvokeFunctions[i]);
2488c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    }
2498c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
250be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mEnviroment.mFieldAddress = (void **)calloc(100, sizeof(void *));
251be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    bccGetExportVars(s->mBccScript, (BCCsizei *)&s->mEnviroment.mFieldCount,
252be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams                     100, s->mEnviroment.mFieldAddress);
253be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("var count %i", s->mEnviroment.mFieldCount);
254be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    for (uint32_t i=0; i < s->mEnviroment.mFieldCount; i++) {
255be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //LOGE("var %i %p", i, s->mEnviroment.mFieldAddress[i]);
2561d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams    }
2571d54f10f3c23e0d7ec57e52ec3b0701a2a5ed24eJason Sams
2588c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
2598c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    s->mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
260ccc010bb7c0f89e162bf60033968a20be90a903aJason Sams    s->mEnviroment.mFragmentStore.set(rsc->getDefaultProgramStore());
261b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams    s->mEnviroment.mRaster.set(rsc->getDefaultProgramRaster());
262a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
263be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    if (s->mProgram.mRoot) {
2641030893d9b99b72468034da13df025bda479bb97Jason Sams        const static int pragmaMax = 16;
265be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        BCCsizei pragmaCount;
266be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        BCCchar * str[pragmaMax];
267be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        bccGetPragmas(s->mBccScript, &pragmaCount, pragmaMax, &str[0]);
2681030893d9b99b72468034da13df025bda479bb97Jason Sams
2691030893d9b99b72468034da13df025bda479bb97Jason Sams        for (int ct=0; ct < pragmaCount; ct+=2) {
270aeb094b520d8ea49b74129927578f18f758c873eJason Sams            //LOGE("pragme %s %s", str[ct], str[ct+1]);
2711030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "version")) {
2721030893d9b99b72468034da13df025bda479bb97Jason Sams                continue;
2731030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2741030893d9b99b72468034da13df025bda479bb97Jason Sams
2751030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateVertex")) {
2768ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
2778ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2788ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2798ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
2808c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mVertex.clear();
2818ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
2828ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
2831030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
2841030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2851030893d9b99b72468034da13df025bda479bb97Jason Sams
2861030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateRaster")) {
287b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                if (!strcmp(str[ct+1], "default")) {
288b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    continue;
289b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                }
290b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                if (!strcmp(str[ct+1], "parent")) {
291b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    s->mEnviroment.mRaster.clear();
292b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                    continue;
293b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                }
2941030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
2951030893d9b99b72468034da13df025bda479bb97Jason Sams            }
2961030893d9b99b72468034da13df025bda479bb97Jason Sams
2971030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragment")) {
2988ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
2998ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
3008ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
3018ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
3028c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragment.clear();
3038ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
3048ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
3051030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
3061030893d9b99b72468034da13df025bda479bb97Jason Sams            }
3071030893d9b99b72468034da13df025bda479bb97Jason Sams
308b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams            if (!strcmp(str[ct], "stateStore")) {
3098ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
3108ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
3118ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
3128ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
3138c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams                    s->mEnviroment.mFragmentStore.clear();
3148ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
3158ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
316b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams                LOGE("Unreconized value %s passed to stateStore", str[ct+1]);
3171030893d9b99b72468034da13df025bda479bb97Jason Sams            }
3181030893d9b99b72468034da13df025bda479bb97Jason Sams
3191030893d9b99b72468034da13df025bda479bb97Jason Sams        }
3201030893d9b99b72468034da13df025bda479bb97Jason Sams
321d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams
3221030893d9b99b72468034da13df025bda479bb97Jason Sams    } else {
3231030893d9b99b72468034da13df025bda479bb97Jason Sams        // Deal with an error.
3241030893d9b99b72468034da13df025bda479bb97Jason Sams    }
32557b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato}
3261030893d9b99b72468034da13df025bda479bb97Jason Sams
3278b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams
32857b79ceb1126e3797fa42367b97dd7bcfcda1ed9Joe Onorato
329326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
330326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
331326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
332326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc)
333326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
335326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->clear();
336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
338efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp)
339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
3408c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    rsAssert(0);
3418c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    //ScriptCState *ss = &rsc->mScriptC;
3428c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    //ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp);
343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3451f52633fefd1862451e6a30209d590680d02beecJason Samsvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
3461f52633fefd1862451e6a30209d590680d02beecJason Sams{
3471f52633fefd1862451e6a30209d590680d02beecJason Sams    ScriptCState *ss = &rsc->mScriptC;
348e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams
349e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    char *t = (char *)malloc(len + 1);
350e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    memcpy(t, text, len);
351e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    t[len] = 0;
352e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    ss->mScript->mEnviroment.mScriptText = t;
3538c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript->mEnviroment.mScriptTextLength = len;
3541f52633fefd1862451e6a30209d590680d02beecJason Sams}
3551f52633fefd1862451e6a30209d590680d02beecJason Sams
3561f52633fefd1862451e6a30209d590680d02beecJason Sams
357326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc)
358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3618c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ScriptC *s = ss->mScript;
3628c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->mScript = NULL;
3631f52633fefd1862451e6a30209d590680d02beecJason Sams
3648c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    ss->runCompiler(rsc, s);
3659397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    s->incUserRef();
366e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    s->setContext(rsc);
367fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
368fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams        s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get());
36990b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams        s->mSlotWritable[ct] = ss->mSlotWritable[ct];
370fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    }
3711030893d9b99b72468034da13df025bda479bb97Jason Sams
372fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    ss->clear();
373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return s;
374326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
375326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
378326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
379326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
380