rsScript.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
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
22e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsScript::Script(Context *rsc) : ObjectBase(rsc)
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
24f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
25f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
26928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    memset(&mEnviroment, 0, sizeof(mEnviroment));
27928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    mEnviroment.mClearColor[0] = 0;
28928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    mEnviroment.mClearColor[1] = 0;
29928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    mEnviroment.mClearColor[2] = 0;
30928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    mEnviroment.mClearColor[3] = 1;
31928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    mEnviroment.mClearDepth = 1;
328c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    mEnviroment.mClearStencil = 0;
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
35326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScript::~Script()
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
39be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid Script::setVar(uint32_t slot, const void *val, uint32_t len)
40be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{
41be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    int32_t *destPtr = ((int32_t **)mEnviroment.mFieldAddress)[slot];
42be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    if (destPtr) {
43be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //LOGE("setVar f1  %f", ((const float *)destPtr)[0]);
44be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //LOGE("setVar %p %i", destPtr, len);
45be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        memcpy(destPtr, val, len);
46be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        //LOGE("setVar f2  %f", ((const float *)destPtr)[0]);
47be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    } else {
48be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        LOGE("Calling setVar on slot = %i which is null", slot);
49be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    }
50be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
51be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptBindAllocation(Context * rsc, RsScript vs, RsAllocation va, uint32_t slot)
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Script *s = static_cast<Script *>(vs);
59be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Allocation *a = static_cast<Allocation *>(va);
60be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mSlots[slot].set(a);
61be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("rsi_ScriptBindAllocation %i  %p  %p", slot, a, a->getPtr());
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
64d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsvoid rsi_ScriptSetClearColor(Context * rsc, RsScript vs, float r, float g, float b, float a)
65d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams{
66d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    Script *s = static_cast<Script *>(vs);
67d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    s->mEnviroment.mClearColor[0] = r;
68d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    s->mEnviroment.mClearColor[1] = g;
69d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    s->mEnviroment.mClearColor[2] = b;
70d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    s->mEnviroment.mClearColor[3] = a;
71d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams}
72d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams
73d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsvoid rsi_ScriptSetTimeZone(Context * rsc, RsScript vs, const char * timeZone, uint32_t length)
74d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams{
75d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    Script *s = static_cast<Script *>(vs);
76d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    s->mEnviroment.mTimeZone = timeZone;
77d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams}
78d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams
79d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsvoid rsi_ScriptSetClearDepth(Context * rsc, RsScript vs, float v)
80d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams{
81d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    Script *s = static_cast<Script *>(vs);
82d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    s->mEnviroment.mClearDepth = v;
83d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams}
84d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams
85d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsvoid rsi_ScriptSetClearStencil(Context * rsc, RsScript vs, uint32_t v)
86d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams{
87d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    Script *s = static_cast<Script *>(vs);
88d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams    s->mEnviroment.mClearStencil = v;
89d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams}
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
9190b36a88cf0cc549b296ac15a249ea7786c6de9eJason Samsvoid rsi_ScriptSetType(Context * rsc, RsType vt, uint32_t slot, bool writable, const char *name)
92fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams{
93fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    ScriptCState *ss = &rsc->mScriptC;
94fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    const Type *t = static_cast<const Type *>(vt);
95fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams    ss->mConstantBufferTypes[slot].set(t);
9690b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams    ss->mSlotWritable[slot] = writable;
97be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("rsi_ScriptSetType");
98fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams}
99fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams
1008c6bc6930d4996b897de8e5113da4a4efae2310cJason Samsvoid rsi_ScriptSetInvoke(Context *rsc, const char *name, uint32_t slot)
1018c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams{
102be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("rsi_ScriptSetInvoke");
1038c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams}
1048c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
105be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
1068c6bc6930d4996b897de8e5113da4a4efae2310cJason Samsvoid rsi_ScriptInvoke(Context *rsc, RsScript vs, uint32_t slot)
1078c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams{
108be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("rsi_ScriptInvoke %i", slot);
1098c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    Script *s = static_cast<Script *>(vs);
110be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    if ((slot >= s->mEnviroment.mInvokeFunctionCount) ||
111be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        (s->mEnviroment.mInvokeFunctions[slot] == NULL)) {
112a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
113a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams        return;
114a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams    }
115ada7f272890d8791bc518c95989ad7d13050834dJason Sams    s->setupScript();
116be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("invoking %i %p", slot, s->mEnviroment.mInvokeFunctions[slot]);
117be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mEnviroment.mInvokeFunctions[slot]();
118be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("invoke finished");
1198c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams}
1208c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
1218c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
122be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid rsi_ScriptInvokeData(Context *rsc, RsScript vs, uint32_t slot, void *data)
123be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{
124be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("rsi_ScriptInvoke %i", slot);
125be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Script *s = static_cast<Script *>(vs);
126be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    if ((slot >= s->mEnviroment.mInvokeFunctionCount) ||
127be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        (s->mEnviroment.mInvokeFunctions[slot] == NULL)) {
128be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
129be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        return;
130be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    }
131be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->setupScript();
132be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("invoking %i %p", slot, s->mEnviroment.mInvokeFunctions[slot]);
133be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->mEnviroment.mInvokeFunctions[slot]();
134be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("invoke finished");
135be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
136be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
137be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid rsi_ScriptInvokeV(Context *rsc, RsScript vs, uint32_t slot, const void *data, uint32_t len)
138be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{
139be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("rsi_ScriptInvoke %i", slot);
140be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Script *s = static_cast<Script *>(vs);
141be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    if ((slot >= s->mEnviroment.mInvokeFunctionCount) ||
142be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        (s->mEnviroment.mInvokeFunctions[slot] == NULL)) {
143be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
144be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        return;
145be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    }
146be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->setupScript();
147be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
148be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("rsi_ScriptInvokeV, len=%i", len);
149be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const uint32_t * dPtr = (const uint32_t *)data;
150be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    switch(len) {
151be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    case 0:
152be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        s->mEnviroment.mInvokeFunctions[slot]();
153be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        break;
154be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    case 4:
155be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        ((void (*)(uint32_t))
156be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams         s->mEnviroment.mInvokeFunctions[slot])(dPtr[0]);
157be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        break;
158be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    case 8:
159be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        ((void (*)(uint32_t, uint32_t))
160be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams         s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1]);
161be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        break;
162be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    case 12:
163be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        ((void (*)(uint32_t, uint32_t, uint32_t))
164be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams         s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2]);
165be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        break;
166be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    case 16:
167be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        ((void (*)(uint32_t, uint32_t, uint32_t, uint32_t))
168be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams         s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2], dPtr[3]);
169be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        break;
170be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    case 20:
171be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        ((void (*)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t))
172be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams         s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2], dPtr[3], dPtr[4]);
173be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams        break;
174be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
175be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
176be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    }
177be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
178be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
179be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
180fa51719e6c1bd17b3f347477b4827face9ab647eJason Samsvoid rsi_ScriptSetRoot(Context * rsc, bool isRoot)
181fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams{
182be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    LOGE("rsi_ScriptSetRoot");
183be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
184be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
185be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid rsi_ScriptSetVarI(Context *rsc, RsScript vs, uint32_t slot, int value)
186be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{
187be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Script *s = static_cast<Script *>(vs);
188be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->setVar(slot, &value, sizeof(value));
189be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
190be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
191be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid rsi_ScriptSetVarF(Context *rsc, RsScript vs, uint32_t slot, float value)
192be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{
193be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Script *s = static_cast<Script *>(vs);
194be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->setVar(slot, &value, sizeof(value));
195be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
196be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
197be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid rsi_ScriptSetVarV(Context *rsc, RsScript vs, uint32_t slot, const void *data, uint32_t len)
198be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{
199be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const float *fp = (const float *)data;
200be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Script *s = static_cast<Script *>(vs);
201be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->setVar(slot, data, len);
202fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams}
203fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams
204fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams
205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
208