rsScriptC_Lib.cpp revision 711e7316c7bc274dd0ee9e4f3f043a85c1a706a8
1e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams/*
2e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * Copyright (C) 2009 The Android Open Source Project
3e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams *
4e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * you may not use this file except in compliance with the License.
6e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * You may obtain a copy of the License at
7e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams *
8e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams *
10e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * Unless required by applicable law or agreed to in writing, software
11e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * See the License for the specific language governing permissions and
14e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * limitations under the License.
15e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams */
16e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
17e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams#include "rsContext.h"
18e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams#include "rsScriptC.h"
19e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams#include "rsMatrix.h"
20e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
219c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato#include "utils/Timers.h"
22e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
2398e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy#include <time.h>
2498e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy
25e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Samsusing namespace android;
26e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Samsusing namespace android::renderscript;
27e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
28e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams#define GET_TLS()  Context::ScriptTLSStruct * tls = \
29e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
30e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    Context * rsc = tls->mContext; \
31e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    ScriptC * sc = (ScriptC *) tls->mScript
32e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
33a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
34e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
35e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams// Math routines
36e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
37e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
38afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic float SC_sinf_fast(float x) {
392275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float A =   1.0f / (2.0f * M_PI);
402275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float B = -16.0f;
412275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float C =   8.0f;
42a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
432275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    // scale angle for easy argument reduction
442275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    x *= A;
45a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
462275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    if (fabsf(x) >= 0.5f) {
472275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        // argument reduction
482275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        x = x - ceilf(x + 0.5f) + 1.0f;
492275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    }
50a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
512275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float y = B * x * fabsf(x) + C * x;
522275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    return 0.2215f * (y * fabsf(y) - y) + y;
532275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy}
542275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy
55afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic float SC_cosf_fast(float x) {
562275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    x += float(M_PI / 2);
572275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy
582275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float A =   1.0f / (2.0f * M_PI);
592275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float B = -16.0f;
602275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float C =   8.0f;
61a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
622275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    // scale angle for easy argument reduction
632275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    x *= A;
64a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
652275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    if (fabsf(x) >= 0.5f) {
662275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        // argument reduction
672275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        x = x - ceilf(x + 0.5f) + 1.0f;
682275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    }
69a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
702275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float y = B * x * fabsf(x) + C * x;
712275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    return 0.2215f * (y * fabsf(y) - y) + y;
722275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy}
732275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy
74afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic float SC_randf(float max) {
75e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    float r = (float)rand();
76366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    r *= max;
77366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    return r / RAND_MAX;
78e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams}
79e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
80afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic float SC_randf2(float min, float max) {
8139dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    float r = (float)rand();
82366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    r = r * (max - min) + min;
83366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    return r / RAND_MAX;
8439dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy}
8539dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy
86afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic int SC_randi(int max) {
8722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    return (int)SC_randf(max);
8822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
8922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
90afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic int SC_randi2(int min, int max) {
9122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    return (int)SC_randf2(min, max);
9222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
9322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
94afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic float SC_frac(float v) {
95be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    int i = (int)floor(v);
96be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return fmin(v - i, 0x1.fffffep-1f);
97be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
98be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
9998e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy//////////////////////////////////////////////////////////////////////////////
10098e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy// Time routines
10198e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy//////////////////////////////////////////////////////////////////////////////
10298e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy
103ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hinesstatic time_t SC_time(time_t *timer) {
10498e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy    GET_TLS();
105ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    return time(timer);
10639dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy}
10739dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy
108ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hinesstatic tm* SC_localtime(tm *local, time_t *timer) {
10939dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    GET_TLS();
110ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    if (!local) {
111ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines      return NULL;
112ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    }
113e5ffb879ae535a899a486285a23bea05e912480fJason Sams
114ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    // The native localtime function is not thread-safe, so we
115ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    // have to apply locking for proper behavior in RenderScript.
116ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    pthread_mutex_lock(&rsc->gLibMutex);
117ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    tm *tmp = localtime(timer);
118ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    memcpy(local, tmp, sizeof(*tmp));
119ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    pthread_mutex_unlock(&rsc->gLibMutex);
120ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    return local;
12139dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy}
12239dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy
123afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic int64_t SC_uptimeMillis() {
12422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    return nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
12522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
12622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
127afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic int64_t SC_uptimeNanos() {
1287349547db61d2d458b31c074b902d56d082e5d84Jason Sams    return systemTime(SYSTEM_TIME_MONOTONIC);
12922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
13022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
131afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic float SC_getDt() {
1329c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    GET_TLS();
133ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    int64_t l = sc->mEnviroment.mLastDtTime;
134ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    sc->mEnviroment.mLastDtTime = systemTime(SYSTEM_TIME_MONOTONIC);
135ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    return ((float)(sc->mEnviroment.mLastDtTime - l)) / 1.0e9;
136e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams}
137e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
138e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
139e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//
140e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
141e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
142afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_allocGetDimX(RsAllocation va) {
143be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const Allocation *a = static_cast<const Allocation *>(va);
144605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(a);
145605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    //LOGE("SC_allocGetDimX a=%p  type=%p", a, a->getType());
146be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a->getType()->getDimX();
147e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams}
148e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
149afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_allocGetDimY(RsAllocation va) {
150be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const Allocation *a = static_cast<const Allocation *>(va);
151605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(a);
152be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a->getType()->getDimY();
15348b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy}
15448b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy
155afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_allocGetDimZ(RsAllocation va) {
156be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const Allocation *a = static_cast<const Allocation *>(va);
157605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(a);
158be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a->getType()->getDimZ();
15948b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy}
16048b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy
161afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_allocGetDimLOD(RsAllocation va) {
162be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const Allocation *a = static_cast<const Allocation *>(va);
163605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(a);
164be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a->getType()->getDimLOD();
16548b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy}
16648b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy
167afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_allocGetDimFaces(RsAllocation va) {
168be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const Allocation *a = static_cast<const Allocation *>(va);
169605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(a);
170be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a->getType()->getDimFaces();
17148b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy}
17248b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy
173afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic const void * SC_getElementAtX(RsAllocation va, uint32_t x) {
1747bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Allocation *a = static_cast<const Allocation *>(va);
175605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(a);
1767bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Type *t = a->getType();
177605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(t);
1787bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const uint8_t *p = (const uint8_t *)a->getPtr();
1797bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    return &p[t->getElementSizeBytes() * x];
1807bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams}
1817bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
182afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic const void * SC_getElementAtXY(RsAllocation va, uint32_t x, uint32_t y) {
1837bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Allocation *a = static_cast<const Allocation *>(va);
184605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(a);
1857bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Type *t = a->getType();
186605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(t);
1877bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const uint8_t *p = (const uint8_t *)a->getPtr();
1887bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    return &p[t->getElementSizeBytes() * (x + y*t->getDimX())];
1897bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams}
1907bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
191afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic const void * SC_getElementAtXYZ(RsAllocation va, uint32_t x, uint32_t y, uint32_t z) {
1927bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Allocation *a = static_cast<const Allocation *>(va);
193605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(a);
1947bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Type *t = a->getType();
195605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(t);
1967bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const uint8_t *p = (const uint8_t *)a->getPtr();
1977bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    return &p[t->getElementSizeBytes() * (x + y*t->getDimX())];
1987bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams}
199be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
200c093685672e54657d87b953d44e514803889486cJason Samsstatic void SC_setObject(void **vdst, void * vsrc) {
201f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    //LOGE("SC_setObject  %p,%p  %p", vdst, *vdst, vsrc);
202f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    if (vsrc) {
203605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams        CHECK_OBJ(vsrc);
204f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams        static_cast<ObjectBase *>(vsrc)->incSysRef();
205f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    }
206f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    if (vdst[0]) {
207605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams        CHECK_OBJ(vdst[0]);
208f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams        static_cast<ObjectBase *>(vdst[0])->decSysRef();
209f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    }
210c093685672e54657d87b953d44e514803889486cJason Sams    *vdst = vsrc;
211f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    //LOGE("SC_setObject *");
212c093685672e54657d87b953d44e514803889486cJason Sams}
213afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
214c093685672e54657d87b953d44e514803889486cJason Samsstatic void SC_clearObject(void **vdst) {
215f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    //LOGE("SC_clearObject  %p,%p", vdst, *vdst);
216f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    if (vdst[0]) {
217605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams        CHECK_OBJ(vdst[0]);
218f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams        static_cast<ObjectBase *>(vdst[0])->decSysRef();
219f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    }
220c093685672e54657d87b953d44e514803889486cJason Sams    *vdst = NULL;
221f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    //LOGE("SC_clearObject *");
222c093685672e54657d87b953d44e514803889486cJason Sams}
223afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
224c093685672e54657d87b953d44e514803889486cJason Samsstatic bool SC_isObject(RsAllocation vsrc) {
225c093685672e54657d87b953d44e514803889486cJason Sams    return vsrc != NULL;
226c093685672e54657d87b953d44e514803889486cJason Sams}
227c093685672e54657d87b953d44e514803889486cJason Sams
22822fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_debugF(const char *s, float f) {
229fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
230c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams}
2317dce6bc09126187534ab0297c66b30149643b162Jason Samsstatic void SC_debugFv2(const char *s, float f1, float f2) {
232fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s {%f, %f}", s, f1, f2);
233370ed1525dc570381edd8c67d92eb45701d5f767Romain Guy}
2347dce6bc09126187534ab0297c66b30149643b162Jason Samsstatic void SC_debugFv3(const char *s, float f1, float f2, float f3) {
235fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s {%f, %f, %f}", s, f1, f2, f3);
236c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams}
2377dce6bc09126187534ab0297c66b30149643b162Jason Samsstatic void SC_debugFv4(const char *s, float f1, float f2, float f3, float f4) {
238fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
23922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
240df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesstatic void SC_debugD(const char *s, double d) {
241fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
242df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines}
2437dce6bc09126187534ab0297c66b30149643b162Jason Samsstatic void SC_debugFM4v4(const char *s, const float *f) {
244fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
245fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
246fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
247fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
2487dce6bc09126187534ab0297c66b30149643b162Jason Sams}
2497dce6bc09126187534ab0297c66b30149643b162Jason Samsstatic void SC_debugFM3v3(const char *s, const float *f) {
250fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
251fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
252fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
2537dce6bc09126187534ab0297c66b30149643b162Jason Sams}
2547dce6bc09126187534ab0297c66b30149643b162Jason Samsstatic void SC_debugFM2v2(const char *s, const float *f) {
255fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s {%f, %f", s, f[0], f[2]);
256fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s  %f, %f}",s, f[1], f[3]);
2577dce6bc09126187534ab0297c66b30149643b162Jason Sams}
2587dce6bc09126187534ab0297c66b30149643b162Jason Sams
25922fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_debugI32(const char *s, int32_t i) {
260fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s %i  0x%x", s, i, i);
261370ed1525dc570381edd8c67d92eb45701d5f767Romain Guy}
262ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsstatic void SC_debugU32(const char *s, uint32_t i) {
263fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s %u  0x%x", s, i, i);
264df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines}
265df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesstatic void SC_debugLL64(const char *s, long long ll) {
266fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s %lld  0x%llx", s, ll, ll);
267df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines}
268df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesstatic void SC_debugULL64(const char *s, unsigned long long ll) {
269fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s %llu  0x%llx", s, ll, ll);
270ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams}
271370ed1525dc570381edd8c67d92eb45701d5f767Romain Guy
2727bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Samsstatic void SC_debugP(const char *s, const void *p) {
273fca82b1b10bb7d2f774cf6116f6424be05c75c67Jason Sams    LOGD("%s %p", s, p);
2747bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams}
2757bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
276afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_toClient2(int cmdID, void *data, int len) {
277ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    GET_TLS();
278ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    //LOGE("SC_toClient %i %i %i", cmdID, len);
279aad4bc5231dd7059fc5148b34a951117d9b5f4adJason Sams    return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, false);
280ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams}
281ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams
282afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_toClient(int cmdID) {
2838c401effb0837155fc39ca0364f57a882d127d38Jason Sams    GET_TLS();
284ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    //LOGE("SC_toClient %i", cmdID);
285aad4bc5231dd7059fc5148b34a951117d9b5f4adJason Sams    return rsc->sendMessageToClient(NULL, RS_MESSAGE_TO_CLIENT_USER, cmdID, 0, false);
2868c401effb0837155fc39ca0364f57a882d127d38Jason Sams}
2878c401effb0837155fc39ca0364f57a882d127d38Jason Sams
288afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_toClientBlocking2(int cmdID, void *data, int len) {
2893a27c952c013ad0a8e0c91bea76d895a07f7a56dJason Sams    GET_TLS();
290ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    //LOGE("SC_toClientBlocking %i %i", cmdID, len);
291aad4bc5231dd7059fc5148b34a951117d9b5f4adJason Sams    return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, true);
292ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams}
293ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams
294afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic uint32_t SC_toClientBlocking(int cmdID) {
295ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    GET_TLS();
296ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    //LOGE("SC_toClientBlocking %i", cmdID);
297aad4bc5231dd7059fc5148b34a951117d9b5f4adJason Sams    return rsc->sendMessageToClient(NULL, RS_MESSAGE_TO_CLIENT_USER, cmdID, 0, true);
2983a27c952c013ad0a8e0c91bea76d895a07f7a56dJason Sams}
2993a27c952c013ad0a8e0c91bea76d895a07f7a56dJason Sams
300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukint SC_divsi3(int a, int b) {
301be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a / b;
302be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
3033a27c952c013ad0a8e0c91bea76d895a07f7a56dJason Sams
304cb082a3239b1511caed4c1a3b31a4e922a42c977Bryan Mawhinneyint SC_modsi3(int a, int b) {
305cb082a3239b1511caed4c1a3b31a4e922a42c977Bryan Mawhinney    return a % b;
306cb082a3239b1511caed4c1a3b31a4e922a42c977Bryan Mawhinney}
307cb082a3239b1511caed4c1a3b31a4e922a42c977Bryan Mawhinney
308711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hinesunsigned int SC_udivsi3(unsigned int a, unsigned int b) {
309711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hines    return a / b;
310711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hines}
311711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hines
312711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hinesunsigned int SC_umodsi3(unsigned int a, unsigned int b) {
313711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hines    return a % b;
314711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hines}
315711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hines
316afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukint SC_getAllocation(const void *ptr) {
317ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    GET_TLS();
318ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    const Allocation *alloc = sc->ptrToAllocation(ptr);
319ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    return (int)alloc;
320ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams}
321ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams
322afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid SC_allocationMarkDirty(RsAllocation a) {
3231e5168d113ccdcf9fe1b817dcbf2f7f476d36c74Alex Sakhartchouk    Allocation *alloc = static_cast<Allocation *>(a);
3241e5168d113ccdcf9fe1b817dcbf2f7f476d36c74Alex Sakhartchouk    alloc->sendDirty();
3251e5168d113ccdcf9fe1b817dcbf2f7f476d36c74Alex Sakhartchouk}
326ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams
327ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Samsvoid SC_ForEach(RsScript vs,
328ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                RsAllocation vin,
329ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                RsAllocation vout,
330afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                const void *usr) {
331c61346b91434307c5003029017b54ce9c49112beJason Sams    GET_TLS();
332ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams    const Allocation *ain = static_cast<const Allocation *>(vin);
333c61346b91434307c5003029017b54ce9c49112beJason Sams    Allocation *aout = static_cast<Allocation *>(vout);
334c61346b91434307c5003029017b54ce9c49112beJason Sams    Script *s = static_cast<Script *>(vs);
335ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams    s->runForEach(rsc, ain, aout, usr);
336c61346b91434307c5003029017b54ce9c49112beJason Sams}
337c61346b91434307c5003029017b54ce9c49112beJason Sams
338ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Samsvoid SC_ForEach2(RsScript vs,
339ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                RsAllocation vin,
340ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                RsAllocation vout,
341ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                const void *usr,
342afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                const RsScriptCall *call) {
343c61346b91434307c5003029017b54ce9c49112beJason Sams    GET_TLS();
344ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams    const Allocation *ain = static_cast<const Allocation *>(vin);
345c61346b91434307c5003029017b54ce9c49112beJason Sams    Allocation *aout = static_cast<Allocation *>(vout);
346c61346b91434307c5003029017b54ce9c49112beJason Sams    Script *s = static_cast<Script *>(vs);
347ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams    s->runForEach(rsc, ain, aout, usr, call);
348c61346b91434307c5003029017b54ce9c49112beJason Sams}
349c61346b91434307c5003029017b54ce9c49112beJason Sams
350e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
351e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams// Class implementation
352e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
353e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
354be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams// llvm name mangling ref
355be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//  <builtin-type> ::= v  # void
356be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= b  # bool
357be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= c  # char
358be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= a  # signed char
359be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= h  # unsigned char
360be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= s  # short
361be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= t  # unsigned short
362be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= i  # int
363be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= j  # unsigned int
364be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= l  # long
365be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= m  # unsigned long
366be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= x  # long long, __int64
367be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= y  # unsigned long long, __int64
368be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= f  # float
369be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= d  # double
370be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
371aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic ScriptCState::SymbolTable_t gSyms[] = {
3726bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "__divsi3", (void *)&SC_divsi3, true },
373cb082a3239b1511caed4c1a3b31a4e922a42c977Bryan Mawhinney    { "__modsi3", (void *)&SC_modsi3, true },
374711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hines    { "__udivsi3", (void *)&SC_udivsi3, true },
375711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hines    { "__umodsi3", (void *)&SC_umodsi3, true },
376be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
37722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    // allocation
3786bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z19rsAllocationGetDimX13rs_allocation", (void *)&SC_allocGetDimX, true },
3796bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z19rsAllocationGetDimY13rs_allocation", (void *)&SC_allocGetDimY, true },
3806bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z19rsAllocationGetDimZ13rs_allocation", (void *)&SC_allocGetDimZ, true },
3816bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z21rsAllocationGetDimLOD13rs_allocation", (void *)&SC_allocGetDimLOD, true },
3826bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z23rsAllocationGetDimFaces13rs_allocation", (void *)&SC_allocGetDimFaces, true },
3836bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z15rsGetAllocationPKv", (void *)&SC_getAllocation, true },
38422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
3856bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsGetElementAt13rs_allocationj", (void *)&SC_getElementAtX, true },
3866bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsGetElementAt13rs_allocationjj", (void *)&SC_getElementAtXY, true },
3876bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsGetElementAt13rs_allocationjjj", (void *)&SC_getElementAtXYZ, true },
3887bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
3896bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_setObject, true },
3906bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsClearObjectP10rs_element", (void *)&SC_clearObject, true },
3916bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z10rsIsObject10rs_element", (void *)&SC_isObject, true },
392f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams
3936bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_setObject, true },
3946bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsClearObjectP7rs_type", (void *)&SC_clearObject, true },
3956bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z10rsIsObject7rs_type", (void *)&SC_isObject, true },
396f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams
3976bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_setObject, true },
3986bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsClearObjectP13rs_allocation", (void *)&SC_clearObject, true },
3996bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z10rsIsObject13rs_allocation", (void *)&SC_isObject, true },
400c093685672e54657d87b953d44e514803889486cJason Sams
4016bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_setObject, true },
4026bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsClearObjectP10rs_sampler", (void *)&SC_clearObject, true },
4036bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z10rsIsObject10rs_sampler", (void *)&SC_isObject, true },
404f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams
4056bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_setObject, true },
4066bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsClearObjectP9rs_script", (void *)&SC_clearObject, true },
4076bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z10rsIsObject9rs_script", (void *)&SC_isObject, true },
408f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams
4096bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_setObject, true },
4106bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_clearObject, true },
4116bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z10rsIsObject7rs_mesh", (void *)&SC_isObject, true },
412f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams
4136bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsSetObjectP19rs_program_fragmentS_", (void *)&SC_setObject, true },
4146bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsClearObjectP19rs_program_fragment", (void *)&SC_clearObject, true },
4156bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z10rsIsObject19rs_program_fragment", (void *)&SC_isObject, true },
416f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams
4176bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsSetObjectP17rs_program_vertexS_", (void *)&SC_setObject, true },
4186bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsClearObjectP17rs_program_vertex", (void *)&SC_clearObject, true },
4196bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z10rsIsObject17rs_program_vertex", (void *)&SC_isObject, true },
420f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams
4216bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsSetObjectP17rs_program_rasterS_", (void *)&SC_setObject, true },
4226bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsClearObjectP17rs_program_raster", (void *)&SC_clearObject, true },
4236bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z10rsIsObject17rs_program_raster", (void *)&SC_isObject, true },
424f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams
4256bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsSetObjectP16rs_program_storeS_", (void *)&SC_setObject, true },
4266bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsClearObjectP16rs_program_store", (void *)&SC_clearObject, true },
4276bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z10rsIsObject16rs_program_store", (void *)&SC_isObject, true },
428f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams
4296bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z11rsSetObjectP7rs_fontS_", (void *)&SC_setObject, true },
4306bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsClearObjectP7rs_font", (void *)&SC_clearObject, true },
4316bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z10rsIsObject7rs_font", (void *)&SC_isObject, true },
432f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams
433f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams
4346bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z21rsAllocationMarkDirty13rs_allocation", (void *)&SC_allocationMarkDirty, true },
4351e5168d113ccdcf9fe1b817dcbf2f7f476d36c74Alex Sakhartchouk
436c093685672e54657d87b953d44e514803889486cJason Sams
43722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    // Debug
4386bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcf", (void *)&SC_debugF, true },
4396bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcff", (void *)&SC_debugFv2, true },
4406bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcfff", (void *)&SC_debugFv3, true },
4416bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcffff", (void *)&SC_debugFv4, true },
4426bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcd", (void *)&SC_debugD, true },
4436bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcPK12rs_matrix4x4", (void *)&SC_debugFM4v4, true },
4446bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcPK12rs_matrix3x3", (void *)&SC_debugFM3v3, true },
4456bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcPK12rs_matrix2x2", (void *)&SC_debugFM2v2, true },
4466bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKci", (void *)&SC_debugI32, true },
4476bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcj", (void *)&SC_debugU32, true },
448df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines    // Both "long" and "unsigned long" need to be redirected to their
449df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines    // 64-bit counterparts, since we have hacked Slang to use 64-bit
450df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines    // for "long" on Arm (to be similar to Java).
4516bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcl", (void *)&SC_debugLL64, true },
4526bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcm", (void *)&SC_debugULL64, true },
4536bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcx", (void *)&SC_debugLL64, true },
4546bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcy", (void *)&SC_debugULL64, true },
4556bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsDebugPKcPKv", (void *)&SC_debugP, true },
45622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
45722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    // RS Math
4586bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z6rsRandi", (void *)&SC_randi, true },
4596bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z6rsRandii", (void *)&SC_randi2, true },
4606bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z6rsRandf", (void *)&SC_randf, true },
4616bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z6rsRandff", (void *)&SC_randf2, true },
4626bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z6rsFracf", (void *)&SC_frac, true },
46322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
46422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    // time
465ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    { "_Z6rsTimePi", (void *)&SC_time, true },
466ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    { "_Z11rsLocaltimeP5rs_tmPKi", (void *)&SC_localtime, true },
4676bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsUptimeMillisv", (void*)&SC_uptimeMillis, true },
4686bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z13rsUptimeNanosv", (void*)&SC_uptimeNanos, true },
4696bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z7rsGetDtv", (void*)&SC_getDt, false },
4706bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams
4716bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsSendToClienti", (void *)&SC_toClient, false },
4726bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z14rsSendToClientiPKvj", (void *)&SC_toClient2, false },
4736bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z22rsSendToClientBlockingi", (void *)&SC_toClientBlocking, false },
4746bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_toClientBlocking2, false },
4756bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams
4766bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach, false },
4776bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    //{ "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach2, true },
47822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
47922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams////////////////////////////////////////////////////////////////////
48022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
4816bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    //{ "sinf_fast", (void *)&SC_sinf_fast, true },
4826bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    //{ "cosf_fast", (void *)&SC_cosf_fast, true },
483e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
4846bfc1b91dc7684f8ad9dc9f605e92ed8a31d5bbeJason Sams    { NULL, NULL, false }
485e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams};
486e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
487afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukconst ScriptCState::SymbolTable_t * ScriptCState::lookupSymbol(const char *sym) {
488e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    ScriptCState::SymbolTable_t *syms = gSyms;
489e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
490e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    while (syms->mPtr) {
491e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams        if (!strcmp(syms->mName, sym)) {
492e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams            return syms;
493e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams        }
494e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams        syms++;
495e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    }
496e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    return NULL;
497e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams}
498