blob: 7e4a24750a52f547e780299fc2c3ae288745478b [file] [log] [blame]
Jason Samsc97bb882009-07-20 14:31:06 -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#include "rsScriptC.h"
19#include "rsMatrix.h"
20
Joe Onorato3370ec92009-08-09 11:39:02 -070021#include "utils/Timers.h"
Jason Samsc97bb882009-07-20 14:31:06 -070022
Romain Guy584a3752009-07-30 18:45:01 -070023#include <time.h>
Romain Guy584a3752009-07-30 18:45:01 -070024
Jason Samsc97bb882009-07-20 14:31:06 -070025using namespace android;
26using namespace android::renderscript;
27
28#define GET_TLS() Context::ScriptTLSStruct * tls = \
29 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
30 Context * rsc = tls->mContext; \
31 ScriptC * sc = (ScriptC *) tls->mScript
32
Jason Sams4d339932010-05-11 14:03:58 -070033
Jason Samsc97bb882009-07-20 14:31:06 -070034//////////////////////////////////////////////////////////////////////////////
35// Math routines
36//////////////////////////////////////////////////////////////////////////////
37
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080038static float SC_sinf_fast(float x) {
Romain Guycac80a62009-08-18 11:39:17 -070039 const float A = 1.0f / (2.0f * M_PI);
40 const float B = -16.0f;
41 const float C = 8.0f;
Jason Samsea84a7c2009-09-04 14:42:41 -070042
Romain Guycac80a62009-08-18 11:39:17 -070043 // scale angle for easy argument reduction
44 x *= A;
Jason Samsea84a7c2009-09-04 14:42:41 -070045
Romain Guycac80a62009-08-18 11:39:17 -070046 if (fabsf(x) >= 0.5f) {
47 // argument reduction
48 x = x - ceilf(x + 0.5f) + 1.0f;
49 }
Jason Samsea84a7c2009-09-04 14:42:41 -070050
Romain Guycac80a62009-08-18 11:39:17 -070051 const float y = B * x * fabsf(x) + C * x;
52 return 0.2215f * (y * fabsf(y) - y) + y;
53}
54
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080055static float SC_cosf_fast(float x) {
Romain Guycac80a62009-08-18 11:39:17 -070056 x += float(M_PI / 2);
57
58 const float A = 1.0f / (2.0f * M_PI);
59 const float B = -16.0f;
60 const float C = 8.0f;
Jason Samsea84a7c2009-09-04 14:42:41 -070061
Romain Guycac80a62009-08-18 11:39:17 -070062 // scale angle for easy argument reduction
63 x *= A;
Jason Samsea84a7c2009-09-04 14:42:41 -070064
Romain Guycac80a62009-08-18 11:39:17 -070065 if (fabsf(x) >= 0.5f) {
66 // argument reduction
67 x = x - ceilf(x + 0.5f) + 1.0f;
68 }
Jason Samsea84a7c2009-09-04 14:42:41 -070069
Romain Guycac80a62009-08-18 11:39:17 -070070 const float y = B * x * fabsf(x) + C * x;
71 return 0.2215f * (y * fabsf(y) - y) + y;
72}
73
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080074static float SC_randf(float max) {
Jason Samsc97bb882009-07-20 14:31:06 -070075 float r = (float)rand();
76 return r / RAND_MAX * max;
77}
78
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080079static float SC_randf2(float min, float max) {
Romain Guy8839ca52009-07-31 11:20:59 -070080 float r = (float)rand();
81 return r / RAND_MAX * (max - min) + min;
82}
83
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080084static int SC_randi(int max) {
Jason Samsd79b2e92010-05-19 17:22:57 -070085 return (int)SC_randf(max);
86}
87
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080088static int SC_randi2(int min, int max) {
Jason Samsd79b2e92010-05-19 17:22:57 -070089 return (int)SC_randf2(min, max);
90}
91
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080092static float SC_frac(float v) {
Jason Sams4d339932010-05-11 14:03:58 -070093 int i = (int)floor(v);
94 return fmin(v - i, 0x1.fffffep-1f);
95}
96
Romain Guy584a3752009-07-30 18:45:01 -070097//////////////////////////////////////////////////////////////////////////////
98// Time routines
99//////////////////////////////////////////////////////////////////////////////
Jason Samsc97bb882009-07-20 14:31:06 -0700100
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800101static int32_t SC_second() {
Romain Guy584a3752009-07-30 18:45:01 -0700102 GET_TLS();
103
104 time_t rawtime;
105 time(&rawtime);
106
Romain Guybaed7272009-11-11 15:36:06 -0800107 struct tm *timeinfo;
108 timeinfo = localtime(&rawtime);
109 return timeinfo->tm_sec;
Romain Guy584a3752009-07-30 18:45:01 -0700110}
111
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800112static int32_t SC_minute() {
Romain Guy584a3752009-07-30 18:45:01 -0700113 GET_TLS();
Jason Sams1bada8c2009-08-09 17:01:55 -0700114
Romain Guy584a3752009-07-30 18:45:01 -0700115 time_t rawtime;
116 time(&rawtime);
Jason Sams1bada8c2009-08-09 17:01:55 -0700117
Romain Guybaed7272009-11-11 15:36:06 -0800118 struct tm *timeinfo;
119 timeinfo = localtime(&rawtime);
120 return timeinfo->tm_min;
Jason Sams1bada8c2009-08-09 17:01:55 -0700121}
Romain Guy584a3752009-07-30 18:45:01 -0700122
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800123static int32_t SC_hour() {
Romain Guy584a3752009-07-30 18:45:01 -0700124 GET_TLS();
Jason Sams1bada8c2009-08-09 17:01:55 -0700125
Romain Guy584a3752009-07-30 18:45:01 -0700126 time_t rawtime;
127 time(&rawtime);
Jason Sams1bada8c2009-08-09 17:01:55 -0700128
Romain Guybaed7272009-11-11 15:36:06 -0800129 struct tm *timeinfo;
130 timeinfo = localtime(&rawtime);
131 return timeinfo->tm_hour;
Romain Guy8839ca52009-07-31 11:20:59 -0700132}
133
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800134static int32_t SC_day() {
Romain Guy8839ca52009-07-31 11:20:59 -0700135 GET_TLS();
Jason Sams1bada8c2009-08-09 17:01:55 -0700136
Romain Guy8839ca52009-07-31 11:20:59 -0700137 time_t rawtime;
138 time(&rawtime);
Jason Sams1bada8c2009-08-09 17:01:55 -0700139
Romain Guybaed7272009-11-11 15:36:06 -0800140 struct tm *timeinfo;
141 timeinfo = localtime(&rawtime);
142 return timeinfo->tm_mday;
Jason Sams1bada8c2009-08-09 17:01:55 -0700143}
Jason Samsc97bb882009-07-20 14:31:06 -0700144
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800145static int32_t SC_month() {
Romain Guy8839ca52009-07-31 11:20:59 -0700146 GET_TLS();
Jason Sams1bada8c2009-08-09 17:01:55 -0700147
Romain Guy8839ca52009-07-31 11:20:59 -0700148 time_t rawtime;
149 time(&rawtime);
Jason Sams1bada8c2009-08-09 17:01:55 -0700150
Romain Guybaed7272009-11-11 15:36:06 -0800151 struct tm *timeinfo;
152 timeinfo = localtime(&rawtime);
153 return timeinfo->tm_mon;
Jason Sams1bada8c2009-08-09 17:01:55 -0700154}
Romain Guy8839ca52009-07-31 11:20:59 -0700155
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800156static int32_t SC_year() {
Romain Guy8839ca52009-07-31 11:20:59 -0700157 GET_TLS();
Jason Sams1bada8c2009-08-09 17:01:55 -0700158
Romain Guy8839ca52009-07-31 11:20:59 -0700159 time_t rawtime;
160 time(&rawtime);
Jason Sams1bada8c2009-08-09 17:01:55 -0700161
Romain Guybaed7272009-11-11 15:36:06 -0800162 struct tm *timeinfo;
163 timeinfo = localtime(&rawtime);
164 return timeinfo->tm_year;
Romain Guy8839ca52009-07-31 11:20:59 -0700165}
166
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800167static int64_t SC_uptimeMillis() {
Jason Samsd79b2e92010-05-19 17:22:57 -0700168 return nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
169}
170
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800171static int64_t SC_uptimeNanos() {
Jason Samsf0690c42010-07-29 17:31:14 -0700172 return systemTime(SYSTEM_TIME_MONOTONIC);
Jason Samsd79b2e92010-05-19 17:22:57 -0700173}
174
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800175static float SC_getDt() {
Joe Onorato3370ec92009-08-09 11:39:02 -0700176 GET_TLS();
Jason Sams17966512010-07-28 11:17:53 -0700177 int64_t l = sc->mEnviroment.mLastDtTime;
178 sc->mEnviroment.mLastDtTime = systemTime(SYSTEM_TIME_MONOTONIC);
179 return ((float)(sc->mEnviroment.mLastDtTime - l)) / 1.0e9;
Jason Samsc97bb882009-07-20 14:31:06 -0700180}
181
Jason Samsc97bb882009-07-20 14:31:06 -0700182//////////////////////////////////////////////////////////////////////////////
183//
184//////////////////////////////////////////////////////////////////////////////
185
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800186static uint32_t SC_allocGetDimX(RsAllocation va) {
Jason Sams4d339932010-05-11 14:03:58 -0700187 const Allocation *a = static_cast<const Allocation *>(va);
Jason Samsf166d9b2010-09-30 18:15:52 -0700188 CHECK_OBJ(a);
189 //LOGE("SC_allocGetDimX a=%p type=%p", a, a->getType());
Jason Sams4d339932010-05-11 14:03:58 -0700190 return a->getType()->getDimX();
191}
192
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800193static uint32_t SC_allocGetDimY(RsAllocation va) {
Jason Sams4d339932010-05-11 14:03:58 -0700194 const Allocation *a = static_cast<const Allocation *>(va);
Jason Samsf166d9b2010-09-30 18:15:52 -0700195 CHECK_OBJ(a);
Jason Sams4d339932010-05-11 14:03:58 -0700196 return a->getType()->getDimY();
197}
198
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800199static uint32_t SC_allocGetDimZ(RsAllocation va) {
Jason Sams4d339932010-05-11 14:03:58 -0700200 const Allocation *a = static_cast<const Allocation *>(va);
Jason Samsf166d9b2010-09-30 18:15:52 -0700201 CHECK_OBJ(a);
Jason Sams4d339932010-05-11 14:03:58 -0700202 return a->getType()->getDimZ();
203}
204
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800205static uint32_t SC_allocGetDimLOD(RsAllocation va) {
Jason Sams4d339932010-05-11 14:03:58 -0700206 const Allocation *a = static_cast<const Allocation *>(va);
Jason Samsf166d9b2010-09-30 18:15:52 -0700207 CHECK_OBJ(a);
Jason Sams4d339932010-05-11 14:03:58 -0700208 return a->getType()->getDimLOD();
209}
210
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800211static uint32_t SC_allocGetDimFaces(RsAllocation va) {
Jason Sams4d339932010-05-11 14:03:58 -0700212 const Allocation *a = static_cast<const Allocation *>(va);
Jason Samsf166d9b2010-09-30 18:15:52 -0700213 CHECK_OBJ(a);
Jason Sams4d339932010-05-11 14:03:58 -0700214 return a->getType()->getDimFaces();
215}
216
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800217static const void * SC_getElementAtX(RsAllocation va, uint32_t x) {
Jason Sams8e6c17f2010-07-19 15:38:19 -0700218 const Allocation *a = static_cast<const Allocation *>(va);
Jason Samsf166d9b2010-09-30 18:15:52 -0700219 CHECK_OBJ(a);
Jason Sams8e6c17f2010-07-19 15:38:19 -0700220 const Type *t = a->getType();
Jason Samsf166d9b2010-09-30 18:15:52 -0700221 CHECK_OBJ(t);
Jason Sams8e6c17f2010-07-19 15:38:19 -0700222 const uint8_t *p = (const uint8_t *)a->getPtr();
223 return &p[t->getElementSizeBytes() * x];
224}
225
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800226static const void * SC_getElementAtXY(RsAllocation va, uint32_t x, uint32_t y) {
Jason Sams8e6c17f2010-07-19 15:38:19 -0700227 const Allocation *a = static_cast<const Allocation *>(va);
Jason Samsf166d9b2010-09-30 18:15:52 -0700228 CHECK_OBJ(a);
Jason Sams8e6c17f2010-07-19 15:38:19 -0700229 const Type *t = a->getType();
Jason Samsf166d9b2010-09-30 18:15:52 -0700230 CHECK_OBJ(t);
Jason Sams8e6c17f2010-07-19 15:38:19 -0700231 const uint8_t *p = (const uint8_t *)a->getPtr();
232 return &p[t->getElementSizeBytes() * (x + y*t->getDimX())];
233}
234
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800235static const void * SC_getElementAtXYZ(RsAllocation va, uint32_t x, uint32_t y, uint32_t z) {
Jason Sams8e6c17f2010-07-19 15:38:19 -0700236 const Allocation *a = static_cast<const Allocation *>(va);
Jason Samsf166d9b2010-09-30 18:15:52 -0700237 CHECK_OBJ(a);
Jason Sams8e6c17f2010-07-19 15:38:19 -0700238 const Type *t = a->getType();
Jason Samsf166d9b2010-09-30 18:15:52 -0700239 CHECK_OBJ(t);
Jason Sams8e6c17f2010-07-19 15:38:19 -0700240 const uint8_t *p = (const uint8_t *)a->getPtr();
241 return &p[t->getElementSizeBytes() * (x + y*t->getDimX())];
242}
Jason Sams4d339932010-05-11 14:03:58 -0700243
Jason Sams02f62aa2010-08-16 12:41:48 -0700244static void SC_setObject(void **vdst, void * vsrc) {
Jason Sams4fd8bb42010-09-17 13:17:17 -0700245 //LOGE("SC_setObject %p,%p %p", vdst, *vdst, vsrc);
246 if (vsrc) {
Jason Samsf166d9b2010-09-30 18:15:52 -0700247 CHECK_OBJ(vsrc);
Jason Sams4fd8bb42010-09-17 13:17:17 -0700248 static_cast<ObjectBase *>(vsrc)->incSysRef();
249 }
250 if (vdst[0]) {
Jason Samsf166d9b2010-09-30 18:15:52 -0700251 CHECK_OBJ(vdst[0]);
Jason Sams4fd8bb42010-09-17 13:17:17 -0700252 static_cast<ObjectBase *>(vdst[0])->decSysRef();
253 }
Jason Sams02f62aa2010-08-16 12:41:48 -0700254 *vdst = vsrc;
Jason Sams4fd8bb42010-09-17 13:17:17 -0700255 //LOGE("SC_setObject *");
Jason Sams02f62aa2010-08-16 12:41:48 -0700256}
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800257
Jason Sams02f62aa2010-08-16 12:41:48 -0700258static void SC_clearObject(void **vdst) {
Jason Sams4fd8bb42010-09-17 13:17:17 -0700259 //LOGE("SC_clearObject %p,%p", vdst, *vdst);
260 if (vdst[0]) {
Jason Samsf166d9b2010-09-30 18:15:52 -0700261 CHECK_OBJ(vdst[0]);
Jason Sams4fd8bb42010-09-17 13:17:17 -0700262 static_cast<ObjectBase *>(vdst[0])->decSysRef();
263 }
Jason Sams02f62aa2010-08-16 12:41:48 -0700264 *vdst = NULL;
Jason Sams4fd8bb42010-09-17 13:17:17 -0700265 //LOGE("SC_clearObject *");
Jason Sams02f62aa2010-08-16 12:41:48 -0700266}
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800267
Jason Sams02f62aa2010-08-16 12:41:48 -0700268static bool SC_isObject(RsAllocation vsrc) {
269 return vsrc != NULL;
270}
271
Jason Samsd79b2e92010-05-19 17:22:57 -0700272static void SC_debugF(const char *s, float f) {
273 LOGE("%s %f, 0x%08x", s, f, *((int *) (&f)));
Jason Samsb0ec1b42009-07-28 12:02:16 -0700274}
Jason Samsd64188a2010-08-06 16:22:50 -0700275static void SC_debugFv2(const char *s, float f1, float f2) {
276 LOGE("%s {%f, %f}", s, f1, f2);
Romain Guyd22fff72009-08-20 17:08:33 -0700277}
Jason Samsd64188a2010-08-06 16:22:50 -0700278static void SC_debugFv3(const char *s, float f1, float f2, float f3) {
279 LOGE("%s {%f, %f, %f}", s, f1, f2, f3);
Jason Samsb0ec1b42009-07-28 12:02:16 -0700280}
Jason Samsd64188a2010-08-06 16:22:50 -0700281static void SC_debugFv4(const char *s, float f1, float f2, float f3, float f4) {
282 LOGE("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
Jason Samsd79b2e92010-05-19 17:22:57 -0700283}
Stephen Hines65688962010-10-15 12:47:49 -0700284static void SC_debugD(const char *s, double d) {
285 LOGE("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
286}
Jason Samsd64188a2010-08-06 16:22:50 -0700287static void SC_debugFM4v4(const char *s, const float *f) {
288 LOGE("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
289 LOGE("%s %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
290 LOGE("%s %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
291 LOGE("%s %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
292}
293static void SC_debugFM3v3(const char *s, const float *f) {
294 LOGE("%s {%f, %f, %f", s, f[0], f[3], f[6]);
295 LOGE("%s %f, %f, %f", s, f[1], f[4], f[7]);
296 LOGE("%s %f, %f, %f}",s, f[2], f[5], f[8]);
297}
298static void SC_debugFM2v2(const char *s, const float *f) {
299 LOGE("%s {%f, %f", s, f[0], f[2]);
300 LOGE("%s %f, %f}",s, f[1], f[3]);
301}
302
Jason Samsd79b2e92010-05-19 17:22:57 -0700303static void SC_debugI32(const char *s, int32_t i) {
304 LOGE("%s %i 0x%x", s, i, i);
Romain Guyd22fff72009-08-20 17:08:33 -0700305}
Jason Sams17966512010-07-28 11:17:53 -0700306static void SC_debugU32(const char *s, uint32_t i) {
Stephen Hines65688962010-10-15 12:47:49 -0700307 LOGE("%s %u 0x%x", s, i, i);
308}
309static void SC_debugLL64(const char *s, long long ll) {
310 LOGE("%s %lld 0x%llx", s, ll, ll);
311}
312static void SC_debugULL64(const char *s, unsigned long long ll) {
313 LOGE("%s %llu 0x%llx", s, ll, ll);
Jason Sams17966512010-07-28 11:17:53 -0700314}
Romain Guyd22fff72009-08-20 17:08:33 -0700315
Jason Sams8e6c17f2010-07-19 15:38:19 -0700316static void SC_debugP(const char *s, const void *p) {
317 LOGE("%s %p", s, p);
318}
319
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800320static uint32_t SC_toClient2(int cmdID, void *data, int len) {
Jason Sams516c3192009-10-06 13:58:47 -0700321 GET_TLS();
Jason Sams17966512010-07-28 11:17:53 -0700322 //LOGE("SC_toClient %i %i %i", cmdID, len);
Jason Sams1c415172010-11-08 17:06:46 -0800323 return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, false);
Jason Sams516c3192009-10-06 13:58:47 -0700324}
325
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800326static uint32_t SC_toClient(int cmdID) {
Jason Samsbd2197f2009-10-07 18:14:01 -0700327 GET_TLS();
Jason Sams17966512010-07-28 11:17:53 -0700328 //LOGE("SC_toClient %i", cmdID);
Jason Sams1c415172010-11-08 17:06:46 -0800329 return rsc->sendMessageToClient(NULL, RS_MESSAGE_TO_CLIENT_USER, cmdID, 0, false);
Jason Sams17966512010-07-28 11:17:53 -0700330}
331
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800332static uint32_t SC_toClientBlocking2(int cmdID, void *data, int len) {
Jason Sams17966512010-07-28 11:17:53 -0700333 GET_TLS();
334 //LOGE("SC_toClientBlocking %i %i", cmdID, len);
Jason Sams1c415172010-11-08 17:06:46 -0800335 return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, true);
Jason Sams17966512010-07-28 11:17:53 -0700336}
337
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800338static uint32_t SC_toClientBlocking(int cmdID) {
Jason Sams17966512010-07-28 11:17:53 -0700339 GET_TLS();
340 //LOGE("SC_toClientBlocking %i", cmdID);
Jason Sams1c415172010-11-08 17:06:46 -0800341 return rsc->sendMessageToClient(NULL, RS_MESSAGE_TO_CLIENT_USER, cmdID, 0, true);
Jason Samsbd2197f2009-10-07 18:14:01 -0700342}
343
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800344int SC_divsi3(int a, int b) {
Jason Sams4d339932010-05-11 14:03:58 -0700345 return a / b;
346}
Jason Samsbd2197f2009-10-07 18:14:01 -0700347
Bryan Mawhinneyc0aaccc2010-11-11 14:33:12 +0000348int SC_modsi3(int a, int b) {
349 return a % b;
350}
351
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800352int SC_getAllocation(const void *ptr) {
Jason Sams1de0b872010-05-17 14:55:34 -0700353 GET_TLS();
354 const Allocation *alloc = sc->ptrToAllocation(ptr);
355 return (int)alloc;
356}
357
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800358void SC_allocationMarkDirty(RsAllocation a) {
Alex Sakhartchouk8e954662010-09-01 16:34:48 -0700359 Allocation *alloc = static_cast<Allocation *>(a);
360 alloc->sendDirty();
361}
Jason Sams1de0b872010-05-17 14:55:34 -0700362
Jason Sams8f8a5722010-07-15 17:11:13 -0700363void SC_ForEach(RsScript vs,
364 RsAllocation vin,
365 RsAllocation vout,
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800366 const void *usr) {
Jason Samsf17bccc2010-05-28 18:23:22 -0700367 GET_TLS();
Jason Sams8f8a5722010-07-15 17:11:13 -0700368 const Allocation *ain = static_cast<const Allocation *>(vin);
Jason Samsf17bccc2010-05-28 18:23:22 -0700369 Allocation *aout = static_cast<Allocation *>(vout);
Jason Sams8f8a5722010-07-15 17:11:13 -0700370 Script *s = static_cast<Script *>(vs);
371 s->runForEach(rsc, ain, aout, usr);
Jason Samsf17bccc2010-05-28 18:23:22 -0700372}
373
Jason Sams8f8a5722010-07-15 17:11:13 -0700374void SC_ForEach2(RsScript vs,
375 RsAllocation vin,
376 RsAllocation vout,
377 const void *usr,
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800378 const RsScriptCall *call) {
Jason Samsf17bccc2010-05-28 18:23:22 -0700379 GET_TLS();
Jason Sams8f8a5722010-07-15 17:11:13 -0700380 const Allocation *ain = static_cast<const Allocation *>(vin);
Jason Samsf17bccc2010-05-28 18:23:22 -0700381 Allocation *aout = static_cast<Allocation *>(vout);
Jason Samsf17bccc2010-05-28 18:23:22 -0700382 Script *s = static_cast<Script *>(vs);
Jason Sams8f8a5722010-07-15 17:11:13 -0700383 s->runForEach(rsc, ain, aout, usr, call);
Jason Samsf17bccc2010-05-28 18:23:22 -0700384}
385
Jason Samsc97bb882009-07-20 14:31:06 -0700386//////////////////////////////////////////////////////////////////////////////
387// Class implementation
388//////////////////////////////////////////////////////////////////////////////
389
Jason Sams4d339932010-05-11 14:03:58 -0700390// llvm name mangling ref
391// <builtin-type> ::= v # void
392// ::= b # bool
393// ::= c # char
394// ::= a # signed char
395// ::= h # unsigned char
396// ::= s # short
397// ::= t # unsigned short
398// ::= i # int
399// ::= j # unsigned int
400// ::= l # long
401// ::= m # unsigned long
402// ::= x # long long, __int64
403// ::= y # unsigned long long, __int64
404// ::= f # float
405// ::= d # double
Jason Samsc97bb882009-07-20 14:31:06 -0700406
Jason Sams536923d2010-05-18 13:35:45 -0700407static ScriptCState::SymbolTable_t gSyms[] = {
Jason Sams8f0adba2010-11-01 14:26:30 -0700408 { "__divsi3", (void *)&SC_divsi3, true },
Bryan Mawhinneyc0aaccc2010-11-11 14:33:12 +0000409 { "__modsi3", (void *)&SC_modsi3, true },
Jason Sams4d339932010-05-11 14:03:58 -0700410
Jason Samsd79b2e92010-05-19 17:22:57 -0700411 // allocation
Jason Sams8f0adba2010-11-01 14:26:30 -0700412 { "_Z19rsAllocationGetDimX13rs_allocation", (void *)&SC_allocGetDimX, true },
413 { "_Z19rsAllocationGetDimY13rs_allocation", (void *)&SC_allocGetDimY, true },
414 { "_Z19rsAllocationGetDimZ13rs_allocation", (void *)&SC_allocGetDimZ, true },
415 { "_Z21rsAllocationGetDimLOD13rs_allocation", (void *)&SC_allocGetDimLOD, true },
416 { "_Z23rsAllocationGetDimFaces13rs_allocation", (void *)&SC_allocGetDimFaces, true },
417 { "_Z15rsGetAllocationPKv", (void *)&SC_getAllocation, true },
Jason Samsd79b2e92010-05-19 17:22:57 -0700418
Jason Sams8f0adba2010-11-01 14:26:30 -0700419 { "_Z14rsGetElementAt13rs_allocationj", (void *)&SC_getElementAtX, true },
420 { "_Z14rsGetElementAt13rs_allocationjj", (void *)&SC_getElementAtXY, true },
421 { "_Z14rsGetElementAt13rs_allocationjjj", (void *)&SC_getElementAtXYZ, true },
Jason Sams8e6c17f2010-07-19 15:38:19 -0700422
Jason Sams8f0adba2010-11-01 14:26:30 -0700423 { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_setObject, true },
424 { "_Z13rsClearObjectP10rs_element", (void *)&SC_clearObject, true },
425 { "_Z10rsIsObject10rs_element", (void *)&SC_isObject, true },
Jason Sams4fd8bb42010-09-17 13:17:17 -0700426
Jason Sams8f0adba2010-11-01 14:26:30 -0700427 { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_setObject, true },
428 { "_Z13rsClearObjectP7rs_type", (void *)&SC_clearObject, true },
429 { "_Z10rsIsObject7rs_type", (void *)&SC_isObject, true },
Jason Sams4fd8bb42010-09-17 13:17:17 -0700430
Jason Sams8f0adba2010-11-01 14:26:30 -0700431 { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_setObject, true },
432 { "_Z13rsClearObjectP13rs_allocation", (void *)&SC_clearObject, true },
433 { "_Z10rsIsObject13rs_allocation", (void *)&SC_isObject, true },
Jason Sams02f62aa2010-08-16 12:41:48 -0700434
Jason Sams8f0adba2010-11-01 14:26:30 -0700435 { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_setObject, true },
436 { "_Z13rsClearObjectP10rs_sampler", (void *)&SC_clearObject, true },
437 { "_Z10rsIsObject10rs_sampler", (void *)&SC_isObject, true },
Jason Sams4fd8bb42010-09-17 13:17:17 -0700438
Jason Sams8f0adba2010-11-01 14:26:30 -0700439 { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_setObject, true },
440 { "_Z13rsClearObjectP9rs_script", (void *)&SC_clearObject, true },
441 { "_Z10rsIsObject9rs_script", (void *)&SC_isObject, true },
Jason Sams4fd8bb42010-09-17 13:17:17 -0700442
Jason Sams8f0adba2010-11-01 14:26:30 -0700443 { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_setObject, true },
444 { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_clearObject, true },
445 { "_Z10rsIsObject7rs_mesh", (void *)&SC_isObject, true },
Jason Sams4fd8bb42010-09-17 13:17:17 -0700446
Jason Sams8f0adba2010-11-01 14:26:30 -0700447 { "_Z11rsSetObjectP19rs_program_fragmentS_", (void *)&SC_setObject, true },
448 { "_Z13rsClearObjectP19rs_program_fragment", (void *)&SC_clearObject, true },
449 { "_Z10rsIsObject19rs_program_fragment", (void *)&SC_isObject, true },
Jason Sams4fd8bb42010-09-17 13:17:17 -0700450
Jason Sams8f0adba2010-11-01 14:26:30 -0700451 { "_Z11rsSetObjectP17rs_program_vertexS_", (void *)&SC_setObject, true },
452 { "_Z13rsClearObjectP17rs_program_vertex", (void *)&SC_clearObject, true },
453 { "_Z10rsIsObject17rs_program_vertex", (void *)&SC_isObject, true },
Jason Sams4fd8bb42010-09-17 13:17:17 -0700454
Jason Sams8f0adba2010-11-01 14:26:30 -0700455 { "_Z11rsSetObjectP17rs_program_rasterS_", (void *)&SC_setObject, true },
456 { "_Z13rsClearObjectP17rs_program_raster", (void *)&SC_clearObject, true },
457 { "_Z10rsIsObject17rs_program_raster", (void *)&SC_isObject, true },
Jason Sams4fd8bb42010-09-17 13:17:17 -0700458
Jason Sams8f0adba2010-11-01 14:26:30 -0700459 { "_Z11rsSetObjectP16rs_program_storeS_", (void *)&SC_setObject, true },
460 { "_Z13rsClearObjectP16rs_program_store", (void *)&SC_clearObject, true },
461 { "_Z10rsIsObject16rs_program_store", (void *)&SC_isObject, true },
Jason Sams4fd8bb42010-09-17 13:17:17 -0700462
Jason Sams8f0adba2010-11-01 14:26:30 -0700463 { "_Z11rsSetObjectP7rs_fontS_", (void *)&SC_setObject, true },
464 { "_Z13rsClearObjectP7rs_font", (void *)&SC_clearObject, true },
465 { "_Z10rsIsObject7rs_font", (void *)&SC_isObject, true },
Jason Sams4fd8bb42010-09-17 13:17:17 -0700466
467
Jason Sams8f0adba2010-11-01 14:26:30 -0700468 { "_Z21rsAllocationMarkDirty13rs_allocation", (void *)&SC_allocationMarkDirty, true },
Alex Sakhartchouk8e954662010-09-01 16:34:48 -0700469
Jason Sams02f62aa2010-08-16 12:41:48 -0700470
Jason Samsd79b2e92010-05-19 17:22:57 -0700471 // Debug
Jason Sams8f0adba2010-11-01 14:26:30 -0700472 { "_Z7rsDebugPKcf", (void *)&SC_debugF, true },
473 { "_Z7rsDebugPKcff", (void *)&SC_debugFv2, true },
474 { "_Z7rsDebugPKcfff", (void *)&SC_debugFv3, true },
475 { "_Z7rsDebugPKcffff", (void *)&SC_debugFv4, true },
476 { "_Z7rsDebugPKcd", (void *)&SC_debugD, true },
477 { "_Z7rsDebugPKcPK12rs_matrix4x4", (void *)&SC_debugFM4v4, true },
478 { "_Z7rsDebugPKcPK12rs_matrix3x3", (void *)&SC_debugFM3v3, true },
479 { "_Z7rsDebugPKcPK12rs_matrix2x2", (void *)&SC_debugFM2v2, true },
480 { "_Z7rsDebugPKci", (void *)&SC_debugI32, true },
481 { "_Z7rsDebugPKcj", (void *)&SC_debugU32, true },
Stephen Hines65688962010-10-15 12:47:49 -0700482 // Both "long" and "unsigned long" need to be redirected to their
483 // 64-bit counterparts, since we have hacked Slang to use 64-bit
484 // for "long" on Arm (to be similar to Java).
Jason Sams8f0adba2010-11-01 14:26:30 -0700485 { "_Z7rsDebugPKcl", (void *)&SC_debugLL64, true },
486 { "_Z7rsDebugPKcm", (void *)&SC_debugULL64, true },
487 { "_Z7rsDebugPKcx", (void *)&SC_debugLL64, true },
488 { "_Z7rsDebugPKcy", (void *)&SC_debugULL64, true },
489 { "_Z7rsDebugPKcPKv", (void *)&SC_debugP, true },
Jason Samsd79b2e92010-05-19 17:22:57 -0700490
491 // RS Math
Jason Sams8f0adba2010-11-01 14:26:30 -0700492 { "_Z6rsRandi", (void *)&SC_randi, true },
493 { "_Z6rsRandii", (void *)&SC_randi2, true },
494 { "_Z6rsRandf", (void *)&SC_randf, true },
495 { "_Z6rsRandff", (void *)&SC_randf2, true },
496 { "_Z6rsFracf", (void *)&SC_frac, true },
Jason Samsd79b2e92010-05-19 17:22:57 -0700497
498 // time
Jason Sams8f0adba2010-11-01 14:26:30 -0700499 { "_Z8rsSecondv", (void *)&SC_second, true },
500 { "_Z8rsMinutev", (void *)&SC_minute, true },
501 { "_Z6rsHourv", (void *)&SC_hour, true },
502 { "_Z5rsDayv", (void *)&SC_day, true },
503 { "_Z7rsMonthv", (void *)&SC_month, true },
504 { "_Z6rsYearv", (void *)&SC_year, true },
505 { "_Z14rsUptimeMillisv", (void*)&SC_uptimeMillis, true },
506 { "_Z13rsUptimeNanosv", (void*)&SC_uptimeNanos, true },
507 { "_Z7rsGetDtv", (void*)&SC_getDt, false },
Jason Samsd79b2e92010-05-19 17:22:57 -0700508
Jason Sams8f0adba2010-11-01 14:26:30 -0700509 { "_Z14rsSendToClienti", (void *)&SC_toClient, false },
510 { "_Z14rsSendToClientiPKvj", (void *)&SC_toClient2, false },
511 { "_Z22rsSendToClientBlockingi", (void *)&SC_toClientBlocking, false },
512 { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_toClientBlocking2, false },
Jason Samsd79b2e92010-05-19 17:22:57 -0700513
Jason Sams8f0adba2010-11-01 14:26:30 -0700514 { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach, false },
515 //{ "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach2, true },
Jason Samsd79b2e92010-05-19 17:22:57 -0700516
517////////////////////////////////////////////////////////////////////
518
Jason Sams8f0adba2010-11-01 14:26:30 -0700519 //{ "sinf_fast", (void *)&SC_sinf_fast, true },
520 //{ "cosf_fast", (void *)&SC_cosf_fast, true },
Jason Samsc97bb882009-07-20 14:31:06 -0700521
Jason Sams8f0adba2010-11-01 14:26:30 -0700522 { NULL, NULL, false }
Jason Samsc97bb882009-07-20 14:31:06 -0700523};
524
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800525const ScriptCState::SymbolTable_t * ScriptCState::lookupSymbol(const char *sym) {
Jason Samsc97bb882009-07-20 14:31:06 -0700526 ScriptCState::SymbolTable_t *syms = gSyms;
527
528 while (syms->mPtr) {
529 if (!strcmp(syms->mName, sym)) {
530 return syms;
531 }
532 syms++;
533 }
534 return NULL;
535}