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