1fcf7231249822ff4dae852f1de1f799756689f91Jason Sams/*
24a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3fcf7231249822ff4dae852f1de1f799756689f91Jason Sams *
4fcf7231249822ff4dae852f1de1f799756689f91Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5fcf7231249822ff4dae852f1de1f799756689f91Jason Sams * you may not use this file except in compliance with the License.
6fcf7231249822ff4dae852f1de1f799756689f91Jason Sams * You may obtain a copy of the License at
7fcf7231249822ff4dae852f1de1f799756689f91Jason Sams *
8fcf7231249822ff4dae852f1de1f799756689f91Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9fcf7231249822ff4dae852f1de1f799756689f91Jason Sams *
10fcf7231249822ff4dae852f1de1f799756689f91Jason Sams * Unless required by applicable law or agreed to in writing, software
11fcf7231249822ff4dae852f1de1f799756689f91Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12fcf7231249822ff4dae852f1de1f799756689f91Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fcf7231249822ff4dae852f1de1f799756689f91Jason Sams * See the License for the specific language governing permissions and
14fcf7231249822ff4dae852f1de1f799756689f91Jason Sams * limitations under the License.
15fcf7231249822ff4dae852f1de1f799756689f91Jason Sams */
16fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
17fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsContext.h"
18fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsScriptC.h"
19fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsMatrix4x4.h"
20fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsMatrix3x3.h"
21fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsMatrix2x2.h"
22fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsRuntime.h"
23fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
24fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "utils/Timers.h"
25fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsdCore.h"
26fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
27fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsdRuntime.h"
28fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
29fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include <time.h>
30fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
31fcf7231249822ff4dae852f1de1f799756689f91Jason Samsusing namespace android;
32fcf7231249822ff4dae852f1de1f799756689f91Jason Samsusing namespace android::renderscript;
33fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
34fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#define GET_TLS()  ScriptTLSStruct * tls = \
35be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams    (ScriptTLSStruct *)pthread_getspecific(rsdgThreadTLSKey); \
36fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    Context * rsc = tls->mContext; \
37fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    ScriptC * sc = (ScriptC *) tls->mScript
38fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
39fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
40fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
41fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
42fcf7231249822ff4dae852f1de1f799756689f91Jason Sams// Allocation
43fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
44fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
45fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
46fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_AllocationSyncAll2(Allocation *a, RsAllocationUsageType source) {
47fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
48fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrAllocationSyncAll(rsc, sc, a, source);
49fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
50fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
51fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_AllocationSyncAll(Allocation *a) {
52fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
53fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrAllocationSyncAll(rsc, sc, a, RS_ALLOCATION_USAGE_SCRIPT);
54fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
55fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
56304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchoukstatic void SC_AllocationCopy1DRange(Allocation *dstAlloc,
57304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                     uint32_t dstOff,
58304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                     uint32_t dstMip,
59304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                     uint32_t count,
60304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                     Allocation *srcAlloc,
61304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                     uint32_t srcOff, uint32_t srcMip) {
62304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    GET_TLS();
638650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsrAllocationCopy1DRange(rsc, dstAlloc, dstOff, dstMip, count,
648650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                             srcAlloc, srcOff, srcMip);
65304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk}
66304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
67304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchoukstatic void SC_AllocationCopy2DRange(Allocation *dstAlloc,
68304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                     uint32_t dstXoff, uint32_t dstYoff,
69304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                     uint32_t dstMip, uint32_t dstFace,
70304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                     uint32_t width, uint32_t height,
71304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                     Allocation *srcAlloc,
72304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                     uint32_t srcXoff, uint32_t srcYoff,
73304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                     uint32_t srcMip, uint32_t srcFace) {
74304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    GET_TLS();
758650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsrAllocationCopy2DRange(rsc, dstAlloc,
768650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                             dstXoff, dstYoff, dstMip, dstFace,
778650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                             width, height,
788650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                             srcAlloc,
798650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                             srcXoff, srcYoff, srcMip, srcFace);
80304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk}
81304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
82304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
83fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
84fcf7231249822ff4dae852f1de1f799756689f91Jason Sams// Context
85fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
86fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
87fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_BindTexture(ProgramFragment *pf, uint32_t slot, Allocation *a) {
88fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
89fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrBindTexture(rsc, sc, pf, slot, a);
90fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
91fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
92fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_BindSampler(ProgramFragment *pf, uint32_t slot, Sampler *s) {
93fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
94fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrBindSampler(rsc, sc, pf, slot, s);
95fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
96fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
97fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_BindProgramStore(ProgramStore *ps) {
98fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
99fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrBindProgramStore(rsc, sc, ps);
100fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
101fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
102fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_BindProgramFragment(ProgramFragment *pf) {
103fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
104fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrBindProgramFragment(rsc, sc, pf);
105fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
106fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
107fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_BindProgramVertex(ProgramVertex *pv) {
108fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
109fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrBindProgramVertex(rsc, sc, pv);
110fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
111fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
112fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_BindProgramRaster(ProgramRaster *pr) {
113fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
114fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrBindProgramRaster(rsc, sc, pr);
115fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
116fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
117fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_BindFrameBufferObjectColorTarget(Allocation *a, uint32_t slot) {
118fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
119fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrBindFrameBufferObjectColorTarget(rsc, sc, a, slot);
120fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
121fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
122fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_BindFrameBufferObjectDepthTarget(Allocation *a) {
123fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
124fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrBindFrameBufferObjectDepthTarget(rsc, sc, a);
125fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
126fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
127fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_ClearFrameBufferObjectColorTarget(uint32_t slot) {
128fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
129fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrClearFrameBufferObjectColorTarget(rsc, sc, slot);
130fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
131fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
132fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_ClearFrameBufferObjectDepthTarget(Context *, Script *) {
133fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
134fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrClearFrameBufferObjectDepthTarget(rsc, sc);
135fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
136fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
137fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_ClearFrameBufferObjectTargets(Context *, Script *) {
138fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
139fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrClearFrameBufferObjectTargets(rsc, sc);
140fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
141fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
142fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
143fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
144fcf7231249822ff4dae852f1de1f799756689f91Jason Sams// VP
145fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
146fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
147fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_VpLoadProjectionMatrix(const rsc_Matrix *m) {
148fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
149fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrVpLoadProjectionMatrix(rsc, sc, m);
150fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
151fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
152fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_VpLoadModelMatrix(const rsc_Matrix *m) {
153fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
154fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrVpLoadModelMatrix(rsc, sc, m);
155fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
156fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
157fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_VpLoadTextureMatrix(const rsc_Matrix *m) {
158fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
159fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrVpLoadTextureMatrix(rsc, sc, m);
160fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
161fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
162fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_PfConstantColor(ProgramFragment *pf, float r, float g, float b, float a) {
163fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
164fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrPfConstantColor(rsc, sc, pf, r, g, b, a);
165fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
166fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
167fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_VpGetProjectionMatrix(rsc_Matrix *m) {
168fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
169fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrVpGetProjectionMatrix(rsc, sc, m);
170fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
171fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
172fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
173fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
174fcf7231249822ff4dae852f1de1f799756689f91Jason Sams// Drawing
175fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
176fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
177fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
178fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                                 float x2, float y2, float z2, float u2, float v2,
179fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                                 float x3, float y3, float z3, float u3, float v3,
180fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                                 float x4, float y4, float z4, float u4, float v4) {
181fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
182fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrDrawQuadTexCoords(rsc, sc,
183fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                         x1, y1, z1, u1, v1,
184fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                         x2, y2, z2, u2, v2,
185fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                         x3, y3, z3, u3, v3,
186fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                         x4, y4, z4, u4, v4);
187fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
188fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
189fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_DrawQuad(float x1, float y1, float z1,
190fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                        float x2, float y2, float z2,
191fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                        float x3, float y3, float z3,
192fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                        float x4, float y4, float z4) {
193fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
194fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrDrawQuad(rsc, sc, x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4);
195fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
196fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
197fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) {
198fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
199fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrDrawSpriteScreenspace(rsc, sc, x, y, z, w, h);
200fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
201fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
202fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_DrawRect(float x1, float y1, float x2, float y2, float z) {
203fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
204fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrDrawRect(rsc, sc, x1, y1, x2, y2, z);
205fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
206fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
207fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_DrawMesh(Mesh *m) {
208fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
209fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrDrawMesh(rsc, sc, m);
210fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
211fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
212fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_DrawMeshPrimitive(Mesh *m, uint32_t primIndex) {
213fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
214fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrDrawMeshPrimitive(rsc, sc, m, primIndex);
215fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
216fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
217fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_DrawMeshPrimitiveRange(Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len) {
218fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
219fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrDrawMeshPrimitiveRange(rsc, sc, m, primIndex, start, len);
220fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
221fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
222fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_MeshComputeBoundingBox(Mesh *m,
223fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                               float *minX, float *minY, float *minZ,
224fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                               float *maxX, float *maxY, float *maxZ) {
225fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
226fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrMeshComputeBoundingBox(rsc, sc, m, minX, minY, minZ, maxX, maxY, maxZ);
227fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
228fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
229fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
230fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
231fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
232fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//
233fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
234fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
235fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
236fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_Color(float r, float g, float b, float a) {
237fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
238fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrColor(rsc, sc, r, g, b, a);
239fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
240fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
241fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_Finish() {
242fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
243fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrFinish(rsc, sc);
244fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
245fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
246fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_ClearColor(float r, float g, float b, float a) {
247fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
248fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrClearColor(rsc, sc, r, g, b, a);
249fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
250fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
251fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_ClearDepth(float v) {
252fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
253fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrClearDepth(rsc, sc, v);
254fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
255fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
256fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic uint32_t SC_GetWidth() {
257fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
258fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrGetWidth(rsc, sc);
259fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
260fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
261fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic uint32_t SC_GetHeight() {
262fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
263fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrGetHeight(rsc, sc);
264fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
265fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
266fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_DrawTextAlloc(Allocation *a, int x, int y) {
267fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
268fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrDrawTextAlloc(rsc, sc, a, x, y);
269fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
270fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
271fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_DrawText(const char *text, int x, int y) {
272fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
273fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrDrawText(rsc, sc, text, x, y);
274fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
275fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
276fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_MeasureTextAlloc(Allocation *a,
277fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
278fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
279fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrMeasureTextAlloc(rsc, sc, a, left, right, top, bottom);
280fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
281fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
282fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_MeasureText(const char *text,
283fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
284fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
285fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrMeasureText(rsc, sc, text, left, right, top, bottom);
286fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
287fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
288fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_BindFont(Font *f) {
289fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
290fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrBindFont(rsc, sc, f);
291fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
292fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
293fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_FontColor(float r, float g, float b, float a) {
294fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
295fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrFontColor(rsc, sc, r, g, b, a);
296fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
297fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
298fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
299fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
300fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
301fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//
302fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
303fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
304fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_SetObject(ObjectBase **dst, ObjectBase * src) {
305fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
306fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrSetObject(rsc, sc, dst, src);
307fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
308fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
309fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_ClearObject(ObjectBase **dst) {
310fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
311fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrClearObject(rsc, sc, dst);
312fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
313fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
314fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic bool SC_IsObject(const ObjectBase *src) {
315fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
316fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrIsObject(rsc, sc, src);
317fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
318fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
319fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
320fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
321fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
322fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic const Allocation * SC_GetAllocation(const void *ptr) {
323fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
324fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrGetAllocation(rsc, sc, ptr);
325fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
326fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
327cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Samsstatic void SC_ForEach_SAA(Script *target,
328cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                            Allocation *in,
329cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                            Allocation *out) {
330cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams    GET_TLS();
331cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams    rsrForEach(rsc, sc, target, in, out, NULL, 0, NULL);
332cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams}
333cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams
334cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Samsstatic void SC_ForEach_SAAU(Script *target,
335cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                            Allocation *in,
336cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                            Allocation *out,
337cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                            const void *usr) {
338fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
339fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrForEach(rsc, sc, target, in, out, usr, 0, NULL);
340fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
341fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
342cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Samsstatic void SC_ForEach_SAAUS(Script *target,
343cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                             Allocation *in,
344cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                             Allocation *out,
345cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                             const void *usr,
346cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                             const RsScriptCall *call) {
347fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
348fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    rsrForEach(rsc, sc, target, in, out, usr, 0, call);
349fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
350fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
351cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Samsstatic void SC_ForEach_SAAUL(Script *target,
352cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                             Allocation *in,
353cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                             Allocation *out,
354cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                             const void *usr,
355cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                             uint32_t usrLen) {
356cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams    GET_TLS();
357cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams    rsrForEach(rsc, sc, target, in, out, usr, usrLen, NULL);
358cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams}
359cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams
360cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Samsstatic void SC_ForEach_SAAULS(Script *target,
361cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                              Allocation *in,
362cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                              Allocation *out,
363cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                              const void *usr,
364cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                              uint32_t usrLen,
365cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams                              const RsScriptCall *call) {
366cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams    GET_TLS();
367cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams    rsrForEach(rsc, sc, target, in, out, usr, usrLen, call);
368cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams}
369cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams
370fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
371fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
372fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
373fcf7231249822ff4dae852f1de1f799756689f91Jason Sams// Time routines
374fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
375fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
376fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic float SC_GetDt() {
377fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
378fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrGetDt(rsc, sc);
379fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
380fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
381fcf7231249822ff4dae852f1de1f799756689f91Jason Samstime_t SC_Time(time_t *timer) {
382fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
383fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrTime(rsc, sc, timer);
384fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
385fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
386fcf7231249822ff4dae852f1de1f799756689f91Jason Samstm* SC_LocalTime(tm *local, time_t *timer) {
387fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
388fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrLocalTime(rsc, sc, local, timer);
389fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
390fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
391fcf7231249822ff4dae852f1de1f799756689f91Jason Samsint64_t SC_UptimeMillis() {
392fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
393fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrUptimeMillis(rsc, sc);
394fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
395fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
396fcf7231249822ff4dae852f1de1f799756689f91Jason Samsint64_t SC_UptimeNanos() {
397fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
398fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrUptimeNanos(rsc, sc);
399fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
400fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
401fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
402fcf7231249822ff4dae852f1de1f799756689f91Jason Sams// Message routines
403fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
404fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
405fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic uint32_t SC_ToClient2(int cmdID, void *data, int len) {
406fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
407fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrToClient(rsc, sc, cmdID, data, len);
408fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
409fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
410fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic uint32_t SC_ToClient(int cmdID) {
411fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
412fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrToClient(rsc, sc, cmdID, NULL, 0);
413fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
414fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
415fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic uint32_t SC_ToClientBlocking2(int cmdID, void *data, int len) {
416fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
417fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrToClientBlocking(rsc, sc, cmdID, data, len);
418fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
419fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
420fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic uint32_t SC_ToClientBlocking(int cmdID) {
421fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    GET_TLS();
422fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return rsrToClientBlocking(rsc, sc, cmdID, NULL, 0);
423fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
424fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
425fcf7231249822ff4dae852f1de1f799756689f91Jason Samsint SC_divsi3(int a, int b) {
426fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return a / b;
427fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
428fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
429fcf7231249822ff4dae852f1de1f799756689f91Jason Samsint SC_modsi3(int a, int b) {
430fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return a % b;
431fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
432fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
433fcf7231249822ff4dae852f1de1f799756689f91Jason Samsunsigned int SC_udivsi3(unsigned int a, unsigned int b) {
434fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return a / b;
435fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
436fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
437fcf7231249822ff4dae852f1de1f799756689f91Jason Samsunsigned int SC_umodsi3(unsigned int a, unsigned int b) {
438fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return a % b;
439fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
440fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
441fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugF(const char *s, float f) {
442fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
443fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
444fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugFv2(const char *s, float f1, float f2) {
445fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s {%f, %f}", s, f1, f2);
446fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
447fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugFv3(const char *s, float f1, float f2, float f3) {
448fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s {%f, %f, %f}", s, f1, f2, f3);
449fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
450fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugFv4(const char *s, float f1, float f2, float f3, float f4) {
451fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
452fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
453fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugD(const char *s, double d) {
454fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
455fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
456fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugFM4v4(const char *s, const float *f) {
457fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
458fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
459fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
460fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
461fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
462fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugFM3v3(const char *s, const float *f) {
463fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
464fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
465fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
466fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
467fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugFM2v2(const char *s, const float *f) {
468fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s {%f, %f", s, f[0], f[2]);
469fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s  %f, %f}",s, f[1], f[3]);
470fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
471fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
472fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugI32(const char *s, int32_t i) {
473fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s %i  0x%x", s, i, i);
474fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
475fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugU32(const char *s, uint32_t i) {
476fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s %u  0x%x", s, i, i);
477fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
478fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugLL64(const char *s, long long ll) {
479fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s %lld  0x%llx", s, ll, ll);
480fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
481fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugULL64(const char *s, unsigned long long ll) {
482fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s %llu  0x%llx", s, ll, ll);
483fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
484fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
485fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic void SC_debugP(const char *s, const void *p) {
486fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGD("%s %p", s, p);
487fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
488fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
489fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
490fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
491fcf7231249822ff4dae852f1de1f799756689f91Jason Sams// Stub implementation
492fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//////////////////////////////////////////////////////////////////////////////
493fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
494fcf7231249822ff4dae852f1de1f799756689f91Jason Sams// llvm name mangling ref
495fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//  <builtin-type> ::= v  # void
496fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= b  # bool
497fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= c  # char
498fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= a  # signed char
499fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= h  # unsigned char
500fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= s  # short
501fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= t  # unsigned short
502fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= i  # int
503fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= j  # unsigned int
504fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= l  # long
505fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= m  # unsigned long
506fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= x  # long long, __int64
507fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= y  # unsigned long long, __int64
508fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= f  # float
509fcf7231249822ff4dae852f1de1f799756689f91Jason Sams//                 ::= d  # double
510fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
511fcf7231249822ff4dae852f1de1f799756689f91Jason Samsstatic RsdSymbolTable gSyms[] = {
512fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "memset", (void *)&memset, true },
513fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "memcpy", (void *)&memcpy, true },
514fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
515fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    // Refcounting
516fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_SetObject, true },
517fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsClearObjectP10rs_element", (void *)&SC_ClearObject, true },
518fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z10rsIsObject10rs_element", (void *)&SC_IsObject, true },
519fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
520fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_SetObject, true },
521fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsClearObjectP7rs_type", (void *)&SC_ClearObject, true },
522fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z10rsIsObject7rs_type", (void *)&SC_IsObject, true },
523fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
524fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_SetObject, true },
525fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsClearObjectP13rs_allocation", (void *)&SC_ClearObject, true },
526fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z10rsIsObject13rs_allocation", (void *)&SC_IsObject, true },
527fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
528fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_SetObject, true },
529fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsClearObjectP10rs_sampler", (void *)&SC_ClearObject, true },
530fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z10rsIsObject10rs_sampler", (void *)&SC_IsObject, true },
531fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
532fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_SetObject, true },
533fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsClearObjectP9rs_script", (void *)&SC_ClearObject, true },
534fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject, true },
535fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
536fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_SetObject, true },
537fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_ClearObject, true },
538fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z10rsIsObject7rs_mesh", (void *)&SC_IsObject, true },
539fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
540fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsSetObjectP19rs_program_fragmentS_", (void *)&SC_SetObject, true },
541fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsClearObjectP19rs_program_fragment", (void *)&SC_ClearObject, true },
542fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z10rsIsObject19rs_program_fragment", (void *)&SC_IsObject, true },
543fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
544fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsSetObjectP17rs_program_vertexS_", (void *)&SC_SetObject, true },
545fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsClearObjectP17rs_program_vertex", (void *)&SC_ClearObject, true },
546fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z10rsIsObject17rs_program_vertex", (void *)&SC_IsObject, true },
547fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
548fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsSetObjectP17rs_program_rasterS_", (void *)&SC_SetObject, true },
549fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsClearObjectP17rs_program_raster", (void *)&SC_ClearObject, true },
550fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z10rsIsObject17rs_program_raster", (void *)&SC_IsObject, true },
551fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
552fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsSetObjectP16rs_program_storeS_", (void *)&SC_SetObject, true },
553fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsClearObjectP16rs_program_store", (void *)&SC_ClearObject, true },
554fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z10rsIsObject16rs_program_store", (void *)&SC_IsObject, true },
555fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
556fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsSetObjectP7rs_fontS_", (void *)&SC_SetObject, true },
557fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsClearObjectP7rs_font", (void *)&SC_ClearObject, true },
558fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z10rsIsObject7rs_font", (void *)&SC_IsObject, true },
559fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
560fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    // Allocation ops
561fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z21rsAllocationMarkDirty13rs_allocation", (void *)&SC_AllocationSyncAll, true },
562fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z20rsgAllocationSyncAll13rs_allocation", (void *)&SC_AllocationSyncAll, false },
563fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z20rsgAllocationSyncAll13rs_allocationj", (void *)&SC_AllocationSyncAll2, false },
564304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    { "_Z20rsgAllocationSyncAll13rs_allocation24rs_allocation_usage_type", (void *)&SC_AllocationSyncAll2, false },
565fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z15rsGetAllocationPKv", (void *)&SC_GetAllocation, true },
566fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
567304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    { "_Z23rsAllocationCopy1DRange13rs_allocationjjjS_jj", (void *)&SC_AllocationCopy1DRange, false },
568304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    { "_Z23rsAllocationCopy2DRange13rs_allocationjjj26rs_allocation_cubemap_facejjS_jjjS0_", (void *)&SC_AllocationCopy2DRange, false },
569fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
570fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    // Messaging
571fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
572fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z14rsSendToClienti", (void *)&SC_ToClient, false },
573fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z14rsSendToClientiPKvj", (void *)&SC_ToClient2, false },
574fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z22rsSendToClientBlockingi", (void *)&SC_ToClientBlocking, false },
575fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_ToClientBlocking2, false },
576fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
577fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_BindProgramFragment, false },
578fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_BindProgramStore, false },
579fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_BindProgramVertex, false },
580fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_BindProgramRaster, false },
581fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_BindSampler, false },
582fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_BindTexture, false },
583fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
584fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadProjectionMatrix, false },
585fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadModelMatrix, false },
586fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadTextureMatrix, false },
587fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
588fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_VpGetProjectionMatrix, false },
589fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
590fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_PfConstantColor, false },
591fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
592fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsgGetWidthv", (void *)&SC_GetWidth, false },
593fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z12rsgGetHeightv", (void *)&SC_GetHeight, false },
594fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
595fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
596fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsgDrawRectfffff", (void *)&SC_DrawRect, false },
597fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_DrawQuad, false },
598fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_DrawQuadTexCoords, false },
599fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_DrawSpriteScreenspace, false },
600fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
601fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_DrawMesh, false },
602fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_DrawMeshPrimitive, false },
603fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_DrawMeshPrimitiveRange, false },
604fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_MeshComputeBoundingBox, false },
605fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
606fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false },
607fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false },
608fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
609fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText, false },
610fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc, false },
611fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z14rsgMeasureTextPKcPiS1_S1_S1_", (void *)&SC_MeasureText, false },
612fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z14rsgMeasureText13rs_allocationPiS0_S0_S0_", (void *)&SC_MeasureTextAlloc, false },
613fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
614fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont, false },
615fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z12rsgFontColorffff", (void *)&SC_FontColor, false },
616fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
617fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z18rsgBindColorTarget13rs_allocationj", (void *)&SC_BindFrameBufferObjectColorTarget, false },
618fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z18rsgBindDepthTarget13rs_allocation", (void *)&SC_BindFrameBufferObjectDepthTarget, false },
619fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z19rsgClearColorTargetj", (void *)&SC_ClearFrameBufferObjectColorTarget, false },
620fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z19rsgClearDepthTargetv", (void *)&SC_ClearFrameBufferObjectDepthTarget, false },
621fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z24rsgClearAllRenderTargetsv", (void *)&SC_ClearFrameBufferObjectTargets, false },
622fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
623cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams    { "_Z9rsForEach9rs_script13rs_allocationS0_", (void *)&SC_ForEach_SAA, false },
624cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams    { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach_SAAU, false },
625cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvPK16rs_script_call_t", (void *)&SC_ForEach_SAAUS, false },
626cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvj", (void *)&SC_ForEach_SAAUL, false },
627cf57dec80b3d34f09fd22693fa5a07a3f3a9ea83Jason Sams    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvjPK16rs_script_call_t", (void *)&SC_ForEach_SAAULS, false },
628fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
629fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    // time
630fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z6rsTimePi", (void *)&SC_Time, true },
631fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z11rsLocaltimeP5rs_tmPKi", (void *)&SC_LocalTime, true },
632fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z14rsUptimeMillisv", (void*)&SC_UptimeMillis, true },
633fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z13rsUptimeNanosv", (void*)&SC_UptimeNanos, true },
634fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsGetDtv", (void*)&SC_GetDt, false },
635fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
636fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    // misc
637fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z5colorffff", (void *)&SC_Color, false },
638fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z9rsgFinishv", (void *)&SC_Finish, false },
639fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
640fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    // Debug
641fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcf", (void *)&SC_debugF, true },
642fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcff", (void *)&SC_debugFv2, true },
643fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcfff", (void *)&SC_debugFv3, true },
644fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcffff", (void *)&SC_debugFv4, true },
645fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcd", (void *)&SC_debugD, true },
646fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcPK12rs_matrix4x4", (void *)&SC_debugFM4v4, true },
647fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcPK12rs_matrix3x3", (void *)&SC_debugFM3v3, true },
648fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcPK12rs_matrix2x2", (void *)&SC_debugFM2v2, true },
649fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKci", (void *)&SC_debugI32, true },
650fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcj", (void *)&SC_debugU32, true },
651fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    // Both "long" and "unsigned long" need to be redirected to their
652fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    // 64-bit counterparts, since we have hacked Slang to use 64-bit
653fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    // for "long" on Arm (to be similar to Java).
654fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcl", (void *)&SC_debugLL64, true },
655fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcm", (void *)&SC_debugULL64, true },
656fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcx", (void *)&SC_debugLL64, true },
657fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcy", (void *)&SC_debugULL64, true },
658fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { "_Z7rsDebugPKcPKv", (void *)&SC_debugP, true },
659fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
660fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    { NULL, NULL, false }
661fcf7231249822ff4dae852f1de1f799756689f91Jason Sams};
662fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
663fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
664fcf7231249822ff4dae852f1de1f799756689f91Jason Samsvoid* rsdLookupRuntimeStub(void* pContext, char const* name) {
665fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    ScriptC *s = (ScriptC *)pContext;
666fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    if (!strcmp(name, "__isThreadable")) {
667fcf7231249822ff4dae852f1de1f799756689f91Jason Sams      return (void*) s->mHal.info.isThreadable;
668fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    } else if (!strcmp(name, "__clearThreadable")) {
669fcf7231249822ff4dae852f1de1f799756689f91Jason Sams      s->mHal.info.isThreadable = false;
670fcf7231249822ff4dae852f1de1f799756689f91Jason Sams      return NULL;
671fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    }
672fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
673fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    RsdSymbolTable *syms = gSyms;
674fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    const RsdSymbolTable *sym = rsdLookupSymbolMath(name);
675fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
676fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    if (!sym) {
677fcf7231249822ff4dae852f1de1f799756689f91Jason Sams        while (syms->mPtr) {
678fcf7231249822ff4dae852f1de1f799756689f91Jason Sams            if (!strcmp(syms->mName, name)) {
679fcf7231249822ff4dae852f1de1f799756689f91Jason Sams                sym = syms;
680fcf7231249822ff4dae852f1de1f799756689f91Jason Sams            }
681fcf7231249822ff4dae852f1de1f799756689f91Jason Sams            syms++;
682fcf7231249822ff4dae852f1de1f799756689f91Jason Sams        }
683fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    }
684fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
685fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    if (sym) {
686fcf7231249822ff4dae852f1de1f799756689f91Jason Sams        s->mHal.info.isThreadable &= sym->threadable;
687fcf7231249822ff4dae852f1de1f799756689f91Jason Sams        return sym->mPtr;
688fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    }
689fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    LOGE("ScriptC sym lookup failed for %s", name);
690fcf7231249822ff4dae852f1de1f799756689f91Jason Sams    return NULL;
691fcf7231249822ff4dae852f1de1f799756689f91Jason Sams}
692fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
693fcf7231249822ff4dae852f1de1f799756689f91Jason Sams
694