blob: b0bbb22a95a78c8bb4ed3c1ca1f8ab59ace2d5ba [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_ScriptInvoke(Context *rsc, RsScript vs, uint32_t slot)
101{
Jason Sams4d339932010-05-11 14:03:58 -0700102 //LOGE("rsi_ScriptInvoke %i", slot);
Jason Samsbe2e8412009-09-16 15:04:38 -0700103 Script *s = static_cast<Script *>(vs);
Jason Sams4d339932010-05-11 14:03:58 -0700104 if ((slot >= s->mEnviroment.mInvokeFunctionCount) ||
105 (s->mEnviroment.mInvokeFunctions[slot] == NULL)) {
Jason Sams156cce62010-03-03 13:03:18 -0800106 rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
107 return;
108 }
Jason Samse60446b2009-09-24 14:55:38 -0700109 s->setupScript();
Jason Sams4d339932010-05-11 14:03:58 -0700110 //LOGE("invoking %i %p", slot, s->mEnviroment.mInvokeFunctions[slot]);
111 s->mEnviroment.mInvokeFunctions[slot]();
112 //LOGE("invoke finished");
Jason Samsbe2e8412009-09-16 15:04:38 -0700113}
114
115
Jason Sams4d339932010-05-11 14:03:58 -0700116void rsi_ScriptInvokeData(Context *rsc, RsScript vs, uint32_t slot, void *data)
117{
118 //LOGE("rsi_ScriptInvoke %i", slot);
119 Script *s = static_cast<Script *>(vs);
120 if ((slot >= s->mEnviroment.mInvokeFunctionCount) ||
121 (s->mEnviroment.mInvokeFunctions[slot] == NULL)) {
122 rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
123 return;
124 }
125 s->setupScript();
126 //LOGE("invoking %i %p", slot, s->mEnviroment.mInvokeFunctions[slot]);
127 s->mEnviroment.mInvokeFunctions[slot]();
128 //LOGE("invoke finished");
129}
130
131void rsi_ScriptInvokeV(Context *rsc, RsScript vs, uint32_t slot, const void *data, uint32_t len)
132{
133 //LOGE("rsi_ScriptInvoke %i", slot);
134 Script *s = static_cast<Script *>(vs);
135 if ((slot >= s->mEnviroment.mInvokeFunctionCount) ||
136 (s->mEnviroment.mInvokeFunctions[slot] == NULL)) {
137 rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
138 return;
139 }
140 s->setupScript();
141
Jason Samsf603d212010-05-14 15:30:29 -0700142 //LOGE("rsi_ScriptInvokeV, len=%i", len);
Jason Sams4d339932010-05-11 14:03:58 -0700143 const uint32_t * dPtr = (const uint32_t *)data;
144 switch(len) {
145 case 0:
146 s->mEnviroment.mInvokeFunctions[slot]();
147 break;
148 case 4:
149 ((void (*)(uint32_t))
150 s->mEnviroment.mInvokeFunctions[slot])(dPtr[0]);
151 break;
152 case 8:
153 ((void (*)(uint32_t, uint32_t))
154 s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1]);
155 break;
156 case 12:
157 ((void (*)(uint32_t, uint32_t, uint32_t))
158 s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2]);
159 break;
160 case 16:
161 ((void (*)(uint32_t, uint32_t, uint32_t, uint32_t))
162 s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2], dPtr[3]);
163 break;
164 case 20:
165 ((void (*)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t))
166 s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2], dPtr[3], dPtr[4]);
167 break;
168
169
170 }
171
172}
173
Jason Sams4d339932010-05-11 14:03:58 -0700174void rsi_ScriptSetVarI(Context *rsc, RsScript vs, uint32_t slot, int value)
175{
176 Script *s = static_cast<Script *>(vs);
177 s->setVar(slot, &value, sizeof(value));
178}
179
180void rsi_ScriptSetVarF(Context *rsc, RsScript vs, uint32_t slot, float value)
181{
182 Script *s = static_cast<Script *>(vs);
183 s->setVar(slot, &value, sizeof(value));
184}
185
186void rsi_ScriptSetVarV(Context *rsc, RsScript vs, uint32_t slot, const void *data, uint32_t len)
187{
188 const float *fp = (const float *)data;
189 Script *s = static_cast<Script *>(vs);
190 s->setVar(slot, data, len);
Jason Samsfbf0b9e2009-08-13 12:59:04 -0700191}
192
193
Jason Samsd19f10d2009-05-22 14:03:28 -0700194}
195}
196