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