blob: 1c63c115b80eeec39b5880e5b30322e0967e0481 [file] [log] [blame]
Jason Samsd19f10d2009-05-22 14:03:28 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "rsContext.h"
18
19using namespace android;
20using namespace android::renderscript;
21
Jason Samsa9e7a052009-09-25 14:51:22 -070022Script::Script(Context *rsc) : ObjectBase(rsc)
Jason Samsd19f10d2009-05-22 14:03:28 -070023{
Jason Sams61f08d62009-09-25 16:37:33 -070024 mAllocFile = __FILE__;
25 mAllocLine = __LINE__;
Jason Sams928f5cf2009-06-08 18:50:13 -070026 memset(&mEnviroment, 0, sizeof(mEnviroment));
27 mEnviroment.mClearColor[0] = 0;
28 mEnviroment.mClearColor[1] = 0;
29 mEnviroment.mClearColor[2] = 0;
30 mEnviroment.mClearColor[3] = 1;
31 mEnviroment.mClearDepth = 1;
Jason Samsbe2e8412009-09-16 15:04:38 -070032 mEnviroment.mClearStencil = 0;
Jason Samsd19f10d2009-05-22 14:03:28 -070033}
34
35Script::~Script()
36{
37}
38
Jason Sams4d339932010-05-11 14:03:58 -070039void Script::setVar(uint32_t slot, const void *val, uint32_t len)
40{
41 int32_t *destPtr = ((int32_t **)mEnviroment.mFieldAddress)[slot];
42 if (destPtr) {
43 //LOGE("setVar f1 %f", ((const float *)destPtr)[0]);
44 //LOGE("setVar %p %i", destPtr, len);
45 memcpy(destPtr, val, len);
46 //LOGE("setVar f2 %f", ((const float *)destPtr)[0]);
47 } else {
48 LOGE("Calling setVar on slot = %i which is null", slot);
49 }
50}
51
Jason Samsd19f10d2009-05-22 14:03:28 -070052namespace android {
53namespace renderscript {
54
55
Jason Samsd19f10d2009-05-22 14:03:28 -070056void rsi_ScriptBindAllocation(Context * rsc, RsScript vs, RsAllocation va, uint32_t slot)
57{
58 Script *s = static_cast<Script *>(vs);
Jason Sams4d339932010-05-11 14:03:58 -070059 Allocation *a = static_cast<Allocation *>(va);
60 s->mSlots[slot].set(a);
61 //LOGE("rsi_ScriptBindAllocation %i %p %p", slot, a, a->getPtr());
Jason Samsd19f10d2009-05-22 14:03:28 -070062}
63
Jason Sams22534172009-08-04 16:58:20 -070064void rsi_ScriptSetClearColor(Context * rsc, RsScript vs, float r, float g, float b, float a)
65{
66 Script *s = static_cast<Script *>(vs);
67 s->mEnviroment.mClearColor[0] = r;
68 s->mEnviroment.mClearColor[1] = g;
69 s->mEnviroment.mClearColor[2] = b;
70 s->mEnviroment.mClearColor[3] = a;
71}
72
73void rsi_ScriptSetTimeZone(Context * rsc, RsScript vs, const char * timeZone, uint32_t length)
74{
75 Script *s = static_cast<Script *>(vs);
76 s->mEnviroment.mTimeZone = timeZone;
77}
78
79void rsi_ScriptSetClearDepth(Context * rsc, RsScript vs, float v)
80{
81 Script *s = static_cast<Script *>(vs);
82 s->mEnviroment.mClearDepth = v;
83}
84
85void rsi_ScriptSetClearStencil(Context * rsc, RsScript vs, uint32_t v)
86{
87 Script *s = static_cast<Script *>(vs);
88 s->mEnviroment.mClearStencil = v;
89}
Jason Samsd19f10d2009-05-22 14:03:28 -070090
Jason Sams334ea0c2009-08-17 13:56:09 -070091void rsi_ScriptSetType(Context * rsc, RsType vt, uint32_t slot, bool writable, const char *name)
Jason Samsfbf0b9e2009-08-13 12:59:04 -070092{
93 ScriptCState *ss = &rsc->mScriptC;
94 const Type *t = static_cast<const Type *>(vt);
95 ss->mConstantBufferTypes[slot].set(t);
Jason Sams334ea0c2009-08-17 13:56:09 -070096 ss->mSlotWritable[slot] = writable;
Jason Sams4d339932010-05-11 14:03:58 -070097 LOGE("rsi_ScriptSetType");
Jason Samsfbf0b9e2009-08-13 12:59:04 -070098}
99
Jason Samsbe2e8412009-09-16 15:04:38 -0700100void rsi_ScriptSetInvoke(Context *rsc, const char *name, uint32_t slot)
101{
Jason Sams4d339932010-05-11 14:03:58 -0700102 LOGE("rsi_ScriptSetInvoke");
Jason Samsbe2e8412009-09-16 15:04:38 -0700103}
104
Jason Sams4d339932010-05-11 14:03:58 -0700105
Jason Samsbe2e8412009-09-16 15:04:38 -0700106void rsi_ScriptInvoke(Context *rsc, RsScript vs, uint32_t slot)
107{
Jason Sams4d339932010-05-11 14:03:58 -0700108 //LOGE("rsi_ScriptInvoke %i", slot);
Jason Samsbe2e8412009-09-16 15:04:38 -0700109 Script *s = static_cast<Script *>(vs);
Jason Sams4d339932010-05-11 14:03:58 -0700110 if ((slot >= s->mEnviroment.mInvokeFunctionCount) ||
111 (s->mEnviroment.mInvokeFunctions[slot] == NULL)) {
Jason Sams156cce62010-03-03 13:03:18 -0800112 rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
113 return;
114 }
Jason Samse60446b2009-09-24 14:55:38 -0700115 s->setupScript();
Jason Sams4d339932010-05-11 14:03:58 -0700116 //LOGE("invoking %i %p", slot, s->mEnviroment.mInvokeFunctions[slot]);
117 s->mEnviroment.mInvokeFunctions[slot]();
118 //LOGE("invoke finished");
Jason Samsbe2e8412009-09-16 15:04:38 -0700119}
120
121
Jason Sams4d339932010-05-11 14:03:58 -0700122void rsi_ScriptInvokeData(Context *rsc, RsScript vs, uint32_t slot, void *data)
123{
124 //LOGE("rsi_ScriptInvoke %i", slot);
125 Script *s = static_cast<Script *>(vs);
126 if ((slot >= s->mEnviroment.mInvokeFunctionCount) ||
127 (s->mEnviroment.mInvokeFunctions[slot] == NULL)) {
128 rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
129 return;
130 }
131 s->setupScript();
132 //LOGE("invoking %i %p", slot, s->mEnviroment.mInvokeFunctions[slot]);
133 s->mEnviroment.mInvokeFunctions[slot]();
134 //LOGE("invoke finished");
135}
136
137void rsi_ScriptInvokeV(Context *rsc, RsScript vs, uint32_t slot, const void *data, uint32_t len)
138{
139 //LOGE("rsi_ScriptInvoke %i", slot);
140 Script *s = static_cast<Script *>(vs);
141 if ((slot >= s->mEnviroment.mInvokeFunctionCount) ||
142 (s->mEnviroment.mInvokeFunctions[slot] == NULL)) {
143 rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
144 return;
145 }
146 s->setupScript();
147
148 LOGE("rsi_ScriptInvokeV, len=%i", len);
149 const uint32_t * dPtr = (const uint32_t *)data;
150 switch(len) {
151 case 0:
152 s->mEnviroment.mInvokeFunctions[slot]();
153 break;
154 case 4:
155 ((void (*)(uint32_t))
156 s->mEnviroment.mInvokeFunctions[slot])(dPtr[0]);
157 break;
158 case 8:
159 ((void (*)(uint32_t, uint32_t))
160 s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1]);
161 break;
162 case 12:
163 ((void (*)(uint32_t, uint32_t, uint32_t))
164 s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2]);
165 break;
166 case 16:
167 ((void (*)(uint32_t, uint32_t, uint32_t, uint32_t))
168 s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2], dPtr[3]);
169 break;
170 case 20:
171 ((void (*)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t))
172 s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2], dPtr[3], dPtr[4]);
173 break;
174
175
176 }
177
178}
179
Jason Samsfbf0b9e2009-08-13 12:59:04 -0700180void rsi_ScriptSetRoot(Context * rsc, bool isRoot)
181{
Jason Sams4d339932010-05-11 14:03:58 -0700182 LOGE("rsi_ScriptSetRoot");
183}
184
185void rsi_ScriptSetVarI(Context *rsc, RsScript vs, uint32_t slot, int value)
186{
187 Script *s = static_cast<Script *>(vs);
188 s->setVar(slot, &value, sizeof(value));
189}
190
191void rsi_ScriptSetVarF(Context *rsc, RsScript vs, uint32_t slot, float value)
192{
193 Script *s = static_cast<Script *>(vs);
194 s->setVar(slot, &value, sizeof(value));
195}
196
197void rsi_ScriptSetVarV(Context *rsc, RsScript vs, uint32_t slot, const void *data, uint32_t len)
198{
199 const float *fp = (const float *)data;
200 Script *s = static_cast<Script *>(vs);
201 s->setVar(slot, data, len);
Jason Samsfbf0b9e2009-08-13 12:59:04 -0700202}
203
204
Jason Samsd19f10d2009-05-22 14:03:28 -0700205}
206}
207