rsScriptC_Lib.cpp revision 7349547db61d2d458b31c074b902d56d082e5d84
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
21e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams#include "acc/acc.h"
229c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato#include "utils/Timers.h"
23e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
2498e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy#include <time.h>
2598e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy
26e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Samsusing namespace android;
27e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Samsusing namespace android::renderscript;
28e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
29e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams#define GET_TLS()  Context::ScriptTLSStruct * tls = \
30e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
31e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    Context * rsc = tls->mContext; \
32e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    ScriptC * sc = (ScriptC *) tls->mScript
33e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
34a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
35e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
36e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams// Math routines
37e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
38e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
392275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guystatic float SC_sinf_fast(float x)
402275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy{
412275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float A =   1.0f / (2.0f * M_PI);
422275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float B = -16.0f;
432275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float C =   8.0f;
44a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
452275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    // scale angle for easy argument reduction
462275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    x *= A;
47a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
482275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    if (fabsf(x) >= 0.5f) {
492275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        // argument reduction
502275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        x = x - ceilf(x + 0.5f) + 1.0f;
512275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    }
52a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
532275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float y = B * x * fabsf(x) + C * x;
542275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    return 0.2215f * (y * fabsf(y) - y) + y;
552275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy}
562275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy
572275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guystatic float SC_cosf_fast(float x)
582275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy{
592275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    x += float(M_PI / 2);
602275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy
612275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float A =   1.0f / (2.0f * M_PI);
622275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float B = -16.0f;
632275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float C =   8.0f;
64a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
652275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    // scale angle for easy argument reduction
662275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    x *= A;
67a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
682275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    if (fabsf(x) >= 0.5f) {
692275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        // argument reduction
702275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        x = x - ceilf(x + 0.5f) + 1.0f;
712275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    }
72a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
732275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float y = B * x * fabsf(x) + C * x;
742275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    return 0.2215f * (y * fabsf(y) - y) + y;
752275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy}
762275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy
7722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
78e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Samsstatic float SC_randf(float max)
79e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams{
80e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    float r = (float)rand();
81e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    return r / RAND_MAX * max;
82e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams}
83e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
8439dbc8067ef613b84475c20306d1b9be71d61c16Romain Guystatic float SC_randf2(float min, float max)
8539dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy{
8639dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    float r = (float)rand();
8739dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    return r / RAND_MAX * (max - min) + min;
8839dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy}
8939dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy
9022fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic int SC_randi(int max)
9122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{
9222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    return (int)SC_randf(max);
9322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
9422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
9522fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic int SC_randi2(int min, int max)
9622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{
9722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    return (int)SC_randf2(min, max);
9822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
9922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
100be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsstatic float SC_frac(float v)
101be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{
102be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    int i = (int)floor(v);
103be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return fmin(v - i, 0x1.fffffep-1f);
104be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
105be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
10698e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy//////////////////////////////////////////////////////////////////////////////
10798e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy// Time routines
10898e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy//////////////////////////////////////////////////////////////////////////////
10998e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy
1109c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onoratostatic int32_t SC_second()
11198e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy{
11298e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy    GET_TLS();
11398e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy
11498e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy    time_t rawtime;
11598e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy    time(&rawtime);
11698e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy
117519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    struct tm *timeinfo;
118519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    timeinfo = localtime(&rawtime);
119519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    return timeinfo->tm_sec;
12098e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy}
121e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
1229c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onoratostatic int32_t SC_minute()
12398e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy{
12498e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy    GET_TLS();
125e5ffb879ae535a899a486285a23bea05e912480fJason Sams
12698e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy    time_t rawtime;
12798e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy    time(&rawtime);
128e5ffb879ae535a899a486285a23bea05e912480fJason Sams
129519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    struct tm *timeinfo;
130519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    timeinfo = localtime(&rawtime);
131519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    return timeinfo->tm_min;
132e5ffb879ae535a899a486285a23bea05e912480fJason Sams}
13398e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy
1349c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onoratostatic int32_t SC_hour()
13598e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy{
13698e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy    GET_TLS();
137e5ffb879ae535a899a486285a23bea05e912480fJason Sams
13898e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy    time_t rawtime;
13998e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy    time(&rawtime);
140e5ffb879ae535a899a486285a23bea05e912480fJason Sams
141519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    struct tm *timeinfo;
142519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    timeinfo = localtime(&rawtime);
143519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    return timeinfo->tm_hour;
14439dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy}
14539dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy
1469c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onoratostatic int32_t SC_day()
14739dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy{
14839dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    GET_TLS();
149e5ffb879ae535a899a486285a23bea05e912480fJason Sams
15039dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    time_t rawtime;
15139dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    time(&rawtime);
152e5ffb879ae535a899a486285a23bea05e912480fJason Sams
153519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    struct tm *timeinfo;
154519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    timeinfo = localtime(&rawtime);
155519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    return timeinfo->tm_mday;
156e5ffb879ae535a899a486285a23bea05e912480fJason Sams}
157e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
1589c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onoratostatic int32_t SC_month()
15939dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy{
16039dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    GET_TLS();
161e5ffb879ae535a899a486285a23bea05e912480fJason Sams
16239dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    time_t rawtime;
16339dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    time(&rawtime);
164e5ffb879ae535a899a486285a23bea05e912480fJason Sams
165519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    struct tm *timeinfo;
166519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    timeinfo = localtime(&rawtime);
167519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    return timeinfo->tm_mon;
168e5ffb879ae535a899a486285a23bea05e912480fJason Sams}
16939dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy
1709c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onoratostatic int32_t SC_year()
17139dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy{
17239dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    GET_TLS();
173e5ffb879ae535a899a486285a23bea05e912480fJason Sams
17439dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    time_t rawtime;
17539dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy    time(&rawtime);
176e5ffb879ae535a899a486285a23bea05e912480fJason Sams
177519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    struct tm *timeinfo;
178519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    timeinfo = localtime(&rawtime);
179519cdc9b7e63b21704e31dba909e6eeb788e43d3Romain Guy    return timeinfo->tm_year;
18039dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy}
18139dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy
182ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsstatic int64_t SC_uptimeMillis()
18322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{
18422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    return nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
18522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
18622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
1877349547db61d2d458b31c074b902d56d082e5d84Jason Samsstatic int64_t SC_uptimeNanos()
18822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{
1897349547db61d2d458b31c074b902d56d082e5d84Jason Sams    return systemTime(SYSTEM_TIME_MONOTONIC);
19022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
19122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
192ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsstatic float SC_getDt()
1939c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato{
1949c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato    GET_TLS();
195ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    int64_t l = sc->mEnviroment.mLastDtTime;
196ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    sc->mEnviroment.mLastDtTime = systemTime(SYSTEM_TIME_MONOTONIC);
197ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    return ((float)(sc->mEnviroment.mLastDtTime - l)) / 1.0e9;
198e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams}
199e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
200e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
201e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
202e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//
203e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
204e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
205be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsstatic uint32_t SC_allocGetDimX(RsAllocation va)
206e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams{
207c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    GET_TLS();
208be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const Allocation *a = static_cast<const Allocation *>(va);
209be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE("SC_allocGetDimX a=%p", a);
210be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //LOGE(" type=%p", a->getType());
211be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a->getType()->getDimX();
212e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams}
213e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
214be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsstatic uint32_t SC_allocGetDimY(RsAllocation va)
21548b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy{
216be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    GET_TLS();
217be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const Allocation *a = static_cast<const Allocation *>(va);
218be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a->getType()->getDimY();
21948b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy}
22048b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy
221be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsstatic uint32_t SC_allocGetDimZ(RsAllocation va)
22248b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy{
223be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    GET_TLS();
224be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const Allocation *a = static_cast<const Allocation *>(va);
225be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a->getType()->getDimZ();
22648b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy}
22748b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy
228be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsstatic uint32_t SC_allocGetDimLOD(RsAllocation va)
22948b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy{
230be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    GET_TLS();
231be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const Allocation *a = static_cast<const Allocation *>(va);
232be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a->getType()->getDimLOD();
23348b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy}
23448b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy
235be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsstatic uint32_t SC_allocGetDimFaces(RsAllocation va)
23648b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy{
237be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    GET_TLS();
238be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    const Allocation *a = static_cast<const Allocation *>(va);
239be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a->getType()->getDimFaces();
24048b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy}
24148b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy
2427bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Samsconst void * SC_getElementAtX(RsAllocation va, uint32_t x)
2437bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams{
2447bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Allocation *a = static_cast<const Allocation *>(va);
2457bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Type *t = a->getType();
2467bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const uint8_t *p = (const uint8_t *)a->getPtr();
2477bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    return &p[t->getElementSizeBytes() * x];
2487bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams}
2497bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
2507bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Samsconst void * SC_getElementAtXY(RsAllocation va, uint32_t x, uint32_t y)
2517bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams{
2527bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Allocation *a = static_cast<const Allocation *>(va);
2537bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Type *t = a->getType();
2547bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const uint8_t *p = (const uint8_t *)a->getPtr();
2557bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    return &p[t->getElementSizeBytes() * (x + y*t->getDimX())];
2567bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams}
2577bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
2587bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Samsconst void * SC_getElementAtXYZ(RsAllocation va, uint32_t x, uint32_t y, uint32_t z)
2597bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams{
2607bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Allocation *a = static_cast<const Allocation *>(va);
2617bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const Type *t = a->getType();
2627bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    const uint8_t *p = (const uint8_t *)a->getPtr();
2637bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    return &p[t->getElementSizeBytes() * (x + y*t->getDimX())];
2647bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams}
265be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
266e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
26722fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_debugF(const char *s, float f) {
26822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    LOGE("%s %f, 0x%08x", s, f, *((int *) (&f)));
269c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams}
27022fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_debugFv2(const char *s, rsvF_2 fv) {
27122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    float *f = (float *)&fv;
27222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    LOGE("%s {%f, %f}", s, f[0], f[1]);
273370ed1525dc570381edd8c67d92eb45701d5f767Romain Guy}
27422fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_debugFv3(const char *s, rsvF_4 fv) {
27522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    float *f = (float *)&fv;
27622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    LOGE("%s {%f, %f, %f}", s, f[0], f[1], f[2]);
277c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams}
27822fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_debugFv4(const char *s, rsvF_4 fv) {
27922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    float *f = (float *)&fv;
28022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    LOGE("%s {%f, %f, %f, %f}", s, f[0], f[1], f[2], f[3]);
28122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
28222fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_debugI32(const char *s, int32_t i) {
28322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    LOGE("%s %i  0x%x", s, i, i);
284370ed1525dc570381edd8c67d92eb45701d5f767Romain Guy}
285ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsstatic void SC_debugU32(const char *s, uint32_t i) {
286ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    LOGE("%s %i  0x%x", s, i, i);
287ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams}
288370ed1525dc570381edd8c67d92eb45701d5f767Romain Guy
2897bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Samsstatic void SC_debugP(const char *s, const void *p) {
2907bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    LOGE("%s %p", s, p);
2917bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams}
2927bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
293ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsstatic uint32_t SC_toClient2(int cmdID, void *data, int len)
294ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams{
295ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    GET_TLS();
296ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    //LOGE("SC_toClient %i %i %i", cmdID, len);
297ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    return rsc->sendMessageToClient(data, cmdID, len, false);
298ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams}
299ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams
300ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsstatic uint32_t SC_toClient(int cmdID)
3018c401effb0837155fc39ca0364f57a882d127d38Jason Sams{
3028c401effb0837155fc39ca0364f57a882d127d38Jason Sams    GET_TLS();
303ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    //LOGE("SC_toClient %i", cmdID);
304ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    return rsc->sendMessageToClient(NULL, cmdID, 0, false);
3058c401effb0837155fc39ca0364f57a882d127d38Jason Sams}
3068c401effb0837155fc39ca0364f57a882d127d38Jason Sams
307ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsstatic uint32_t SC_toClientBlocking2(int cmdID, void *data, int len)
3083a27c952c013ad0a8e0c91bea76d895a07f7a56dJason Sams{
3093a27c952c013ad0a8e0c91bea76d895a07f7a56dJason Sams    GET_TLS();
310ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    //LOGE("SC_toClientBlocking %i %i", cmdID, len);
311ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    return rsc->sendMessageToClient(data, cmdID, len, true);
312ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams}
313ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams
314ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsstatic uint32_t SC_toClientBlocking(int cmdID)
315ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams{
316ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    GET_TLS();
317ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    //LOGE("SC_toClientBlocking %i", cmdID);
318ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    return rsc->sendMessageToClient(NULL, cmdID, 0, true);
3193a27c952c013ad0a8e0c91bea76d895a07f7a56dJason Sams}
3203a27c952c013ad0a8e0c91bea76d895a07f7a56dJason Sams
321be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsint SC_divsi3(int a, int b)
322be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{
323be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    return a / b;
324be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
3253a27c952c013ad0a8e0c91bea76d895a07f7a56dJason Sams
326ce92d4baf7a5bce097228fdd4498601764cd4014Jason Samsint SC_getAllocation(const void *ptr)
327ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams{
328ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    GET_TLS();
329ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    const Allocation *alloc = sc->ptrToAllocation(ptr);
330ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams    return (int)alloc;
331ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams}
332ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams
333ce92d4baf7a5bce097228fdd4498601764cd4014Jason Sams
334ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Samsvoid SC_ForEach(RsScript vs,
335ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                RsAllocation vin,
336ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                RsAllocation vout,
337ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                const void *usr)
338c61346b91434307c5003029017b54ce9c49112beJason Sams{
339c61346b91434307c5003029017b54ce9c49112beJason Sams    GET_TLS();
340ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams    const Allocation *ain = static_cast<const Allocation *>(vin);
341c61346b91434307c5003029017b54ce9c49112beJason Sams    Allocation *aout = static_cast<Allocation *>(vout);
342c61346b91434307c5003029017b54ce9c49112beJason Sams    Script *s = static_cast<Script *>(vs);
343ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams    s->runForEach(rsc, ain, aout, usr);
344c61346b91434307c5003029017b54ce9c49112beJason Sams}
345c61346b91434307c5003029017b54ce9c49112beJason Sams
346ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Samsvoid SC_ForEach2(RsScript vs,
347ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                RsAllocation vin,
348ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                RsAllocation vout,
349ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                const void *usr,
350ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams                const RsScriptCall *call)
351c61346b91434307c5003029017b54ce9c49112beJason Sams{
352c61346b91434307c5003029017b54ce9c49112beJason Sams    GET_TLS();
353ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams    const Allocation *ain = static_cast<const Allocation *>(vin);
354c61346b91434307c5003029017b54ce9c49112beJason Sams    Allocation *aout = static_cast<Allocation *>(vout);
355c61346b91434307c5003029017b54ce9c49112beJason Sams    Script *s = static_cast<Script *>(vs);
356ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams    s->runForEach(rsc, ain, aout, usr, call);
357c61346b91434307c5003029017b54ce9c49112beJason Sams}
358c61346b91434307c5003029017b54ce9c49112beJason Sams
359e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
360e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams// Class implementation
361e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
362e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
363be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams// llvm name mangling ref
364be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//  <builtin-type> ::= v  # void
365be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= b  # bool
366be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= c  # char
367be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= a  # signed char
368be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= h  # unsigned char
369be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= s  # short
370be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= t  # unsigned short
371be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= i  # int
372be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= j  # unsigned int
373be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= l  # long
374be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= m  # unsigned long
375be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= x  # long long, __int64
376be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= y  # unsigned long long, __int64
377be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= f  # float
378be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams//                 ::= d  # double
379be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
380aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic ScriptCState::SymbolTable_t gSyms[] = {
381be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    { "__divsi3", (void *)&SC_divsi3 },
382be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
38322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    // allocation
384ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    { "_Z19rsAllocationGetDimX13rs_allocation", (void *)&SC_allocGetDimX },
385ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    { "_Z19rsAllocationGetDimY13rs_allocation", (void *)&SC_allocGetDimY },
386ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    { "_Z19rsAllocationGetDimZ13rs_allocation", (void *)&SC_allocGetDimZ },
387ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    { "_Z21rsAllocationGetDimLOD13rs_allocation", (void *)&SC_allocGetDimLOD },
388ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    { "_Z23rsAllocationGetDimFaces13rs_allocation", (void *)&SC_allocGetDimFaces },
389ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    { "_Z15rsGetAllocationPKv", (void *)&SC_getAllocation },
39022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
3917bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    { "_Z14rsGetElementAt13rs_allocationj", (void *)&SC_getElementAtX },
3927bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    { "_Z14rsGetElementAt13rs_allocationjj", (void *)&SC_getElementAtXY },
3937bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    { "_Z14rsGetElementAt13rs_allocationjjj", (void *)&SC_getElementAtXYZ },
3947bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
39522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    // Debug
39622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "_Z7rsDebugPKcf", (void *)&SC_debugF },
39722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "_Z7rsDebugPKcDv2_f", (void *)&SC_debugFv2 },
39822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "_Z7rsDebugPKcDv3_f", (void *)&SC_debugFv3 },
39922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "_Z7rsDebugPKcDv4_f", (void *)&SC_debugFv4 },
40022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "_Z7rsDebugPKci", (void *)&SC_debugI32 },
401ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    { "_Z7rsDebugPKcj", (void *)&SC_debugU32 },
4027bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    { "_Z7rsDebugPKcPKv", (void *)&SC_debugP },
40322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
40422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    // RS Math
40522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "_Z6rsRandi", (void *)&SC_randi },
40622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "_Z6rsRandii", (void *)&SC_randi2 },
40722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "_Z6rsRandf", (void *)&SC_randf },
40822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "_Z6rsRandff", (void *)&SC_randf2 },
40922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    { "_Z6rsFracf", (void *)&SC_frac },
41022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
41122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    // time
4127349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z8rsSecondv", (void *)&SC_second },
4137349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z8rsMinutev", (void *)&SC_minute },
4147349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z6rsHourv", (void *)&SC_hour },
4157349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z5rsDayv", (void *)&SC_day },
4167349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z7rsMonthv", (void *)&SC_month },
4177349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z6rsYearv", (void *)&SC_year },
4187349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z14rsUptimeMillisv", (void*)&SC_uptimeMillis },
4197349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z13rsUptimeNanosv", (void*)&SC_uptimeNanos },
4207349547db61d2d458b31c074b902d56d082e5d84Jason Sams    { "_Z7rsGetDtv", (void*)&SC_getDt },
421ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams
422ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    { "_Z14rsSendToClienti", (void *)&SC_toClient },
423ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    { "_Z14rsSendToClientiPKvj", (void *)&SC_toClient2 },
424ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    { "_Z22rsSendToClientBlockingi", (void *)&SC_toClientBlocking },
425ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_toClientBlocking2 },
42622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
427ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams    { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach },
428ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams    //{ "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach2 },
42922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
43022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams////////////////////////////////////////////////////////////////////
43122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
432be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //{ "sinf_fast", (void *)&SC_sinf_fast },
433be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    //{ "cosf_fast", (void *)&SC_cosf_fast },
434e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
435be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    { NULL, NULL }
436e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams};
437e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
438e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Samsconst ScriptCState::SymbolTable_t * ScriptCState::lookupSymbol(const char *sym)
439e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams{
440e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    ScriptCState::SymbolTable_t *syms = gSyms;
441e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
442e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    while (syms->mPtr) {
443e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams        if (!strcmp(syms->mName, sym)) {
444e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams            return syms;
445e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams        }
446e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams        syms++;
447e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    }
448e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams    return NULL;
449e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams}
450e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
451