Home | History | Annotate | Download | only in driver
      1 /*
      2  * Copyright (C) 2011-2012 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 "rsdCore.h"
     25 #include "rsdBcc.h"
     26 
     27 #include "rsdPath.h"
     28 #include "rsdAllocation.h"
     29 #include "rsdShaderCache.h"
     30 #include "rsdVertexArray.h"
     31 
     32 #include <time.h>
     33 
     34 using namespace android;
     35 using namespace android::renderscript;
     36 
     37 typedef float float2 __attribute__((ext_vector_type(2)));
     38 typedef float float3 __attribute__((ext_vector_type(3)));
     39 typedef float float4 __attribute__((ext_vector_type(4)));
     40 typedef double double2 __attribute__((ext_vector_type(2)));
     41 typedef double double3 __attribute__((ext_vector_type(3)));
     42 typedef double double4 __attribute__((ext_vector_type(4)));
     43 typedef char char2 __attribute__((ext_vector_type(2)));
     44 typedef char char3 __attribute__((ext_vector_type(3)));
     45 typedef char char4 __attribute__((ext_vector_type(4)));
     46 typedef unsigned char uchar2 __attribute__((ext_vector_type(2)));
     47 typedef unsigned char uchar3 __attribute__((ext_vector_type(3)));
     48 typedef unsigned char uchar4 __attribute__((ext_vector_type(4)));
     49 typedef int16_t short2 __attribute__((ext_vector_type(2)));
     50 typedef int16_t short3 __attribute__((ext_vector_type(3)));
     51 typedef int16_t short4 __attribute__((ext_vector_type(4)));
     52 typedef uint16_t ushort2 __attribute__((ext_vector_type(2)));
     53 typedef uint16_t ushort3 __attribute__((ext_vector_type(3)));
     54 typedef uint16_t ushort4 __attribute__((ext_vector_type(4)));
     55 typedef int32_t int2 __attribute__((ext_vector_type(2)));
     56 typedef int32_t int3 __attribute__((ext_vector_type(3)));
     57 typedef int32_t int4 __attribute__((ext_vector_type(4)));
     58 typedef uint32_t uint2 __attribute__((ext_vector_type(2)));
     59 typedef uint32_t uint3 __attribute__((ext_vector_type(3)));
     60 typedef uint32_t uint4 __attribute__((ext_vector_type(4)));
     61 typedef int64_t long2 __attribute__((ext_vector_type(2)));
     62 typedef int64_t long3 __attribute__((ext_vector_type(3)));
     63 typedef int64_t long4 __attribute__((ext_vector_type(4)));
     64 typedef uint64_t ulong2 __attribute__((ext_vector_type(2)));
     65 typedef uint64_t ulong3 __attribute__((ext_vector_type(3)));
     66 typedef uint64_t ulong4 __attribute__((ext_vector_type(4)));
     67 
     68 typedef uint8_t uchar;
     69 typedef uint16_t ushort;
     70 typedef uint32_t uint;
     71 #ifndef RS_SERVER
     72 typedef uint64_t ulong;
     73 #endif
     74 
     75 #ifdef RS_COMPATIBILITY_LIB
     76 #define OPAQUETYPE(t) \
     77     typedef struct { const int* const p; } __attribute__((packed, aligned(4))) t;
     78 
     79 OPAQUETYPE(rs_element)
     80 OPAQUETYPE(rs_type)
     81 OPAQUETYPE(rs_allocation)
     82 OPAQUETYPE(rs_sampler)
     83 OPAQUETYPE(rs_script)
     84 OPAQUETYPE(rs_script_call)
     85 #undef OPAQUETYPE
     86 
     87 typedef enum {
     88     // Empty to avoid conflicting definitions with RsAllocationCubemapFace
     89 } rs_allocation_cubemap_face;
     90 
     91 typedef struct {
     92     int tm_sec;     ///< seconds
     93     int tm_min;     ///< minutes
     94     int tm_hour;    ///< hours
     95     int tm_mday;    ///< day of the month
     96     int tm_mon;     ///< month
     97     int tm_year;    ///< year
     98     int tm_wday;    ///< day of the week
     99     int tm_yday;    ///< day of the year
    100     int tm_isdst;   ///< daylight savings time
    101 } rs_tm;
    102 #endif
    103 
    104 //////////////////////////////////////////////////////////////////////////////
    105 // Allocation
    106 //////////////////////////////////////////////////////////////////////////////
    107 
    108 
    109 static void SC_AllocationSyncAll2(android::renderscript::rs_allocation a, RsAllocationUsageType source) {
    110     Context *rsc = RsdCpuReference::getTlsContext();
    111     rsrAllocationSyncAll(rsc, (Allocation*)a.p, source);
    112 }
    113 
    114 static void SC_AllocationSyncAll(android::renderscript::rs_allocation a) {
    115     Context *rsc = RsdCpuReference::getTlsContext();
    116     rsrAllocationSyncAll(rsc, (Allocation*)a.p, RS_ALLOCATION_USAGE_SCRIPT);
    117 }
    118 
    119 #ifndef RS_COMPATIBILITY_LIB
    120 
    121 static void SC_AllocationCopy1DRange(android::renderscript::rs_allocation dstAlloc,
    122                                      uint32_t dstOff,
    123                                      uint32_t dstMip,
    124                                      uint32_t count,
    125                                      android::renderscript::rs_allocation srcAlloc,
    126                                      uint32_t srcOff, uint32_t srcMip) {
    127     Context *rsc = RsdCpuReference::getTlsContext();
    128     rsrAllocationCopy1DRange(rsc, (Allocation*)dstAlloc.p, dstOff, dstMip, count,
    129                              (Allocation*)srcAlloc.p, srcOff, srcMip);
    130 }
    131 
    132 static void SC_AllocationCopy2DRange(android::renderscript::rs_allocation dstAlloc,
    133                                      uint32_t dstXoff, uint32_t dstYoff,
    134                                      uint32_t dstMip, uint32_t dstFace,
    135                                      uint32_t width, uint32_t height,
    136                                      android::renderscript::rs_allocation srcAlloc,
    137                                      uint32_t srcXoff, uint32_t srcYoff,
    138                                      uint32_t srcMip, uint32_t srcFace) {
    139     Context *rsc = RsdCpuReference::getTlsContext();
    140     rsrAllocationCopy2DRange(rsc, (Allocation*)dstAlloc.p,
    141                              dstXoff, dstYoff, dstMip, dstFace,
    142                              width, height,
    143                              (Allocation*)srcAlloc.p,
    144                              srcXoff, srcYoff, srcMip, srcFace);
    145 }
    146 
    147 static void SC_AllocationIoSend(android::renderscript::rs_allocation alloc) {
    148     Context *rsc = RsdCpuReference::getTlsContext();
    149     rsrAllocationIoSend(rsc, (Allocation*)alloc.p);
    150 }
    151 
    152 
    153 static void SC_AllocationIoReceive(android::renderscript::rs_allocation alloc) {
    154     Context *rsc = RsdCpuReference::getTlsContext();
    155     rsrAllocationIoReceive(rsc, (Allocation*)alloc.p);
    156 }
    157 
    158 #else
    159 
    160 static void SC_AllocationCopy1DRange(::rs_allocation dstAlloc,
    161                                      uint32_t dstOff,
    162                                      uint32_t dstMip,
    163                                      uint32_t count,
    164                                      ::rs_allocation srcAlloc,
    165                                      uint32_t srcOff, uint32_t srcMip) {
    166     Context *rsc = RsdCpuReference::getTlsContext();
    167     rsrAllocationCopy1DRange(rsc, (Allocation*)dstAlloc.p, dstOff, dstMip, count,
    168                              (Allocation*)srcAlloc.p, srcOff, srcMip);
    169 }
    170 
    171 static void SC_AllocationCopy2DRange(::rs_allocation dstAlloc,
    172                                      uint32_t dstXoff, uint32_t dstYoff,
    173                                      uint32_t dstMip, uint32_t dstFace,
    174                                      uint32_t width, uint32_t height,
    175                                      ::rs_allocation srcAlloc,
    176                                      uint32_t srcXoff, uint32_t srcYoff,
    177                                      uint32_t srcMip, uint32_t srcFace) {
    178     Context *rsc = RsdCpuReference::getTlsContext();
    179     rsrAllocationCopy2DRange(rsc, (Allocation*)dstAlloc.p,
    180                              dstXoff, dstYoff, dstMip, dstFace,
    181                              width, height,
    182                              (Allocation*)srcAlloc.p,
    183                              srcXoff, srcYoff, srcMip, srcFace);
    184 }
    185 
    186 static void SC_AllocationIoSend(Allocation* alloc) {
    187     Context *rsc = RsdCpuReference::getTlsContext();
    188     rsrAllocationIoSend(rsc, alloc);
    189 }
    190 
    191 
    192 static void SC_AllocationIoReceive(Allocation* alloc) {
    193     Context *rsc = RsdCpuReference::getTlsContext();
    194     rsrAllocationIoReceive(rsc, alloc);
    195 }
    196 
    197 #endif
    198 
    199 #ifndef RS_COMPATIBILITY_LIB
    200 
    201 //////////////////////////////////////////////////////////////////////////////
    202 // Context
    203 //////////////////////////////////////////////////////////////////////////////
    204 
    205 static void SC_BindTexture(ProgramFragment *pf, uint32_t slot, Allocation *a) {
    206     Context *rsc = RsdCpuReference::getTlsContext();
    207     rsrBindTexture(rsc, pf, slot, a);
    208 }
    209 
    210 static void SC_BindVertexConstant(ProgramVertex *pv, uint32_t slot, Allocation *a) {
    211     Context *rsc = RsdCpuReference::getTlsContext();
    212     rsrBindConstant(rsc, pv, slot, a);
    213 }
    214 
    215 static void SC_BindFragmentConstant(ProgramFragment *pf, uint32_t slot, Allocation *a) {
    216     Context *rsc = RsdCpuReference::getTlsContext();
    217     rsrBindConstant(rsc, pf, slot, a);
    218 }
    219 
    220 static void SC_BindSampler(ProgramFragment *pf, uint32_t slot, Sampler *s) {
    221     Context *rsc = RsdCpuReference::getTlsContext();
    222     rsrBindSampler(rsc, pf, slot, s);
    223 }
    224 
    225 static void SC_BindProgramStore(ProgramStore *ps) {
    226     Context *rsc = RsdCpuReference::getTlsContext();
    227     rsrBindProgramStore(rsc, ps);
    228 }
    229 
    230 static void SC_BindProgramFragment(ProgramFragment *pf) {
    231     Context *rsc = RsdCpuReference::getTlsContext();
    232     rsrBindProgramFragment(rsc, pf);
    233 }
    234 
    235 static void SC_BindProgramVertex(ProgramVertex *pv) {
    236     Context *rsc = RsdCpuReference::getTlsContext();
    237     rsrBindProgramVertex(rsc, pv);
    238 }
    239 
    240 static void SC_BindProgramRaster(ProgramRaster *pr) {
    241     Context *rsc = RsdCpuReference::getTlsContext();
    242     rsrBindProgramRaster(rsc, pr);
    243 }
    244 
    245 static void SC_BindFrameBufferObjectColorTarget(Allocation *a, uint32_t slot) {
    246     Context *rsc = RsdCpuReference::getTlsContext();
    247     rsrBindFrameBufferObjectColorTarget(rsc, a, slot);
    248 }
    249 
    250 static void SC_BindFrameBufferObjectDepthTarget(Allocation *a) {
    251     Context *rsc = RsdCpuReference::getTlsContext();
    252     rsrBindFrameBufferObjectDepthTarget(rsc, a);
    253 }
    254 
    255 static void SC_ClearFrameBufferObjectColorTarget(uint32_t slot) {
    256     Context *rsc = RsdCpuReference::getTlsContext();
    257     rsrClearFrameBufferObjectColorTarget(rsc, slot);
    258 }
    259 
    260 static void SC_ClearFrameBufferObjectDepthTarget(Context *, Script *) {
    261     Context *rsc = RsdCpuReference::getTlsContext();
    262     rsrClearFrameBufferObjectDepthTarget(rsc);
    263 }
    264 
    265 static void SC_ClearFrameBufferObjectTargets(Context *, Script *) {
    266     Context *rsc = RsdCpuReference::getTlsContext();
    267     rsrClearFrameBufferObjectTargets(rsc);
    268 }
    269 
    270 
    271 //////////////////////////////////////////////////////////////////////////////
    272 // VP
    273 //////////////////////////////////////////////////////////////////////////////
    274 
    275 static void SC_VpLoadProjectionMatrix(const rsc_Matrix *m) {
    276     Context *rsc = RsdCpuReference::getTlsContext();
    277     rsrVpLoadProjectionMatrix(rsc, m);
    278 }
    279 
    280 static void SC_VpLoadModelMatrix(const rsc_Matrix *m) {
    281     Context *rsc = RsdCpuReference::getTlsContext();
    282     rsrVpLoadModelMatrix(rsc, m);
    283 }
    284 
    285 static void SC_VpLoadTextureMatrix(const rsc_Matrix *m) {
    286     Context *rsc = RsdCpuReference::getTlsContext();
    287     rsrVpLoadTextureMatrix(rsc, m);
    288 }
    289 
    290 static void SC_PfConstantColor(ProgramFragment *pf, float r, float g, float b, float a) {
    291     Context *rsc = RsdCpuReference::getTlsContext();
    292     rsrPfConstantColor(rsc, pf, r, g, b, a);
    293 }
    294 
    295 static void SC_VpGetProjectionMatrix(rsc_Matrix *m) {
    296     Context *rsc = RsdCpuReference::getTlsContext();
    297     rsrVpGetProjectionMatrix(rsc, m);
    298 }
    299 
    300 
    301 //////////////////////////////////////////////////////////////////////////////
    302 // Drawing
    303 //////////////////////////////////////////////////////////////////////////////
    304 
    305 static void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
    306                                  float x2, float y2, float z2, float u2, float v2,
    307                                  float x3, float y3, float z3, float u3, float v3,
    308                                  float x4, float y4, float z4, float u4, float v4) {
    309     Context *rsc = RsdCpuReference::getTlsContext();
    310 
    311     if (!rsc->setupCheck()) {
    312         return;
    313     }
    314 
    315     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
    316     if (!dc->gl.shaderCache->setup(rsc)) {
    317         return;
    318     }
    319 
    320     //ALOGE("Quad");
    321     //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
    322     //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
    323     //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
    324     //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
    325 
    326     float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
    327     const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
    328 
    329     RsdVertexArray::Attrib attribs[2];
    330     attribs[0].set(GL_FLOAT, 3, 12, false, (size_t)vtx, "ATTRIB_position");
    331     attribs[1].set(GL_FLOAT, 2, 8, false, (size_t)tex, "ATTRIB_texture0");
    332 
    333     RsdVertexArray va(attribs, 2);
    334     va.setup(rsc);
    335 
    336     RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
    337 }
    338 
    339 static void SC_DrawQuad(float x1, float y1, float z1,
    340                         float x2, float y2, float z2,
    341                         float x3, float y3, float z3,
    342                         float x4, float y4, float z4) {
    343     SC_DrawQuadTexCoords(x1, y1, z1, 0, 1,
    344                          x2, y2, z2, 1, 1,
    345                          x3, y3, z3, 1, 0,
    346                          x4, y4, z4, 0, 0);
    347 }
    348 
    349 static void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) {
    350     Context *rsc = RsdCpuReference::getTlsContext();
    351 
    352     ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
    353     rsc->setProgramVertex(rsc->getDefaultProgramVertex());
    354     //rsc->setupCheck();
    355 
    356     //GLint crop[4] = {0, h, w, -h};
    357 
    358     float sh = rsc->getHeight();
    359 
    360     SC_DrawQuad(x,   sh - y,     z,
    361                 x+w, sh - y,     z,
    362                 x+w, sh - (y+h), z,
    363                 x,   sh - (y+h), z);
    364     rsc->setProgramVertex((ProgramVertex *)tmp.get());
    365 }
    366 
    367 static void SC_DrawRect(float x1, float y1, float x2, float y2, float z) {
    368     SC_DrawQuad(x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
    369 }
    370 
    371 static void SC_DrawPath(Path *p) {
    372     Context *rsc = RsdCpuReference::getTlsContext();
    373     rsdPathDraw(rsc, p);
    374 }
    375 
    376 static void SC_DrawMesh(Mesh *m) {
    377     Context *rsc = RsdCpuReference::getTlsContext();
    378     rsrDrawMesh(rsc, m);
    379 }
    380 
    381 static void SC_DrawMeshPrimitive(Mesh *m, uint32_t primIndex) {
    382     Context *rsc = RsdCpuReference::getTlsContext();
    383     rsrDrawMeshPrimitive(rsc, m, primIndex);
    384 }
    385 
    386 static void SC_DrawMeshPrimitiveRange(Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len) {
    387     Context *rsc = RsdCpuReference::getTlsContext();
    388     rsrDrawMeshPrimitiveRange(rsc, m, primIndex, start, len);
    389 }
    390 
    391 static void SC_MeshComputeBoundingBox(Mesh *m,
    392                                float *minX, float *minY, float *minZ,
    393                                float *maxX, float *maxY, float *maxZ) {
    394     Context *rsc = RsdCpuReference::getTlsContext();
    395     rsrMeshComputeBoundingBox(rsc, m, minX, minY, minZ, maxX, maxY, maxZ);
    396 }
    397 
    398 
    399 
    400 //////////////////////////////////////////////////////////////////////////////
    401 //
    402 //////////////////////////////////////////////////////////////////////////////
    403 
    404 
    405 static void SC_Color(float r, float g, float b, float a) {
    406     Context *rsc = RsdCpuReference::getTlsContext();
    407     rsrColor(rsc, r, g, b, a);
    408 }
    409 
    410 static void SC_Finish() {
    411     Context *rsc = RsdCpuReference::getTlsContext();
    412     rsdGLFinish(rsc);
    413 }
    414 
    415 static void SC_ClearColor(float r, float g, float b, float a) {
    416     Context *rsc = RsdCpuReference::getTlsContext();
    417     rsrPrepareClear(rsc);
    418     rsdGLClearColor(rsc, r, g, b, a);
    419 }
    420 
    421 static void SC_ClearDepth(float v) {
    422     Context *rsc = RsdCpuReference::getTlsContext();
    423     rsrPrepareClear(rsc);
    424     rsdGLClearDepth(rsc, v);
    425 }
    426 
    427 static uint32_t SC_GetWidth() {
    428     Context *rsc = RsdCpuReference::getTlsContext();
    429     return rsrGetWidth(rsc);
    430 }
    431 
    432 static uint32_t SC_GetHeight() {
    433     Context *rsc = RsdCpuReference::getTlsContext();
    434     return rsrGetHeight(rsc);
    435 }
    436 
    437 static void SC_DrawTextAlloc(Allocation *a, int x, int y) {
    438     Context *rsc = RsdCpuReference::getTlsContext();
    439     rsrDrawTextAlloc(rsc, a, x, y);
    440 }
    441 
    442 static void SC_DrawText(const char *text, int x, int y) {
    443     Context *rsc = RsdCpuReference::getTlsContext();
    444     rsrDrawText(rsc, text, x, y);
    445 }
    446 
    447 static void SC_MeasureTextAlloc(Allocation *a,
    448                          int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
    449     Context *rsc = RsdCpuReference::getTlsContext();
    450     rsrMeasureTextAlloc(rsc, a, left, right, top, bottom);
    451 }
    452 
    453 static void SC_MeasureText(const char *text,
    454                     int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
    455     Context *rsc = RsdCpuReference::getTlsContext();
    456     rsrMeasureText(rsc, text, left, right, top, bottom);
    457 }
    458 
    459 static void SC_BindFont(Font *f) {
    460     Context *rsc = RsdCpuReference::getTlsContext();
    461     rsrBindFont(rsc, f);
    462 }
    463 
    464 static void SC_FontColor(float r, float g, float b, float a) {
    465     Context *rsc = RsdCpuReference::getTlsContext();
    466     rsrFontColor(rsc, r, g, b, a);
    467 }
    468 #endif
    469 
    470 
    471 //////////////////////////////////////////////////////////////////////////////
    472 //
    473 //////////////////////////////////////////////////////////////////////////////
    474 
    475 static void SC_ClearObject(rs_object_base *dst) {
    476     Context *rsc = RsdCpuReference::getTlsContext();
    477     rsrClearObject(rsc, dst);
    478 }
    479 #ifndef RS_COMPATIBILITY_LIB
    480 static void SC_SetObject(rs_object_base *dst, rs_object_base  src) {
    481     //    ALOGE("SC_SetObject: dst = %p, src = %p", dst, src.p);
    482     //    ALOGE("SC_SetObject: dst[0] = %p", dst[0]);
    483     Context *rsc = RsdCpuReference::getTlsContext();
    484     rsrSetObject(rsc, dst, (ObjectBase*)src.p);
    485 }
    486 
    487 #ifdef __LP64__
    488 static void SC_SetObject_ByRef(rs_object_base *dst, rs_object_base *src) {
    489     //    ALOGE("SC_SetObject2: dst = %p, src = %p", dst, src->p);
    490     Context *rsc = RsdCpuReference::getTlsContext();
    491     rsrSetObject(rsc, dst, (ObjectBase*)src->p);
    492 }
    493 #endif
    494 
    495 static bool SC_IsObject(rs_object_base o) {
    496     Context *rsc = RsdCpuReference::getTlsContext();
    497     return rsrIsObject(rsc, o);
    498 }
    499 
    500 #ifdef __LP64__
    501 static bool SC_IsObject_ByRef(rs_object_base *o) {
    502     Context *rsc = RsdCpuReference::getTlsContext();
    503     return rsrIsObject(rsc, *o);
    504 }
    505 #endif
    506 
    507 #else
    508 static void SC_SetObject(rs_object_base *dst, ObjectBase*  src) {
    509     //    ALOGE("SC_SetObject: dst = %p, src = %p", dst, src.p);
    510     //    ALOGE("SC_SetObject: dst[0] = %p", dst[0]);
    511     Context *rsc = RsdCpuReference::getTlsContext();
    512     rsrSetObject(rsc, dst, src);
    513 }
    514 
    515 static bool SC_IsObject(ObjectBase* o) {
    516     Context *rsc = RsdCpuReference::getTlsContext();
    517     return rsrIsObject(rsc, o);
    518 }
    519 #endif
    520 
    521 
    522 #ifndef RS_COMPATIBILITY_LIB
    523 #ifndef __LP64__
    524 
    525 // i386 has different struct return passing to ARM; emulate with void*
    526 #ifdef __i386__
    527 static const void* SC_GetAllocation(const void *ptr) {
    528     Context *rsc = RsdCpuReference::getTlsContext();
    529     const Script *sc = RsdCpuReference::getTlsScript();
    530     Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
    531     android::renderscript::rs_allocation obj = {0};
    532     alloc->callUpdateCacheObject(rsc, &obj);
    533     return (void*)obj.p;
    534 }
    535 #else
    536 // ARMv7/MIPS
    537 static const android::renderscript::rs_allocation SC_GetAllocation(const void *ptr) {
    538     Context *rsc = RsdCpuReference::getTlsContext();
    539     const Script *sc = RsdCpuReference::getTlsScript();
    540     Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
    541     android::renderscript::rs_allocation obj = {0};
    542     alloc->callUpdateCacheObject(rsc, &obj);
    543     return obj;
    544 }
    545 #endif
    546 #else
    547 // AArch64/x86_64/MIPS64
    548 static const android::renderscript::rs_allocation SC_GetAllocation(const void *ptr) {
    549     Context *rsc = RsdCpuReference::getTlsContext();
    550     const Script *sc = RsdCpuReference::getTlsScript();
    551     Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
    552     android::renderscript::rs_allocation obj = {0, 0, 0, 0};
    553     alloc->callUpdateCacheObject(rsc, &obj);
    554     return obj;
    555 }
    556 #endif
    557 #endif
    558 
    559 #ifndef RS_COMPATIBILITY_LIB
    560 #ifndef __LP64__
    561 static void SC_ForEach_SAA(android::renderscript::rs_script target,
    562                             android::renderscript::rs_allocation in,
    563                             android::renderscript::rs_allocation out) {
    564     Context *rsc = RsdCpuReference::getTlsContext();
    565     rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, NULL, 0, NULL);
    566 }
    567 #else
    568 static void SC_ForEach_SAA(android::renderscript::rs_script *target,
    569                             android::renderscript::rs_allocation *in,
    570                             android::renderscript::rs_allocation *out) {
    571     Context *rsc = RsdCpuReference::getTlsContext();
    572     rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, NULL, 0, NULL);
    573 }
    574 #endif
    575 
    576 #ifndef __LP64__
    577 static void SC_ForEach_SAAU(android::renderscript::rs_script target,
    578                             android::renderscript::rs_allocation in,
    579                             android::renderscript::rs_allocation out,
    580                             const void *usr) {
    581     Context *rsc = RsdCpuReference::getTlsContext();
    582     rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, 0, NULL);
    583 }
    584 #else
    585 static void SC_ForEach_SAAU(android::renderscript::rs_script *target,
    586                             android::renderscript::rs_allocation *in,
    587                             android::renderscript::rs_allocation *out,
    588                             const void *usr) {
    589     Context *rsc = RsdCpuReference::getTlsContext();
    590     rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, 0, NULL);
    591 }
    592 #endif
    593 
    594 #ifndef __LP64__
    595 static void SC_ForEach_SAAUS(android::renderscript::rs_script target,
    596                              android::renderscript::rs_allocation in,
    597                              android::renderscript::rs_allocation out,
    598                              const void *usr,
    599                              const RsScriptCall *call) {
    600     Context *rsc = RsdCpuReference::getTlsContext();
    601     rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, 0, call);
    602 }
    603 #else
    604 static void SC_ForEach_SAAUS(android::renderscript::rs_script *target,
    605                              android::renderscript::rs_allocation *in,
    606                              android::renderscript::rs_allocation *out,
    607                              const void *usr,
    608                              const RsScriptCall *call) {
    609     Context *rsc = RsdCpuReference::getTlsContext();
    610     rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, 0, call);
    611 }
    612 #endif
    613 
    614 #ifndef __LP64__
    615 static void SC_ForEach_SAAUL(android::renderscript::rs_script target,
    616                              android::renderscript::rs_allocation in,
    617                              android::renderscript::rs_allocation out,
    618                              const void *usr,
    619                              uint32_t usrLen) {
    620     Context *rsc = RsdCpuReference::getTlsContext();
    621     rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, NULL);
    622 }
    623 #else
    624 static void SC_ForEach_SAAUL(android::renderscript::rs_script *target,
    625                              android::renderscript::rs_allocation *in,
    626                              android::renderscript::rs_allocation *out,
    627                              const void *usr,
    628                              uint32_t usrLen) {
    629     Context *rsc = RsdCpuReference::getTlsContext();
    630     rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, usrLen, NULL);
    631 }
    632 #endif
    633 
    634 #ifndef __LP64__
    635 static void SC_ForEach_SAAULS(android::renderscript::rs_script target,
    636                               android::renderscript::rs_allocation in,
    637                               android::renderscript::rs_allocation out,
    638                               const void *usr,
    639                               uint32_t usrLen,
    640                               const RsScriptCall *call) {
    641     Context *rsc = RsdCpuReference::getTlsContext();
    642     rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, call);
    643 }
    644 #else
    645 static void SC_ForEach_SAAULS(android::renderscript::rs_script *target,
    646                               android::renderscript::rs_allocation *in,
    647                               android::renderscript::rs_allocation *out,
    648                               const void *usr,
    649                               uint32_t usrLen,
    650                               const RsScriptCall *call) {
    651     Context *rsc = RsdCpuReference::getTlsContext();
    652     rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, usrLen, call);
    653 }
    654 #endif
    655 #endif
    656 
    657 
    658 //////////////////////////////////////////////////////////////////////////////
    659 // Time routines
    660 //////////////////////////////////////////////////////////////////////////////
    661 
    662 static float SC_GetDt() {
    663     Context *rsc = RsdCpuReference::getTlsContext();
    664     const Script *sc = RsdCpuReference::getTlsScript();
    665     return rsrGetDt(rsc, sc);
    666 }
    667 
    668 #ifndef RS_COMPATIBILITY_LIB
    669 time_t SC_Time(time_t *timer) {
    670     Context *rsc = RsdCpuReference::getTlsContext();
    671     return rsrTime(rsc, timer);
    672 }
    673 #else
    674 static int SC_Time(int *timer) {
    675     Context *rsc = RsdCpuReference::getTlsContext();
    676     return rsrTime(rsc, (long*)timer);
    677 }
    678 #endif
    679 
    680 tm* SC_LocalTime(tm *local, time_t *timer) {
    681     Context *rsc = RsdCpuReference::getTlsContext();
    682     return rsrLocalTime(rsc, local, timer);
    683 }
    684 
    685 int64_t SC_UptimeMillis() {
    686     Context *rsc = RsdCpuReference::getTlsContext();
    687     return rsrUptimeMillis(rsc);
    688 }
    689 
    690 int64_t SC_UptimeNanos() {
    691     Context *rsc = RsdCpuReference::getTlsContext();
    692     return rsrUptimeNanos(rsc);
    693 }
    694 
    695 //////////////////////////////////////////////////////////////////////////////
    696 // Message routines
    697 //////////////////////////////////////////////////////////////////////////////
    698 
    699 static uint32_t SC_ToClient2(int cmdID, const void *data, uint32_t len) {
    700     Context *rsc = RsdCpuReference::getTlsContext();
    701     return rsrToClient(rsc, cmdID, data, len);
    702 }
    703 
    704 static uint32_t SC_ToClient(int cmdID) {
    705     Context *rsc = RsdCpuReference::getTlsContext();
    706     return rsrToClient(rsc, cmdID, (const void *)NULL, 0);
    707 }
    708 
    709 static uint32_t SC_ToClientBlocking2(int cmdID, const void *data, uint32_t len) {
    710     Context *rsc = RsdCpuReference::getTlsContext();
    711     return rsrToClientBlocking(rsc, cmdID, data, len);
    712 }
    713 
    714 static uint32_t SC_ToClientBlocking(int cmdID) {
    715     Context *rsc = RsdCpuReference::getTlsContext();
    716     return rsrToClientBlocking(rsc, cmdID, (const void *)NULL, 0);
    717 }
    718 
    719 
    720 static void * ElementAt1D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x) {
    721     Context *rsc = RsdCpuReference::getTlsContext();
    722     const Type *t = a->getType();
    723     const Element *e = t->getElement();
    724 
    725     char buf[256];
    726     if (x >= t->getLODDimX(0)) {
    727         sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
    728         rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    729         return NULL;
    730     }
    731 
    732     if (vecSize > 0) {
    733         if (vecSize != e->getVectorSize()) {
    734             sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
    735             rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    736             return NULL;
    737         }
    738 
    739         if (dt != e->getType()) {
    740             sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
    741             rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    742             return NULL;
    743         }
    744     }
    745 
    746     uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
    747     const uint32_t eSize = e->getSizeBytes();
    748     return &p[(eSize * x)];
    749 }
    750 
    751 static void * ElementAt2D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x, uint32_t y) {
    752     Context *rsc = RsdCpuReference::getTlsContext();
    753     const Type *t = a->getType();
    754     const Element *e = t->getElement();
    755 
    756     char buf[256];
    757     if (x >= t->getLODDimX(0)) {
    758         sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
    759         rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    760         return NULL;
    761     }
    762 
    763     if (y >= t->getLODDimY(0)) {
    764         sprintf(buf, "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
    765         rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    766         return NULL;
    767     }
    768 
    769     if (vecSize > 0) {
    770         if (vecSize != e->getVectorSize()) {
    771             sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
    772             rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    773             return NULL;
    774         }
    775 
    776         if (dt != e->getType()) {
    777             sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
    778             rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    779             return NULL;
    780         }
    781     }
    782 
    783     uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
    784     const uint32_t eSize = e->getSizeBytes();
    785     const uint32_t stride = a->mHal.drvState.lod[0].stride;
    786     return &p[(eSize * x) + (y * stride)];
    787 }
    788 
    789 static void * ElementAt3D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x, uint32_t y, uint32_t z) {
    790     Context *rsc = RsdCpuReference::getTlsContext();
    791     const Type *t = a->getType();
    792     const Element *e = t->getElement();
    793 
    794     char buf[256];
    795     if (x >= t->getLODDimX(0)) {
    796         sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
    797         rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    798         return NULL;
    799     }
    800 
    801     if (y >= t->getLODDimY(0)) {
    802         sprintf(buf, "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
    803         rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    804         return NULL;
    805     }
    806 
    807     if (z >= t->getLODDimZ(0)) {
    808         sprintf(buf, "Out range ElementAt Z %i of %i", z, t->getLODDimZ(0));
    809         rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    810         return NULL;
    811     }
    812 
    813     if (vecSize > 0) {
    814         if (vecSize != e->getVectorSize()) {
    815             sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
    816             rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    817             return NULL;
    818         }
    819 
    820         if (dt != e->getType()) {
    821             sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
    822             rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
    823             return NULL;
    824         }
    825     }
    826 
    827     uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
    828     const uint32_t eSize = e->getSizeBytes();
    829     const uint32_t stride = a->mHal.drvState.lod[0].stride;
    830     return &p[(eSize * x) + (y * stride)];
    831 }
    832 
    833 static const void * SC_GetElementAt1D(android::renderscript::rs_allocation a, uint32_t x) {
    834     return ElementAt1D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x);
    835 }
    836 static const void * SC_GetElementAt2D(android::renderscript::rs_allocation a, uint32_t x, uint32_t y) {
    837     return ElementAt2D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y);
    838 }
    839 static const void * SC_GetElementAt3D(android::renderscript::rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
    840     return ElementAt3D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
    841 }
    842 
    843 static void SC_SetElementAt1D(android::renderscript::rs_allocation a, const void *ptr, uint32_t x) {
    844     const Type *t = ((Allocation*)a.p)->getType();
    845     const Element *e = t->getElement();
    846     void *tmp = ElementAt1D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x);
    847     if (tmp != NULL) {
    848         memcpy(tmp, ptr, e->getSizeBytes());
    849     }
    850 }
    851 static void SC_SetElementAt2D(android::renderscript::rs_allocation a, const void *ptr, uint32_t x, uint32_t y) {
    852     const Type *t = ((Allocation*)a.p)->getType();
    853     const Element *e = t->getElement();
    854     void *tmp = ElementAt2D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y);
    855     if (tmp != NULL) {
    856         memcpy(tmp, ptr, e->getSizeBytes());
    857     }
    858 }
    859 static void SC_SetElementAt3D(android::renderscript::rs_allocation a, const void *ptr, uint32_t x, uint32_t y, uint32_t z) {
    860     const Type *t = ((Allocation*)a.p)->getType();
    861     const Element *e = t->getElement();
    862     void *tmp = ElementAt3D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
    863     if (tmp != NULL) {
    864         memcpy(tmp, ptr, e->getSizeBytes());
    865     }
    866 }
    867 
    868 #define ELEMENT_AT(T, DT, VS)                                               \
    869     static void SC_SetElementAt1_##T(android::renderscript::rs_allocation a, const T *val, uint32_t x) { \
    870         void *r = ElementAt1D((Allocation*)a.p, DT, VS, x);               \
    871         if (r != NULL) ((T *)r)[0] = *val;                               \
    872         else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
    873     }                                                                   \
    874     static void SC_SetElementAt2_##T(android::renderscript::rs_allocation a, const T * val, uint32_t x, uint32_t y) { \
    875         void *r = ElementAt2D((Allocation*)a.p, DT, VS, x, y);            \
    876         if (r != NULL) ((T *)r)[0] = *val;                               \
    877         else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
    878     }                                                                   \
    879     static void SC_SetElementAt3_##T(android::renderscript::rs_allocation a, const T * val, uint32_t x, uint32_t y, uint32_t z) { \
    880         void *r = ElementAt3D((Allocation*)a.p, DT, VS, x, y, z);         \
    881         if (r != NULL) ((T *)r)[0] = *val;                               \
    882         else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
    883     }                                                                   \
    884     static void SC_GetElementAt1_##T(android::renderscript::rs_allocation a, T *val, uint32_t x) {                  \
    885         void *r = ElementAt1D((Allocation*)a.p, DT, VS, x);               \
    886         if (r != NULL) *val = ((T *)r)[0];                              \
    887         else ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
    888     }                                                                   \
    889     static void SC_GetElementAt2_##T(android::renderscript::rs_allocation a, T *val, uint32_t x, uint32_t y) {      \
    890         void *r = ElementAt2D((Allocation*)a.p, DT, VS, x, y);            \
    891         if (r != NULL) *val = ((T *)r)[0];                              \
    892         else ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
    893     }                                                                   \
    894     static void SC_GetElementAt3_##T(android::renderscript::rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z) { \
    895         void *r = ElementAt3D((Allocation*)a.p, DT, VS, x, y, z);         \
    896         if (r != NULL) *val = ((T *)r)[0];                              \
    897         else ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
    898     }
    899 
    900 ELEMENT_AT(char, RS_TYPE_SIGNED_8, 1)
    901 ELEMENT_AT(char2, RS_TYPE_SIGNED_8, 2)
    902 ELEMENT_AT(char3, RS_TYPE_SIGNED_8, 3)
    903 ELEMENT_AT(char4, RS_TYPE_SIGNED_8, 4)
    904 ELEMENT_AT(uchar, RS_TYPE_UNSIGNED_8, 1)
    905 ELEMENT_AT(uchar2, RS_TYPE_UNSIGNED_8, 2)
    906 ELEMENT_AT(uchar3, RS_TYPE_UNSIGNED_8, 3)
    907 ELEMENT_AT(uchar4, RS_TYPE_UNSIGNED_8, 4)
    908 ELEMENT_AT(short, RS_TYPE_SIGNED_16, 1)
    909 ELEMENT_AT(short2, RS_TYPE_SIGNED_16, 2)
    910 ELEMENT_AT(short3, RS_TYPE_SIGNED_16, 3)
    911 ELEMENT_AT(short4, RS_TYPE_SIGNED_16, 4)
    912 ELEMENT_AT(ushort, RS_TYPE_UNSIGNED_16, 1)
    913 ELEMENT_AT(ushort2, RS_TYPE_UNSIGNED_16, 2)
    914 ELEMENT_AT(ushort3, RS_TYPE_UNSIGNED_16, 3)
    915 ELEMENT_AT(ushort4, RS_TYPE_UNSIGNED_16, 4)
    916 ELEMENT_AT(int, RS_TYPE_SIGNED_32, 1)
    917 ELEMENT_AT(int2, RS_TYPE_SIGNED_32, 2)
    918 ELEMENT_AT(int3, RS_TYPE_SIGNED_32, 3)
    919 ELEMENT_AT(int4, RS_TYPE_SIGNED_32, 4)
    920 ELEMENT_AT(uint, RS_TYPE_UNSIGNED_32, 1)
    921 ELEMENT_AT(uint2, RS_TYPE_UNSIGNED_32, 2)
    922 ELEMENT_AT(uint3, RS_TYPE_UNSIGNED_32, 3)
    923 ELEMENT_AT(uint4, RS_TYPE_UNSIGNED_32, 4)
    924 ELEMENT_AT(long, RS_TYPE_SIGNED_64, 1)
    925 ELEMENT_AT(long2, RS_TYPE_SIGNED_64, 2)
    926 ELEMENT_AT(long3, RS_TYPE_SIGNED_64, 3)
    927 ELEMENT_AT(long4, RS_TYPE_SIGNED_64, 4)
    928 ELEMENT_AT(ulong, RS_TYPE_UNSIGNED_64, 1)
    929 ELEMENT_AT(ulong2, RS_TYPE_UNSIGNED_64, 2)
    930 ELEMENT_AT(ulong3, RS_TYPE_UNSIGNED_64, 3)
    931 ELEMENT_AT(ulong4, RS_TYPE_UNSIGNED_64, 4)
    932 ELEMENT_AT(float, RS_TYPE_FLOAT_32, 1)
    933 ELEMENT_AT(float2, RS_TYPE_FLOAT_32, 2)
    934 ELEMENT_AT(float3, RS_TYPE_FLOAT_32, 3)
    935 ELEMENT_AT(float4, RS_TYPE_FLOAT_32, 4)
    936 ELEMENT_AT(double, RS_TYPE_FLOAT_64, 1)
    937 ELEMENT_AT(double2, RS_TYPE_FLOAT_64, 2)
    938 ELEMENT_AT(double3, RS_TYPE_FLOAT_64, 3)
    939 ELEMENT_AT(double4, RS_TYPE_FLOAT_64, 4)
    940 
    941 #undef ELEMENT_AT
    942 
    943 //////////////////////////////////////////////////////////////////////////////
    944 // Stub implementation
    945 //////////////////////////////////////////////////////////////////////////////
    946 
    947 // llvm name mangling ref
    948 //  <builtin-type> ::= v  # void
    949 //                 ::= b  # bool
    950 //                 ::= c  # char
    951 //                 ::= a  # signed char
    952 //                 ::= h  # unsigned char
    953 //                 ::= s  # short
    954 //                 ::= t  # unsigned short
    955 //                 ::= i  # int
    956 //                 ::= j  # unsigned int
    957 //                 ::= l  # long
    958 //                 ::= m  # unsigned long
    959 //                 ::= x  # long long, __int64
    960 //                 ::= y  # unsigned long long, __int64
    961 //                 ::= f  # float
    962 //                 ::= d  # double
    963 
    964 static RsdCpuReference::CpuSymbol gSyms[] = {
    965     // Debug runtime
    966     { "_Z14rsGetElementAt13rs_allocationj", (void *)&SC_GetElementAt1D, true },
    967     { "_Z14rsGetElementAt13rs_allocationjj", (void *)&SC_GetElementAt2D, true },
    968     { "_Z14rsGetElementAt13rs_allocationjjj", (void *)&SC_GetElementAt3D, true },
    969     { "_Z14rsSetElementAt13rs_allocationPKvj", (void *)&SC_SetElementAt1D, true },
    970     { "_Z14rsSetElementAt13rs_allocationPKvjj", (void *)&SC_SetElementAt2D, true },
    971     { "_Z14rsSetElementAt13rs_allocationPKvjjj", (void *)&SC_SetElementAt3D, true },
    972 
    973 
    974     { "_Z20rsGetElementAt_uchar13rs_allocationPhj", (void *)&SC_GetElementAt1_uchar, true },
    975     { "_Z21rsGetElementAt_uchar213rs_allocationPDv2_hj", (void *)&SC_GetElementAt1_uchar2, true },
    976     { "_Z21rsGetElementAt_uchar313rs_allocationPDv3_hj", (void *)&SC_GetElementAt1_uchar3, true },
    977     { "_Z21rsGetElementAt_uchar413rs_allocationPDv4_hj", (void *)&SC_GetElementAt1_uchar4, true },
    978     { "_Z20rsGetElementAt_uchar13rs_allocationPhjj", (void *)&SC_GetElementAt2_uchar, true },
    979     { "_Z21rsGetElementAt_uchar213rs_allocationPDv2_hjj", (void *)&SC_GetElementAt2_uchar2, true },
    980     { "_Z21rsGetElementAt_uchar313rs_allocationPDv3_hjj", (void *)&SC_GetElementAt2_uchar3, true },
    981     { "_Z21rsGetElementAt_uchar413rs_allocationPDv4_hjj", (void *)&SC_GetElementAt2_uchar4, true },
    982     { "_Z20rsGetElementAt_uchar13rs_allocationPhjjj", (void *)&SC_GetElementAt3_uchar, true },
    983     { "_Z21rsGetElementAt_uchar213rs_allocationPDv2_hjjj", (void *)&SC_GetElementAt3_uchar2, true },
    984     { "_Z21rsGetElementAt_uchar313rs_allocationPDv3_hjjj", (void *)&SC_GetElementAt3_uchar3, true },
    985     { "_Z21rsGetElementAt_uchar413rs_allocationPDv4_hjjj", (void *)&SC_GetElementAt3_uchar4, true },
    986 
    987     { "_Z19rsGetElementAt_char13rs_allocationPcj", (void *)&SC_GetElementAt1_char, true },
    988     { "_Z20rsGetElementAt_char213rs_allocationPDv2_cj", (void *)&SC_GetElementAt1_char2, true },
    989     { "_Z20rsGetElementAt_char313rs_allocationPDv3_cj", (void *)&SC_GetElementAt1_char3, true },
    990     { "_Z20rsGetElementAt_char413rs_allocationPDv4_cj", (void *)&SC_GetElementAt1_char4, true },
    991     { "_Z19rsGetElementAt_char13rs_allocationPcjj", (void *)&SC_GetElementAt2_char, true },
    992     { "_Z20rsGetElementAt_char213rs_allocationPDv2_cjj", (void *)&SC_GetElementAt2_char2, true },
    993     { "_Z20rsGetElementAt_char313rs_allocationPDv3_cjj", (void *)&SC_GetElementAt2_char3, true },
    994     { "_Z20rsGetElementAt_char413rs_allocationPDv4_cjj", (void *)&SC_GetElementAt2_char4, true },
    995     { "_Z19rsGetElementAt_char13rs_allocationPcjjj", (void *)&SC_GetElementAt3_char, true },
    996     { "_Z20rsGetElementAt_char213rs_allocationPDv2_cjjj", (void *)&SC_GetElementAt3_char2, true },
    997     { "_Z20rsGetElementAt_char313rs_allocationPDv3_cjjj", (void *)&SC_GetElementAt3_char3, true },
    998     { "_Z20rsGetElementAt_char413rs_allocationPDv4_cjjj", (void *)&SC_GetElementAt3_char4, true },
    999 
   1000     { "_Z21rsGetElementAt_ushort13rs_allocationPtj", (void *)&SC_GetElementAt1_ushort, true },
   1001     { "_Z22rsGetElementAt_ushort213rs_allocationPDv2_tj", (void *)&SC_GetElementAt1_ushort2, true },
   1002     { "_Z22rsGetElementAt_ushort313rs_allocationPDv3_tj", (void *)&SC_GetElementAt1_ushort3, true },
   1003     { "_Z22rsGetElementAt_ushort413rs_allocationPDv4_tj", (void *)&SC_GetElementAt1_ushort4, true },
   1004     { "_Z21rsGetElementAt_ushort13rs_allocationPtjj", (void *)&SC_GetElementAt2_ushort, true },
   1005     { "_Z22rsGetElementAt_ushort213rs_allocationPDv2_tjj", (void *)&SC_GetElementAt2_ushort2, true },
   1006     { "_Z22rsGetElementAt_ushort313rs_allocationPDv3_tjj", (void *)&SC_GetElementAt2_ushort3, true },
   1007     { "_Z22rsGetElementAt_ushort413rs_allocationPDv4_tjj", (void *)&SC_GetElementAt2_ushort4, true },
   1008     { "_Z21rsGetElementAt_ushort13rs_allocationPtjjj", (void *)&SC_GetElementAt3_ushort, true },
   1009     { "_Z22rsGetElementAt_ushort213rs_allocationPDv2_tjjj", (void *)&SC_GetElementAt3_ushort2, true },
   1010     { "_Z22rsGetElementAt_ushort313rs_allocationPDv3_tjjj", (void *)&SC_GetElementAt3_ushort3, true },
   1011     { "_Z22rsGetElementAt_ushort413rs_allocationPDv4_tjjj", (void *)&SC_GetElementAt3_ushort4, true },
   1012 
   1013     { "_Z20rsGetElementAt_short13rs_allocationPsj", (void *)&SC_GetElementAt1_short, true },
   1014     { "_Z21rsGetElementAt_short213rs_allocationPDv2_sj", (void *)&SC_GetElementAt1_short2, true },
   1015     { "_Z21rsGetElementAt_short313rs_allocationPDv3_sj", (void *)&SC_GetElementAt1_short3, true },
   1016     { "_Z21rsGetElementAt_short413rs_allocationPDv4_sj", (void *)&SC_GetElementAt1_short4, true },
   1017     { "_Z20rsGetElementAt_short13rs_allocationPsjj", (void *)&SC_GetElementAt2_short, true },
   1018     { "_Z21rsGetElementAt_short213rs_allocationPDv2_sjj", (void *)&SC_GetElementAt2_short2, true },
   1019     { "_Z21rsGetElementAt_short313rs_allocationPDv3_sjj", (void *)&SC_GetElementAt2_short3, true },
   1020     { "_Z21rsGetElementAt_short413rs_allocationPDv4_sjj", (void *)&SC_GetElementAt2_short4, true },
   1021     { "_Z20rsGetElementAt_short13rs_allocationPsjjj", (void *)&SC_GetElementAt3_short, true },
   1022     { "_Z21rsGetElementAt_short213rs_allocationPDv2_sjjj", (void *)&SC_GetElementAt3_short2, true },
   1023     { "_Z21rsGetElementAt_short313rs_allocationPDv3_sjjj", (void *)&SC_GetElementAt3_short3, true },
   1024     { "_Z21rsGetElementAt_short413rs_allocationPDv4_sjjj", (void *)&SC_GetElementAt3_short4, true },
   1025 
   1026     { "_Z19rsGetElementAt_uint13rs_allocationPjj", (void *)&SC_GetElementAt1_uint, true },
   1027     { "_Z20rsGetElementAt_uint213rs_allocationPDv2_jj", (void *)&SC_GetElementAt1_uint2, true },
   1028     { "_Z20rsGetElementAt_uint313rs_allocationPDv3_jj", (void *)&SC_GetElementAt1_uint3, true },
   1029     { "_Z20rsGetElementAt_uint413rs_allocationPDv4_jj", (void *)&SC_GetElementAt1_uint4, true },
   1030     { "_Z19rsGetElementAt_uint13rs_allocationPjjj", (void *)&SC_GetElementAt2_uint, true },
   1031     { "_Z20rsGetElementAt_uint213rs_allocationPDv2_jjj", (void *)&SC_GetElementAt2_uint2, true },
   1032     { "_Z20rsGetElementAt_uint313rs_allocationPDv3_jjj", (void *)&SC_GetElementAt2_uint3, true },
   1033     { "_Z20rsGetElementAt_uint413rs_allocationPDv4_jjj", (void *)&SC_GetElementAt2_uint4, true },
   1034     { "_Z19rsGetElementAt_uint13rs_allocationPjjjj", (void *)&SC_GetElementAt3_uint, true },
   1035     { "_Z20rsGetElementAt_uint213rs_allocationPDv2_jjjj", (void *)&SC_GetElementAt3_uint2, true },
   1036     { "_Z20rsGetElementAt_uint313rs_allocationPDv3_jjjj", (void *)&SC_GetElementAt3_uint3, true },
   1037     { "_Z20rsGetElementAt_uint413rs_allocationPDv4_jjjj", (void *)&SC_GetElementAt3_uint4, true },
   1038 
   1039     { "_Z18rsGetElementAt_int13rs_allocationPij", (void *)&SC_GetElementAt1_int, true },
   1040     { "_Z19rsGetElementAt_int213rs_allocationPDv2_ij", (void *)&SC_GetElementAt1_int2, true },
   1041     { "_Z19rsGetElementAt_int313rs_allocationPDv3_ij", (void *)&SC_GetElementAt1_int3, true },
   1042     { "_Z19rsGetElementAt_int413rs_allocationPDv4_ij", (void *)&SC_GetElementAt1_int4, true },
   1043     { "_Z18rsGetElementAt_int13rs_allocationPijj", (void *)&SC_GetElementAt2_int, true },
   1044     { "_Z19rsGetElementAt_int213rs_allocationPDv2_ijj", (void *)&SC_GetElementAt2_int2, true },
   1045     { "_Z19rsGetElementAt_int313rs_allocationPDv3_ijj", (void *)&SC_GetElementAt2_int3, true },
   1046     { "_Z19rsGetElementAt_int413rs_allocationPDv4_ijj", (void *)&SC_GetElementAt2_int4, true },
   1047     { "_Z18rsGetElementAt_int13rs_allocationPijjj", (void *)&SC_GetElementAt3_int, true },
   1048     { "_Z19rsGetElementAt_int213rs_allocationPDv2_ijjj", (void *)&SC_GetElementAt3_int2, true },
   1049     { "_Z19rsGetElementAt_int313rs_allocationPDv3_ijjj", (void *)&SC_GetElementAt3_int3, true },
   1050     { "_Z19rsGetElementAt_int413rs_allocationPDv4_ijjj", (void *)&SC_GetElementAt3_int4, true },
   1051 
   1052     { "_Z20rsGetElementAt_ulong13rs_allocationPmj", (void *)&SC_GetElementAt1_ulong, true },
   1053     { "_Z21rsGetElementAt_ulong213rs_allocationPDv2_mj", (void *)&SC_GetElementAt1_ulong2, true },
   1054     { "_Z21rsGetElementAt_ulong313rs_allocationPDv3_mj", (void *)&SC_GetElementAt1_ulong3, true },
   1055     { "_Z21rsGetElementAt_ulong413rs_allocationPDv4_mj", (void *)&SC_GetElementAt1_ulong4, true },
   1056     { "_Z20rsGetElementAt_ulong13rs_allocationPmjj", (void *)&SC_GetElementAt2_ulong, true },
   1057     { "_Z21rsGetElementAt_ulong213rs_allocationPDv2_mjj", (void *)&SC_GetElementAt2_ulong2, true },
   1058     { "_Z21rsGetElementAt_ulong313rs_allocationPDv3_mjj", (void *)&SC_GetElementAt2_ulong3, true },
   1059     { "_Z21rsGetElementAt_ulong413rs_allocationPDv4_mjj", (void *)&SC_GetElementAt2_ulong4, true },
   1060     { "_Z20rsGetElementAt_ulong13rs_allocationPmjjj", (void *)&SC_GetElementAt3_ulong, true },
   1061     { "_Z21rsGetElementAt_ulong213rs_allocationPDv2_mjjj", (void *)&SC_GetElementAt3_ulong2, true },
   1062     { "_Z21rsGetElementAt_ulong313rs_allocationPDv3_mjjj", (void *)&SC_GetElementAt3_ulong3, true },
   1063     { "_Z21rsGetElementAt_ulong413rs_allocationPDv4_mjjj", (void *)&SC_GetElementAt3_ulong4, true },
   1064 
   1065     { "_Z19rsGetElementAt_long13rs_allocationPlj", (void *)&SC_GetElementAt1_long, true },
   1066     { "_Z20rsGetElementAt_long213rs_allocationPDv2_lj", (void *)&SC_GetElementAt1_long2, true },
   1067     { "_Z20rsGetElementAt_long313rs_allocationPDv3_lj", (void *)&SC_GetElementAt1_long3, true },
   1068     { "_Z20rsGetElementAt_long413rs_allocationPDv4_lj", (void *)&SC_GetElementAt1_long4, true },
   1069     { "_Z19rsGetElementAt_long13rs_allocationPljj", (void *)&SC_GetElementAt2_long, true },
   1070     { "_Z20rsGetElementAt_long213rs_allocationPDv2_ljj", (void *)&SC_GetElementAt2_long2, true },
   1071     { "_Z20rsGetElementAt_long313rs_allocationPDv3_ljj", (void *)&SC_GetElementAt2_long3, true },
   1072     { "_Z20rsGetElementAt_long413rs_allocationPDv4_ljj", (void *)&SC_GetElementAt2_long4, true },
   1073     { "_Z19rsGetElementAt_long13rs_allocationPljjj", (void *)&SC_GetElementAt3_long, true },
   1074     { "_Z20rsGetElementAt_long213rs_allocationPDv2_ljjj", (void *)&SC_GetElementAt3_long2, true },
   1075     { "_Z20rsGetElementAt_long313rs_allocationPDv3_ljjj", (void *)&SC_GetElementAt3_long3, true },
   1076     { "_Z20rsGetElementAt_long413rs_allocationPDv4_ljjj", (void *)&SC_GetElementAt3_long4, true },
   1077 
   1078     { "_Z20rsGetElementAt_float13rs_allocationPfj", (void *)&SC_GetElementAt1_float, true },
   1079     { "_Z21rsGetElementAt_float213rs_allocationPDv2_fj", (void *)&SC_GetElementAt1_float2, true },
   1080     { "_Z21rsGetElementAt_float313rs_allocationPDv3_fj", (void *)&SC_GetElementAt1_float3, true },
   1081     { "_Z21rsGetElementAt_float413rs_allocationPDv4_fj", (void *)&SC_GetElementAt1_float4, true },
   1082     { "_Z20rsGetElementAt_float13rs_allocationPfjj", (void *)&SC_GetElementAt2_float, true },
   1083     { "_Z21rsGetElementAt_float213rs_allocationPDv2_fjj", (void *)&SC_GetElementAt2_float2, true },
   1084     { "_Z21rsGetElementAt_float313rs_allocationPDv3_fjj", (void *)&SC_GetElementAt2_float3, true },
   1085     { "_Z21rsGetElementAt_float413rs_allocationPDv4_fjj", (void *)&SC_GetElementAt2_float4, true },
   1086     { "_Z20rsGetElementAt_float13rs_allocationPfjjj", (void *)&SC_GetElementAt3_float, true },
   1087     { "_Z21rsGetElementAt_float213rs_allocationPDv2_fjjj", (void *)&SC_GetElementAt3_float2, true },
   1088     { "_Z21rsGetElementAt_float313rs_allocationPDv3_fjjj", (void *)&SC_GetElementAt3_float3, true },
   1089     { "_Z21rsGetElementAt_float413rs_allocationPDv4_fjjj", (void *)&SC_GetElementAt3_float4, true },
   1090 
   1091     { "_Z21rsGetElementAt_double13rs_allocationPdj", (void *)&SC_GetElementAt1_double, true },
   1092     { "_Z22rsGetElementAt_double213rs_allocationPDv2_dj", (void *)&SC_GetElementAt1_double2, true },
   1093     { "_Z22rsGetElementAt_double313rs_allocationPDv3_dj", (void *)&SC_GetElementAt1_double3, true },
   1094     { "_Z22rsGetElementAt_double413rs_allocationPDv4_dj", (void *)&SC_GetElementAt1_double4, true },
   1095     { "_Z21rsGetElementAt_double13rs_allocationPdjj", (void *)&SC_GetElementAt2_double, true },
   1096     { "_Z22rsGetElementAt_double213rs_allocationPDv2_djj", (void *)&SC_GetElementAt2_double2, true },
   1097     { "_Z22rsGetElementAt_double313rs_allocationPDv3_djj", (void *)&SC_GetElementAt2_double3, true },
   1098     { "_Z22rsGetElementAt_double413rs_allocationPDv4_djj", (void *)&SC_GetElementAt2_double4, true },
   1099     { "_Z21rsGetElementAt_double13rs_allocationPdjjj", (void *)&SC_GetElementAt3_double, true },
   1100     { "_Z22rsGetElementAt_double213rs_allocationPDv2_djjj", (void *)&SC_GetElementAt3_double2, true },
   1101     { "_Z22rsGetElementAt_double313rs_allocationPDv3_djjj", (void *)&SC_GetElementAt3_double3, true },
   1102     { "_Z22rsGetElementAt_double413rs_allocationPDv4_djjj", (void *)&SC_GetElementAt3_double4, true },
   1103 
   1104 
   1105 
   1106     { "_Z20rsSetElementAt_uchar13rs_allocationPKhj", (void *)&SC_SetElementAt1_uchar, true },
   1107     { "_Z21rsSetElementAt_uchar213rs_allocationPKDv2_hj", (void *)&SC_SetElementAt1_uchar2, true },
   1108     { "_Z21rsSetElementAt_uchar313rs_allocationPKDv3_hj", (void *)&SC_SetElementAt1_uchar3, true },
   1109     { "_Z21rsSetElementAt_uchar413rs_allocationPKDv4_hj", (void *)&SC_SetElementAt1_uchar4, true },
   1110     { "_Z20rsSetElementAt_uchar13rs_allocationPKhjj", (void *)&SC_SetElementAt2_uchar, true },
   1111     { "_Z21rsSetElementAt_uchar213rs_allocationPKDv2_hjj", (void *)&SC_SetElementAt2_uchar2, true },
   1112     { "_Z21rsSetElementAt_uchar313rs_allocationPKDv3_hjj", (void *)&SC_SetElementAt2_uchar3, true },
   1113     { "_Z21rsSetElementAt_uchar413rs_allocationPKDv4_hjj", (void *)&SC_SetElementAt2_uchar4, true },
   1114     { "_Z20rsSetElementAt_uchar13rs_allocationPKhjjj", (void *)&SC_SetElementAt3_uchar, true },
   1115     { "_Z21rsSetElementAt_uchar213rs_allocationPKDv2_hjjj", (void *)&SC_SetElementAt3_uchar2, true },
   1116     { "_Z21rsSetElementAt_uchar313rs_allocationPKDv3_hjjj", (void *)&SC_SetElementAt3_uchar3, true },
   1117     { "_Z21rsSetElementAt_uchar413rs_allocationPKDv4_hjjj", (void *)&SC_SetElementAt3_uchar4, true },
   1118 
   1119     { "_Z19rsSetElementAt_char13rs_allocationPKcj", (void *)&SC_SetElementAt1_char, true },
   1120     { "_Z20rsSetElementAt_char213rs_allocationPKDv2_cj", (void *)&SC_SetElementAt1_char2, true },
   1121     { "_Z20rsSetElementAt_char313rs_allocationPKDv3_cj", (void *)&SC_SetElementAt1_char3, true },
   1122     { "_Z20rsSetElementAt_char413rs_allocationPKDv4_cj", (void *)&SC_SetElementAt1_char4, true },
   1123     { "_Z19rsSetElementAt_char13rs_allocationPKcjj", (void *)&SC_SetElementAt2_char, true },
   1124     { "_Z20rsSetElementAt_char213rs_allocationPKDv2_cjj", (void *)&SC_SetElementAt2_char2, true },
   1125     { "_Z20rsSetElementAt_char313rs_allocationPKDv3_cjj", (void *)&SC_SetElementAt2_char3, true },
   1126     { "_Z20rsSetElementAt_char413rs_allocationPKDv4_cjj", (void *)&SC_SetElementAt2_char4, true },
   1127     { "_Z19rsSetElementAt_char13rs_allocationPKcjjj", (void *)&SC_SetElementAt3_char, true },
   1128     { "_Z20rsSetElementAt_char213rs_allocationPKDv2_cjjj", (void *)&SC_SetElementAt3_char2, true },
   1129     { "_Z20rsSetElementAt_char313rs_allocationPKDv3_cjjj", (void *)&SC_SetElementAt3_char3, true },
   1130     { "_Z20rsSetElementAt_char413rs_allocationPKDv4_cjjj", (void *)&SC_SetElementAt3_char4, true },
   1131 
   1132     { "_Z21rsSetElementAt_ushort13rs_allocationPKht", (void *)&SC_SetElementAt1_ushort, true },
   1133     { "_Z22rsSetElementAt_ushort213rs_allocationPKDv2_tj", (void *)&SC_SetElementAt1_ushort2, true },
   1134     { "_Z22rsSetElementAt_ushort313rs_allocationPKDv3_tj", (void *)&SC_SetElementAt1_ushort3, true },
   1135     { "_Z22rsSetElementAt_ushort413rs_allocationPKDv4_tj", (void *)&SC_SetElementAt1_ushort4, true },
   1136     { "_Z21rsSetElementAt_ushort13rs_allocationPKtjj", (void *)&SC_SetElementAt2_ushort, true },
   1137     { "_Z22rsSetElementAt_ushort213rs_allocationPKDv2_tjj", (void *)&SC_SetElementAt2_ushort2, true },
   1138     { "_Z22rsSetElementAt_ushort313rs_allocationPKDv3_tjj", (void *)&SC_SetElementAt2_ushort3, true },
   1139     { "_Z22rsSetElementAt_ushort413rs_allocationPKDv4_tjj", (void *)&SC_SetElementAt2_ushort4, true },
   1140     { "_Z21rsSetElementAt_ushort13rs_allocationPKtjjj", (void *)&SC_SetElementAt3_ushort, true },
   1141     { "_Z22rsSetElementAt_ushort213rs_allocationPKDv2_tjjj", (void *)&SC_SetElementAt3_ushort2, true },
   1142     { "_Z22rsSetElementAt_ushort313rs_allocationPKDv3_tjjj", (void *)&SC_SetElementAt3_ushort3, true },
   1143     { "_Z22rsSetElementAt_ushort413rs_allocationPKDv4_tjjj", (void *)&SC_SetElementAt3_ushort4, true },
   1144 
   1145     { "_Z20rsSetElementAt_short13rs_allocationPKsj", (void *)&SC_SetElementAt1_short, true },
   1146     { "_Z21rsSetElementAt_short213rs_allocationPKDv2_sj", (void *)&SC_SetElementAt1_short2, true },
   1147     { "_Z21rsSetElementAt_short313rs_allocationPKDv3_sj", (void *)&SC_SetElementAt1_short3, true },
   1148     { "_Z21rsSetElementAt_short413rs_allocationPKDv4_sj", (void *)&SC_SetElementAt1_short4, true },
   1149     { "_Z20rsSetElementAt_short13rs_allocationPKsjj", (void *)&SC_SetElementAt2_short, true },
   1150     { "_Z21rsSetElementAt_short213rs_allocationPKDv2_sjj", (void *)&SC_SetElementAt2_short2, true },
   1151     { "_Z21rsSetElementAt_short313rs_allocationPKDv3_sjj", (void *)&SC_SetElementAt2_short3, true },
   1152     { "_Z21rsSetElementAt_short413rs_allocationPKDv4_sjj", (void *)&SC_SetElementAt2_short4, true },
   1153     { "_Z20rsSetElementAt_short13rs_allocationPKsjjj", (void *)&SC_SetElementAt3_short, true },
   1154     { "_Z21rsSetElementAt_short213rs_allocationPKDv2_sjjj", (void *)&SC_SetElementAt3_short2, true },
   1155     { "_Z21rsSetElementAt_short313rs_allocationPKDv3_sjjj", (void *)&SC_SetElementAt3_short3, true },
   1156     { "_Z21rsSetElementAt_short413rs_allocationPKDv4_sjjj", (void *)&SC_SetElementAt3_short4, true },
   1157 
   1158     { "_Z19rsSetElementAt_uint13rs_allocationPKjj", (void *)&SC_SetElementAt1_uint, true },
   1159     { "_Z20rsSetElementAt_uint213rs_allocationPKDv2_jj", (void *)&SC_SetElementAt1_uint2, true },
   1160     { "_Z20rsSetElementAt_uint313rs_allocationPKDv3_jj", (void *)&SC_SetElementAt1_uint3, true },
   1161     { "_Z20rsSetElementAt_uint413rs_allocationPKDv4_jj", (void *)&SC_SetElementAt1_uint4, true },
   1162     { "_Z19rsSetElementAt_uint13rs_allocationPKjjj", (void *)&SC_SetElementAt2_uint, true },
   1163     { "_Z20rsSetElementAt_uint213rs_allocationPKDv2_jjj", (void *)&SC_SetElementAt2_uint2, true },
   1164     { "_Z20rsSetElementAt_uint313rs_allocationPKDv3_jjj", (void *)&SC_SetElementAt2_uint3, true },
   1165     { "_Z20rsSetElementAt_uint413rs_allocationPKDv4_jjj", (void *)&SC_SetElementAt2_uint4, true },
   1166     { "_Z19rsSetElementAt_uint13rs_allocationPKjjjj", (void *)&SC_SetElementAt3_uint, true },
   1167     { "_Z20rsSetElementAt_uint213rs_allocationPKDv2_jjjj", (void *)&SC_SetElementAt3_uint2, true },
   1168     { "_Z20rsSetElementAt_uint313rs_allocationPKDv3_jjjj", (void *)&SC_SetElementAt3_uint3, true },
   1169     { "_Z20rsSetElementAt_uint413rs_allocationPKDv4_jjjj", (void *)&SC_SetElementAt3_uint4, true },
   1170 
   1171     { "_Z18rsSetElementAt_int13rs_allocationPKij", (void *)&SC_SetElementAt1_int, true },
   1172     { "_Z19rsSetElementAt_int213rs_allocationPKDv2_ij", (void *)&SC_SetElementAt1_int2, true },
   1173     { "_Z19rsSetElementAt_int313rs_allocationPKDv3_ij", (void *)&SC_SetElementAt1_int3, true },
   1174     { "_Z19rsSetElementAt_int413rs_allocationPKDv4_ij", (void *)&SC_SetElementAt1_int4, true },
   1175     { "_Z18rsSetElementAt_int13rs_allocationPKijj", (void *)&SC_SetElementAt2_int, true },
   1176     { "_Z19rsSetElementAt_int213rs_allocationPKDv2_ijj", (void *)&SC_SetElementAt2_int2, true },
   1177     { "_Z19rsSetElementAt_int313rs_allocationPKDv3_ijj", (void *)&SC_SetElementAt2_int3, true },
   1178     { "_Z19rsSetElementAt_int413rs_allocationPKDv4_ijj", (void *)&SC_SetElementAt2_int4, true },
   1179     { "_Z18rsSetElementAt_int13rs_allocationPKijjj", (void *)&SC_SetElementAt3_int, true },
   1180     { "_Z19rsSetElementAt_int213rs_allocationPKDv2_ijjj", (void *)&SC_SetElementAt3_int2, true },
   1181     { "_Z19rsSetElementAt_int313rs_allocationPKDv3_ijjj", (void *)&SC_SetElementAt3_int3, true },
   1182     { "_Z19rsSetElementAt_int413rs_allocationPKDv4_ijjj", (void *)&SC_SetElementAt3_int4, true },
   1183 
   1184     { "_Z20rsSetElementAt_ulong13rs_allocationPKmj", (void *)&SC_SetElementAt1_ulong, true },
   1185     { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_mj", (void *)&SC_SetElementAt1_ulong2, true },
   1186     { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_mj", (void *)&SC_SetElementAt1_ulong3, true },
   1187     { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_mj", (void *)&SC_SetElementAt1_ulong4, true },
   1188     { "_Z20rsSetElementAt_ulong13rs_allocationPKmjj", (void *)&SC_SetElementAt2_ulong, true },
   1189     { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_mjj", (void *)&SC_SetElementAt2_ulong2, true },
   1190     { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_mjj", (void *)&SC_SetElementAt2_ulong3, true },
   1191     { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_mjj", (void *)&SC_SetElementAt2_ulong4, true },
   1192     { "_Z20rsSetElementAt_ulong13rs_allocationPKmjjj", (void *)&SC_SetElementAt3_ulong, true },
   1193     { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_mjjj", (void *)&SC_SetElementAt3_ulong2, true },
   1194     { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_mjjj", (void *)&SC_SetElementAt3_ulong3, true },
   1195     { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_mjjj", (void *)&SC_SetElementAt3_ulong4, true },
   1196 
   1197     // Pre-21 compatibility path
   1198     { "_Z20rsSetElementAt_ulong13rs_allocationPKyj", (void *)&SC_SetElementAt1_ulong, true },
   1199     { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_yj", (void *)&SC_SetElementAt1_ulong2, true },
   1200     { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_yj", (void *)&SC_SetElementAt1_ulong3, true },
   1201     { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_yj", (void *)&SC_SetElementAt1_ulong4, true },
   1202     { "_Z20rsSetElementAt_ulong13rs_allocationPKyjj", (void *)&SC_SetElementAt2_ulong, true },
   1203     { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_yjj", (void *)&SC_SetElementAt2_ulong2, true },
   1204     { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_yjj", (void *)&SC_SetElementAt2_ulong3, true },
   1205     { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_yjj", (void *)&SC_SetElementAt2_ulong4, true },
   1206     { "_Z20rsSetElementAt_ulong13rs_allocationPKyjjj", (void *)&SC_SetElementAt3_ulong, true },
   1207     { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_yjjj", (void *)&SC_SetElementAt3_ulong2, true },
   1208     { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_yjjj", (void *)&SC_SetElementAt3_ulong3, true },
   1209     { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_yjjj", (void *)&SC_SetElementAt3_ulong4, true },
   1210 
   1211     { "_Z19rsSetElementAt_long13rs_allocationPKlj", (void *)&SC_SetElementAt1_long, true },
   1212     { "_Z20rsSetElementAt_long213rs_allocationPKDv2_lj", (void *)&SC_SetElementAt1_long2, true },
   1213     { "_Z20rsSetElementAt_long313rs_allocationPKDv3_lj", (void *)&SC_SetElementAt1_long3, true },
   1214     { "_Z20rsSetElementAt_long413rs_allocationPKDv4_lj", (void *)&SC_SetElementAt1_long4, true },
   1215     { "_Z19rsSetElementAt_long13rs_allocationPKljj", (void *)&SC_SetElementAt2_long, true },
   1216     { "_Z20rsSetElementAt_long213rs_allocationPKDv2_ljj", (void *)&SC_SetElementAt2_long2, true },
   1217     { "_Z20rsSetElementAt_long313rs_allocationPKDv3_ljj", (void *)&SC_SetElementAt2_long3, true },
   1218     { "_Z20rsSetElementAt_long413rs_allocationPKDv4_ljj", (void *)&SC_SetElementAt2_long4, true },
   1219     { "_Z19rsSetElementAt_long13rs_allocationPKljjj", (void *)&SC_SetElementAt3_long, true },
   1220     { "_Z20rsSetElementAt_long213rs_allocationPKDv2_ljjj", (void *)&SC_SetElementAt3_long2, true },
   1221     { "_Z20rsSetElementAt_long313rs_allocationPKDv3_ljjj", (void *)&SC_SetElementAt3_long3, true },
   1222     { "_Z20rsSetElementAt_long413rs_allocationPKDv4_ljjj", (void *)&SC_SetElementAt3_long4, true },
   1223 
   1224     // Pre-21 compatibility path
   1225     { "_Z19rsSetElementAt_long13rs_allocationPKxj", (void *)&SC_SetElementAt1_long, true },
   1226     { "_Z20rsSetElementAt_long213rs_allocationPKDv2_xj", (void *)&SC_SetElementAt1_long2, true },
   1227     { "_Z20rsSetElementAt_long313rs_allocationPKDv3_xj", (void *)&SC_SetElementAt1_long3, true },
   1228     { "_Z20rsSetElementAt_long413rs_allocationPKDv4_xj", (void *)&SC_SetElementAt1_long4, true },
   1229     { "_Z19rsSetElementAt_long13rs_allocationPKxjj", (void *)&SC_SetElementAt2_long, true },
   1230     { "_Z20rsSetElementAt_long213rs_allocationPKDv2_xjj", (void *)&SC_SetElementAt2_long2, true },
   1231     { "_Z20rsSetElementAt_long313rs_allocationPKDv3_xjj", (void *)&SC_SetElementAt2_long3, true },
   1232     { "_Z20rsSetElementAt_long413rs_allocationPKDv4_xjj", (void *)&SC_SetElementAt2_long4, true },
   1233     { "_Z19rsSetElementAt_long13rs_allocationPKxjjj", (void *)&SC_SetElementAt3_long, true },
   1234     { "_Z20rsSetElementAt_long213rs_allocationPKDv2_xjjj", (void *)&SC_SetElementAt3_long2, true },
   1235     { "_Z20rsSetElementAt_long313rs_allocationPKDv3_xjjj", (void *)&SC_SetElementAt3_long3, true },
   1236     { "_Z20rsSetElementAt_long413rs_allocationPKDv4_xjjj", (void *)&SC_SetElementAt3_long4, true },
   1237 
   1238     { "_Z20rsSetElementAt_float13rs_allocationPKft", (void *)&SC_SetElementAt1_float, true },
   1239     { "_Z21rsSetElementAt_float213rs_allocationPKDv2_fj", (void *)&SC_SetElementAt1_float2, true },
   1240     { "_Z21rsSetElementAt_float313rs_allocationPKDv3_fj", (void *)&SC_SetElementAt1_float3, true },
   1241     { "_Z21rsSetElementAt_float413rs_allocationPKDv4_fj", (void *)&SC_SetElementAt1_float4, true },
   1242     { "_Z20rsSetElementAt_float13rs_allocationPKfjj", (void *)&SC_SetElementAt2_float, true },
   1243     { "_Z21rsSetElementAt_float213rs_allocationPKDv2_fjj", (void *)&SC_SetElementAt2_float2, true },
   1244     { "_Z21rsSetElementAt_float313rs_allocationPKDv3_fjj", (void *)&SC_SetElementAt2_float3, true },
   1245     { "_Z21rsSetElementAt_float413rs_allocationPKDv4_fjj", (void *)&SC_SetElementAt2_float4, true },
   1246     { "_Z20rsSetElementAt_float13rs_allocationPKfjjj", (void *)&SC_SetElementAt3_float, true },
   1247     { "_Z21rsSetElementAt_float213rs_allocationPKDv2_fjjj", (void *)&SC_SetElementAt3_float2, true },
   1248     { "_Z21rsSetElementAt_float313rs_allocationPKDv3_fjjj", (void *)&SC_SetElementAt3_float3, true },
   1249     { "_Z21rsSetElementAt_float413rs_allocationPKDv4_fjjj", (void *)&SC_SetElementAt3_float4, true },
   1250 
   1251     { "_Z21rsSetElementAt_double13rs_allocationPKdt", (void *)&SC_SetElementAt1_double, true },
   1252     { "_Z22rsSetElementAt_double213rs_allocationPKDv2_dj", (void *)&SC_SetElementAt1_double2, true },
   1253     { "_Z22rsSetElementAt_double313rs_allocationPKDv3_dj", (void *)&SC_SetElementAt1_double3, true },
   1254     { "_Z22rsSetElementAt_double413rs_allocationPKDv4_dj", (void *)&SC_SetElementAt1_double4, true },
   1255     { "_Z21rsSetElementAt_double13rs_allocationPKdjj", (void *)&SC_SetElementAt2_double, true },
   1256     { "_Z22rsSetElementAt_double213rs_allocationPKDv2_djj", (void *)&SC_SetElementAt2_double2, true },
   1257     { "_Z22rsSetElementAt_double313rs_allocationPKDv3_djj", (void *)&SC_SetElementAt2_double3, true },
   1258     { "_Z22rsSetElementAt_double413rs_allocationPKDv4_djj", (void *)&SC_SetElementAt2_double4, true },
   1259     { "_Z21rsSetElementAt_double13rs_allocationPKdjjj", (void *)&SC_SetElementAt3_double, true },
   1260     { "_Z22rsSetElementAt_double213rs_allocationPKDv2_djjj", (void *)&SC_SetElementAt3_double2, true },
   1261     { "_Z22rsSetElementAt_double313rs_allocationPKDv3_djjj", (void *)&SC_SetElementAt3_double3, true },
   1262     { "_Z22rsSetElementAt_double413rs_allocationPKDv4_djjj", (void *)&SC_SetElementAt3_double4, true },
   1263 
   1264 
   1265     // Refcounting
   1266 #ifndef __LP64__
   1267     { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_SetObject, true },
   1268     { "_Z10rsIsObject10rs_element", (void *)&SC_IsObject, true },
   1269 
   1270     { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_SetObject, true },
   1271     { "_Z10rsIsObject7rs_type", (void *)&SC_IsObject, true },
   1272 
   1273     { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_SetObject, true },
   1274     { "_Z10rsIsObject13rs_allocation", (void *)&SC_IsObject, true },
   1275 
   1276     { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_SetObject, true },
   1277     { "_Z10rsIsObject10rs_sampler", (void *)&SC_IsObject, true },
   1278 
   1279     { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_SetObject, true },
   1280     { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject, true },
   1281 #else
   1282     { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_SetObject_ByRef, true },
   1283     { "_Z10rsIsObject10rs_element", (void *)&SC_IsObject_ByRef, true },
   1284 
   1285     { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_SetObject_ByRef, true },
   1286     { "_Z10rsIsObject7rs_type", (void *)&SC_IsObject_ByRef, true },
   1287 
   1288     { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_SetObject_ByRef, true },
   1289     { "_Z10rsIsObject13rs_allocation", (void *)&SC_IsObject_ByRef, true },
   1290 
   1291     { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_SetObject_ByRef, true },
   1292     { "_Z10rsIsObject10rs_sampler", (void *)&SC_IsObject_ByRef, true },
   1293 
   1294     { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_SetObject_ByRef, true },
   1295     { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject_ByRef, true },
   1296 #endif
   1297     { "_Z13rsClearObjectP10rs_element", (void *)&SC_ClearObject, true },
   1298     { "_Z13rsClearObjectP7rs_type", (void *)&SC_ClearObject, true },
   1299     { "_Z13rsClearObjectP13rs_allocation", (void *)&SC_ClearObject, true },
   1300     { "_Z13rsClearObjectP10rs_sampler", (void *)&SC_ClearObject, true },
   1301     { "_Z13rsClearObjectP9rs_script", (void *)&SC_ClearObject, true },
   1302 
   1303     { "_Z11rsSetObjectP7rs_pathS_", (void *)&SC_SetObject, true },
   1304     { "_Z13rsClearObjectP7rs_path", (void *)&SC_ClearObject, true },
   1305     { "_Z10rsIsObject7rs_path", (void *)&SC_IsObject, true },
   1306 
   1307     { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_SetObject, true },
   1308     { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_ClearObject, true },
   1309     { "_Z10rsIsObject7rs_mesh", (void *)&SC_IsObject, true },
   1310 
   1311     { "_Z11rsSetObjectP19rs_program_fragmentS_", (void *)&SC_SetObject, true },
   1312     { "_Z13rsClearObjectP19rs_program_fragment", (void *)&SC_ClearObject, true },
   1313     { "_Z10rsIsObject19rs_program_fragment", (void *)&SC_IsObject, true },
   1314 
   1315     { "_Z11rsSetObjectP17rs_program_vertexS_", (void *)&SC_SetObject, true },
   1316     { "_Z13rsClearObjectP17rs_program_vertex", (void *)&SC_ClearObject, true },
   1317     { "_Z10rsIsObject17rs_program_vertex", (void *)&SC_IsObject, true },
   1318 
   1319     { "_Z11rsSetObjectP17rs_program_rasterS_", (void *)&SC_SetObject, true },
   1320     { "_Z13rsClearObjectP17rs_program_raster", (void *)&SC_ClearObject, true },
   1321     { "_Z10rsIsObject17rs_program_raster", (void *)&SC_IsObject, true },
   1322 
   1323     { "_Z11rsSetObjectP16rs_program_storeS_", (void *)&SC_SetObject, true },
   1324     { "_Z13rsClearObjectP16rs_program_store", (void *)&SC_ClearObject, true },
   1325     { "_Z10rsIsObject16rs_program_store", (void *)&SC_IsObject, true },
   1326 
   1327     { "_Z11rsSetObjectP7rs_fontS_", (void *)&SC_SetObject, true },
   1328     { "_Z13rsClearObjectP7rs_font", (void *)&SC_ClearObject, true },
   1329     { "_Z10rsIsObject7rs_font", (void *)&SC_IsObject, true },
   1330 
   1331     // Allocation ops
   1332     { "_Z21rsAllocationMarkDirty13rs_allocation", (void *)&SC_AllocationSyncAll, true },
   1333     { "_Z20rsgAllocationSyncAll13rs_allocation", (void *)&SC_AllocationSyncAll, false },
   1334     { "_Z20rsgAllocationSyncAll13rs_allocationj", (void *)&SC_AllocationSyncAll2, false },
   1335     { "_Z20rsgAllocationSyncAll13rs_allocation24rs_allocation_usage_type", (void *)&SC_AllocationSyncAll2, false },
   1336 #ifndef RS_COMPATIBILITY_LIB
   1337     { "_Z15rsGetAllocationPKv", (void *)&SC_GetAllocation, true },
   1338     { "_Z18rsAllocationIoSend13rs_allocation", (void *)&SC_AllocationIoSend, false },
   1339     { "_Z21rsAllocationIoReceive13rs_allocation", (void *)&SC_AllocationIoReceive, false },
   1340 #endif
   1341     { "_Z23rsAllocationCopy1DRange13rs_allocationjjjS_jj", (void *)&SC_AllocationCopy1DRange, false },
   1342     { "_Z23rsAllocationCopy2DRange13rs_allocationjjj26rs_allocation_cubemap_facejjS_jjjS0_", (void *)&SC_AllocationCopy2DRange, false },
   1343 
   1344     // Messaging
   1345 
   1346     { "_Z14rsSendToClienti", (void *)&SC_ToClient, false },
   1347     { "_Z14rsSendToClientiPKvj", (void *)&SC_ToClient2, false },
   1348     { "_Z22rsSendToClientBlockingi", (void *)&SC_ToClientBlocking, false },
   1349     { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_ToClientBlocking2, false },
   1350 #ifndef RS_COMPATIBILITY_LIB
   1351     { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_BindProgramFragment, false },
   1352     { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_BindProgramStore, false },
   1353     { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_BindProgramVertex, false },
   1354     { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_BindProgramRaster, false },
   1355     { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_BindSampler, false },
   1356     { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_BindTexture, false },
   1357     { "_Z15rsgBindConstant19rs_program_fragmentj13rs_allocation", (void *)&SC_BindFragmentConstant, false },
   1358     { "_Z15rsgBindConstant17rs_program_vertexj13rs_allocation", (void *)&SC_BindVertexConstant, false },
   1359 
   1360     { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadProjectionMatrix, false },
   1361     { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadModelMatrix, false },
   1362     { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadTextureMatrix, false },
   1363 
   1364     { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_VpGetProjectionMatrix, false },
   1365 
   1366     { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_PfConstantColor, false },
   1367 
   1368     { "_Z11rsgGetWidthv", (void *)&SC_GetWidth, false },
   1369     { "_Z12rsgGetHeightv", (void *)&SC_GetHeight, false },
   1370 
   1371 
   1372     { "_Z11rsgDrawRectfffff", (void *)&SC_DrawRect, false },
   1373     { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_DrawQuad, false },
   1374     { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_DrawQuadTexCoords, false },
   1375     { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_DrawSpriteScreenspace, false },
   1376 
   1377     { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_DrawMesh, false },
   1378     { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_DrawMeshPrimitive, false },
   1379     { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_DrawMeshPrimitiveRange, false },
   1380     { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_MeshComputeBoundingBox, false },
   1381 
   1382     { "_Z11rsgDrawPath7rs_path", (void *)&SC_DrawPath, false },
   1383 
   1384     { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false },
   1385     { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false },
   1386 
   1387     { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText, false },
   1388     { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc, false },
   1389     { "_Z14rsgMeasureTextPKcPiS1_S1_S1_", (void *)&SC_MeasureText, false },
   1390     { "_Z14rsgMeasureText13rs_allocationPiS0_S0_S0_", (void *)&SC_MeasureTextAlloc, false },
   1391 
   1392     { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont, false },
   1393     { "_Z12rsgFontColorffff", (void *)&SC_FontColor, false },
   1394 
   1395     { "_Z18rsgBindColorTarget13rs_allocationj", (void *)&SC_BindFrameBufferObjectColorTarget, false },
   1396     { "_Z18rsgBindDepthTarget13rs_allocation", (void *)&SC_BindFrameBufferObjectDepthTarget, false },
   1397     { "_Z19rsgClearColorTargetj", (void *)&SC_ClearFrameBufferObjectColorTarget, false },
   1398     { "_Z19rsgClearDepthTargetv", (void *)&SC_ClearFrameBufferObjectDepthTarget, false },
   1399     { "_Z24rsgClearAllRenderTargetsv", (void *)&SC_ClearFrameBufferObjectTargets, false },
   1400 
   1401 
   1402     { "_Z9rsForEach9rs_script13rs_allocationS0_", (void *)&SC_ForEach_SAA, true },
   1403     { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach_SAAU, true },
   1404     { "_Z9rsForEach9rs_script13rs_allocationS0_PKvPK14rs_script_call", (void *)&SC_ForEach_SAAUS, true },
   1405     { "_Z9rsForEach9rs_script13rs_allocationS0_PKvj", (void *)&SC_ForEach_SAAUL, true },
   1406     { "_Z9rsForEach9rs_script13rs_allocationS0_PKvjPK14rs_script_call", (void *)&SC_ForEach_SAAULS, true },
   1407 #endif // RS_COMPATIBILITY_LIB
   1408 
   1409 #ifndef __LP64__
   1410     // time
   1411     { "_Z6rsTimePi", (void *)&SC_Time, true },
   1412     { "_Z11rsLocaltimeP5rs_tmPKi", (void *)&SC_LocalTime, true },
   1413 #else
   1414     // time
   1415     { "_Z6rsTimePl", (void *)&SC_Time, true },
   1416     { "_Z11rsLocaltimeP5rs_tmPKl", (void *)&SC_LocalTime, true },
   1417 #endif
   1418     { "_Z14rsUptimeMillisv", (void*)&SC_UptimeMillis, true },
   1419     { "_Z13rsUptimeNanosv", (void*)&SC_UptimeNanos, true },
   1420     { "_Z7rsGetDtv", (void*)&SC_GetDt, false },
   1421 
   1422     // misc
   1423 #ifndef RS_COMPATIBILITY_LIB
   1424     { "_Z5colorffff", (void *)&SC_Color, false },
   1425     { "_Z9rsgFinishv", (void *)&SC_Finish, false },
   1426 #endif
   1427 
   1428     { NULL, NULL, false }
   1429 };
   1430 
   1431 #ifdef RS_COMPATIBILITY_LIB
   1432 
   1433 //////////////////////////////////////////////////////////////////////////////
   1434 // Compatibility Library entry points
   1435 //////////////////////////////////////////////////////////////////////////////
   1436 
   1437 #define IS_CLEAR_SET_OBJ(t) \
   1438     bool rsIsObject(t src) { \
   1439         return src.p != NULL; \
   1440     } \
   1441     void __attribute__((overloadable)) rsClearObject(t *dst) { \
   1442         return SC_ClearObject(reinterpret_cast<rs_object_base *>(dst)); \
   1443     } \
   1444     void __attribute__((overloadable)) rsSetObject(t *dst, t src) { \
   1445         return SC_SetObject(reinterpret_cast<rs_object_base *>(dst), (ObjectBase*)src.p); \
   1446     }
   1447 
   1448 IS_CLEAR_SET_OBJ(::rs_element)
   1449 IS_CLEAR_SET_OBJ(::rs_type)
   1450 IS_CLEAR_SET_OBJ(::rs_allocation)
   1451 IS_CLEAR_SET_OBJ(::rs_sampler)
   1452 IS_CLEAR_SET_OBJ(::rs_script)
   1453 #undef IS_CLEAR_SET_OBJ
   1454 
   1455 static void SC_ForEach_SAA(::rs_script target,
   1456                            ::rs_allocation in,
   1457                            ::rs_allocation out) {
   1458     Context *rsc = RsdCpuReference::getTlsContext();
   1459     rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, NULL, 0, NULL);
   1460 }
   1461 
   1462 static void SC_ForEach_SAAUS(::rs_script target,
   1463                              ::rs_allocation in,
   1464                              ::rs_allocation out,
   1465                              const void *usr,
   1466                              const RsScriptCall *call) {
   1467     Context *rsc = RsdCpuReference::getTlsContext();
   1468     rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, 0, call);
   1469 }
   1470 
   1471 static void SC_ForEach_SAAUL(::rs_script target,
   1472                              ::rs_allocation in,
   1473                              ::rs_allocation out,
   1474                              const void *usr,
   1475                              uint32_t usrLen) {
   1476     Context *rsc = RsdCpuReference::getTlsContext();
   1477     rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, NULL);
   1478 }
   1479 
   1480 static void SC_ForEach_SAAULS(::rs_script target,
   1481                               ::rs_allocation in,
   1482                               ::rs_allocation out,
   1483                               const void *usr,
   1484                               uint32_t usrLen,
   1485                               const RsScriptCall *call) {
   1486     Context *rsc = RsdCpuReference::getTlsContext();
   1487     rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, call);
   1488 }
   1489 
   1490 static const Allocation * SC_GetAllocation(const void *ptr) {
   1491     Context *rsc = RsdCpuReference::getTlsContext();
   1492     const Script *sc = RsdCpuReference::getTlsScript();
   1493     return rsdScriptGetAllocationForPointer(rsc, sc, ptr);
   1494 }
   1495 
   1496 const Allocation * rsGetAllocation(const void *ptr) {
   1497     return SC_GetAllocation(ptr);
   1498 }
   1499 
   1500 void __attribute__((overloadable)) rsAllocationIoSend(::rs_allocation a) {
   1501     SC_AllocationIoSend((Allocation *)a.p);
   1502 }
   1503 
   1504 void __attribute__((overloadable)) rsAllocationIoReceive(::rs_allocation a) {
   1505     SC_AllocationIoReceive((Allocation *)a.p);
   1506 }
   1507 
   1508 
   1509 void __attribute__((overloadable)) rsAllocationCopy1DRange(
   1510         ::rs_allocation dstAlloc,
   1511         uint32_t dstOff, uint32_t dstMip, uint32_t count,
   1512         ::rs_allocation srcAlloc,
   1513         uint32_t srcOff, uint32_t srcMip) {
   1514     SC_AllocationCopy1DRange(dstAlloc, dstOff, dstMip, count,
   1515                              srcAlloc, srcOff, srcMip);
   1516 }
   1517 
   1518 void __attribute__((overloadable)) rsAllocationCopy2DRange(
   1519         ::rs_allocation dstAlloc,
   1520         uint32_t dstXoff, uint32_t dstYoff,
   1521         uint32_t dstMip, rs_allocation_cubemap_face dstFace,
   1522         uint32_t width, uint32_t height,
   1523         ::rs_allocation srcAlloc,
   1524         uint32_t srcXoff, uint32_t srcYoff,
   1525         uint32_t srcMip, rs_allocation_cubemap_face srcFace) {
   1526     SC_AllocationCopy2DRange(dstAlloc, dstXoff, dstYoff,
   1527                              dstMip, dstFace, width, height,
   1528                              srcAlloc, srcXoff, srcYoff,
   1529                              srcMip, srcFace);
   1530 }
   1531 
   1532 void __attribute__((overloadable)) rsForEach(::rs_script script,
   1533                                              ::rs_allocation in,
   1534                                              ::rs_allocation out,
   1535                                              const void *usr,
   1536                                              const rs_script_call *call) {
   1537     return SC_ForEach_SAAUS(script, in, out, usr, (RsScriptCall*)call);
   1538 }
   1539 
   1540 void __attribute__((overloadable)) rsForEach(::rs_script script,
   1541                                              ::rs_allocation in,
   1542                                              ::rs_allocation out) {
   1543     return SC_ForEach_SAA(script, in, out);
   1544 }
   1545 
   1546 void __attribute__((overloadable)) rsForEach(::rs_script script,
   1547                                              ::rs_allocation in,
   1548                                              ::rs_allocation out,
   1549                                              const void *usr,
   1550                                              uint32_t usrLen) {
   1551     return SC_ForEach_SAAUL(script, in, out, usr, usrLen);
   1552 }
   1553 
   1554 void __attribute__((overloadable)) rsForEach(::rs_script script,
   1555                                              ::rs_allocation in,
   1556                                              ::rs_allocation out,
   1557                                              const void *usr,
   1558                                              uint32_t usrLen,
   1559                                              const rs_script_call *call) {
   1560     return SC_ForEach_SAAULS(script, in, out, usr, usrLen, (RsScriptCall*)call);
   1561 }
   1562 
   1563 int rsTime(int *timer) {
   1564     return SC_Time(timer);
   1565 }
   1566 
   1567 rs_tm* rsLocaltime(rs_tm* local, const int *timer) {
   1568     return (rs_tm*)(SC_LocalTime((tm*)local, (long*)timer));
   1569 }
   1570 
   1571 int64_t rsUptimeMillis() {
   1572     Context *rsc = RsdCpuReference::getTlsContext();
   1573     return rsrUptimeMillis(rsc);
   1574 }
   1575 
   1576 int64_t rsUptimeNanos() {
   1577     return SC_UptimeNanos();
   1578 }
   1579 
   1580 float rsGetDt() {
   1581     return SC_GetDt();
   1582 }
   1583 
   1584 uint32_t rsSendToClient(int cmdID) {
   1585     return SC_ToClient(cmdID);
   1586 }
   1587 
   1588 uint32_t rsSendToClient(int cmdID, const void *data, uint32_t len) {
   1589     return SC_ToClient2(cmdID, data, len);
   1590 }
   1591 
   1592 uint32_t rsSendToClientBlocking(int cmdID) {
   1593     return SC_ToClientBlocking(cmdID);
   1594 }
   1595 
   1596 uint32_t rsSendToClientBlocking(int cmdID, const void *data, uint32_t len) {
   1597     return SC_ToClientBlocking2(cmdID, data, len);
   1598 }
   1599 
   1600 static void SC_debugF(const char *s, float f) {
   1601     ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
   1602 }
   1603 static void SC_debugFv2(const char *s, float f1, float f2) {
   1604     ALOGD("%s {%f, %f}", s, f1, f2);
   1605 }
   1606 static void SC_debugFv3(const char *s, float f1, float f2, float f3) {
   1607     ALOGD("%s {%f, %f, %f}", s, f1, f2, f3);
   1608 }
   1609 static void SC_debugFv4(const char *s, float f1, float f2, float f3, float f4) {
   1610     ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
   1611 }
   1612 static void SC_debugF2(const char *s, float2 f) {
   1613     ALOGD("%s {%f, %f}", s, f.x, f.y);
   1614 }
   1615 static void SC_debugF3(const char *s, float3 f) {
   1616     ALOGD("%s {%f, %f, %f}", s, f.x, f.y, f.z);
   1617 }
   1618 static void SC_debugF4(const char *s, float4 f) {
   1619     ALOGD("%s {%f, %f, %f, %f}", s, f.x, f.y, f.z, f.w);
   1620 }
   1621 static void SC_debugD(const char *s, double d) {
   1622     ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
   1623 }
   1624 static void SC_debugFM4v4(const char *s, const float *f) {
   1625     ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
   1626     ALOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
   1627     ALOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
   1628     ALOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
   1629 }
   1630 static void SC_debugFM3v3(const char *s, const float *f) {
   1631     ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
   1632     ALOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
   1633     ALOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
   1634 }
   1635 static void SC_debugFM2v2(const char *s, const float *f) {
   1636     ALOGD("%s {%f, %f", s, f[0], f[2]);
   1637     ALOGD("%s  %f, %f}",s, f[1], f[3]);
   1638 }
   1639 static void SC_debugI8(const char *s, char c) {
   1640     ALOGD("%s %hhd  0x%hhx", s, c, (unsigned char)c);
   1641 }
   1642 static void SC_debugC2(const char *s, char2 c) {
   1643     ALOGD("%s {%hhd, %hhd}  0x%hhx 0x%hhx", s, c.x, c.y, (unsigned char)c.x, (unsigned char)c.y);
   1644 }
   1645 static void SC_debugC3(const char *s, char3 c) {
   1646     ALOGD("%s {%hhd, %hhd, %hhd}  0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, (unsigned char)c.x, (unsigned char)c.y, (unsigned char)c.z);
   1647 }
   1648 static void SC_debugC4(const char *s, char4 c) {
   1649     ALOGD("%s {%hhd, %hhd, %hhd, %hhd}  0x%hhx 0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, c.w, (unsigned char)c.x, (unsigned char)c.y, (unsigned char)c.z, (unsigned char)c.w);
   1650 }
   1651 static void SC_debugU8(const char *s, unsigned char c) {
   1652     ALOGD("%s %hhu  0x%hhx", s, c, c);
   1653 }
   1654 static void SC_debugUC2(const char *s, uchar2 c) {
   1655     ALOGD("%s {%hhu, %hhu}  0x%hhx 0x%hhx", s, c.x, c.y, c.x, c.y);
   1656 }
   1657 static void SC_debugUC3(const char *s, uchar3 c) {
   1658     ALOGD("%s {%hhu, %hhu, %hhu}  0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, c.x, c.y, c.z);
   1659 }
   1660 static void SC_debugUC4(const char *s, uchar4 c) {
   1661     ALOGD("%s {%hhu, %hhu, %hhu, %hhu}  0x%hhx 0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, c.w, c.x, c.y, c.z, c.w);
   1662 }
   1663 static void SC_debugI16(const char *s, short c) {
   1664     ALOGD("%s %hd  0x%hx", s, c, c);
   1665 }
   1666 static void SC_debugS2(const char *s, short2 c) {
   1667     ALOGD("%s {%hd, %hd}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
   1668 }
   1669 static void SC_debugS3(const char *s, short3 c) {
   1670     ALOGD("%s {%hd, %hd, %hd}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z);
   1671 }
   1672 static void SC_debugS4(const char *s, short4 c) {
   1673     ALOGD("%s {%hd, %hd, %hd, %hd}  0x%hx 0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.w, c.x, c.y, c.z, c.w);
   1674 }
   1675 static void SC_debugU16(const char *s, unsigned short c) {
   1676     ALOGD("%s %hu  0x%hx", s, c, c);
   1677 }
   1678 static void SC_debugUS2(const char *s, ushort2 c) {
   1679     ALOGD("%s {%hu, %hu}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
   1680 }
   1681 static void SC_debugUS3(const char *s, ushort3 c) {
   1682     ALOGD("%s {%hu, %hu, %hu}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z);
   1683 }
   1684 static void SC_debugUS4(const char *s, ushort4 c) {
   1685     ALOGD("%s {%hu, %hu, %hu, %hu}  0x%hx 0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.w, c.x, c.y, c.z, c.w);
   1686 }
   1687 static void SC_debugI32(const char *s, int32_t i) {
   1688     ALOGD("%s %d  0x%x", s, i, i);
   1689 }
   1690 static void SC_debugI2(const char *s, int2 i) {
   1691     ALOGD("%s {%d, %d}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
   1692 }
   1693 static void SC_debugI3(const char *s, int3 i) {
   1694     ALOGD("%s {%d, %d, %d}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
   1695 }
   1696 static void SC_debugI4(const char *s, int4 i) {
   1697     ALOGD("%s {%d, %d, %d, %d}  0x%x 0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.w, i.x, i.y, i.z, i.w);
   1698 }
   1699 static void SC_debugU32(const char *s, uint32_t i) {
   1700     ALOGD("%s %u  0x%x", s, i, i);
   1701 }
   1702 static void SC_debugUI2(const char *s, uint2 i) {
   1703     ALOGD("%s {%u, %u}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
   1704 }
   1705 static void SC_debugUI3(const char *s, uint3 i) {
   1706     ALOGD("%s {%u, %u, %u}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
   1707 }
   1708 static void SC_debugUI4(const char *s, uint4 i) {
   1709     ALOGD("%s {%u, %u, %u, %u}  0x%x 0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.w, i.x, i.y, i.z, i.w);
   1710 }
   1711 static void SC_debugLL64(const char *s, long long ll) {
   1712     ALOGD("%s %lld  0x%llx", s, ll, ll);
   1713 }
   1714 static void SC_debugL2(const char *s, long2 ll) {
   1715     ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, ll.x, ll.y, ll.x, ll.y);
   1716 }
   1717 static void SC_debugL3(const char *s, long3 ll) {
   1718     ALOGD("%s {%lld, %lld, %lld}  0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.x, ll.y, ll.z);
   1719 }
   1720 static void SC_debugL4(const char *s, long4 ll) {
   1721     ALOGD("%s {%lld, %lld, %lld, %lld}  0x%llx 0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.w, ll.x, ll.y, ll.z, ll.w);
   1722 }
   1723 static void SC_debugULL64(const char *s, unsigned long long ll) {
   1724     ALOGD("%s %llu  0x%llx", s, ll, ll);
   1725 }
   1726 static void SC_debugUL2(const char *s, ulong2 ll) {
   1727     ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, ll.x, ll.y, ll.x, ll.y);
   1728 }
   1729 static void SC_debugUL3(const char *s, ulong3 ll) {
   1730     ALOGD("%s {%llu, %llu, %llu}  0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.x, ll.y, ll.z);
   1731 }
   1732 static void SC_debugUL4(const char *s, ulong4 ll) {
   1733     ALOGD("%s {%llu, %llu, %llu, %llu}  0x%llx 0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.w, ll.x, ll.y, ll.z, ll.w);
   1734 }
   1735 static void SC_debugP(const char *s, const void *p) {
   1736     ALOGD("%s %p", s, p);
   1737 }
   1738 
   1739 // TODO: allocation ops, messaging, time
   1740 
   1741 void rsDebug(const char *s, float f) {
   1742     SC_debugF(s, f);
   1743 }
   1744 
   1745 void rsDebug(const char *s, float f1, float f2) {
   1746     SC_debugFv2(s, f1, f2);
   1747 }
   1748 
   1749 void rsDebug(const char *s, float f1, float f2, float f3) {
   1750     SC_debugFv3(s, f1, f2, f3);
   1751 }
   1752 
   1753 void rsDebug(const char *s, float f1, float f2, float f3, float f4) {
   1754     SC_debugFv4(s, f1, f2, f3, f4);
   1755 }
   1756 
   1757 void rsDebug(const char *s, const float2 *f) {
   1758     SC_debugF2(s, *f);
   1759 }
   1760 
   1761 void rsDebug(const char *s, const float3 *f) {
   1762     SC_debugF3(s, *f);
   1763 }
   1764 
   1765 void rsDebug(const char *s, const float4 *f) {
   1766     SC_debugF4(s, *f);
   1767 }
   1768 
   1769 void rsDebug(const char *s, double d) {
   1770     SC_debugD(s, d);
   1771 }
   1772 
   1773 void rsDebug(const char *s, const rs_matrix4x4 *m) {
   1774     SC_debugFM4v4(s, (float *) m);
   1775 }
   1776 
   1777 void rsDebug(const char *s, const rs_matrix3x3 *m) {
   1778     SC_debugFM3v3(s, (float *) m);
   1779 }
   1780 
   1781 void rsDebug(const char *s, const rs_matrix2x2 *m) {
   1782     SC_debugFM2v2(s, (float *) m);
   1783 }
   1784 
   1785 void rsDebug(const char *s, char c) {
   1786     SC_debugI8(s, c);
   1787 }
   1788 
   1789 void rsDebug(const char *s, const char2 *c) {
   1790     SC_debugC2(s, *c);
   1791 }
   1792 
   1793 void rsDebug(const char *s, const char3 *c) {
   1794     SC_debugC3(s, *c);
   1795 }
   1796 
   1797 void rsDebug(const char *s, const char4 *c) {
   1798     SC_debugC4(s, *c);
   1799 }
   1800 
   1801 void rsDebug(const char *s, unsigned char c) {
   1802     SC_debugU8(s, c);
   1803 }
   1804 
   1805 void rsDebug(const char *s, const uchar2 *c) {
   1806     SC_debugUC2(s, *c);
   1807 }
   1808 
   1809 void rsDebug(const char *s, const uchar3 *c) {
   1810     SC_debugUC3(s, *c);
   1811 }
   1812 
   1813 void rsDebug(const char *s, const uchar4 *c) {
   1814     SC_debugUC4(s, *c);
   1815 }
   1816 
   1817 void rsDebug(const char *s, short c) {
   1818     SC_debugI16(s, c);
   1819 }
   1820 
   1821 void rsDebug(const char *s, const short2 *c) {
   1822     SC_debugS2(s, *c);
   1823 }
   1824 
   1825 void rsDebug(const char *s, const short3 *c) {
   1826     SC_debugS3(s, *c);
   1827 }
   1828 
   1829 void rsDebug(const char *s, const short4 *c) {
   1830     SC_debugS4(s, *c);
   1831 }
   1832 
   1833 void rsDebug(const char *s, unsigned short c) {
   1834     SC_debugU16(s, c);
   1835 }
   1836 
   1837 void rsDebug(const char *s, const ushort2 *c) {
   1838     SC_debugUS2(s, *c);
   1839 }
   1840 
   1841 void rsDebug(const char *s, const ushort3 *c) {
   1842     SC_debugUS3(s, *c);
   1843 }
   1844 
   1845 void rsDebug(const char *s, const ushort4 *c) {
   1846     SC_debugUS4(s, *c);
   1847 }
   1848 
   1849 void rsDebug(const char *s, int c) {
   1850     SC_debugI32(s, c);
   1851 }
   1852 
   1853 void rsDebug(const char *s, const int2 *c) {
   1854     SC_debugI2(s, *c);
   1855 }
   1856 
   1857 void rsDebug(const char *s, const int3 *c) {
   1858     SC_debugI3(s, *c);
   1859 }
   1860 
   1861 void rsDebug(const char *s, const int4 *c) {
   1862     SC_debugI4(s, *c);
   1863 }
   1864 
   1865 void rsDebug(const char *s, unsigned int c) {
   1866     SC_debugU32(s, c);
   1867 }
   1868 
   1869 void rsDebug(const char *s, const uint2 *c) {
   1870     SC_debugUI2(s, *c);
   1871 }
   1872 
   1873 void rsDebug(const char *s, const uint3 *c) {
   1874     SC_debugUI3(s, *c);
   1875 }
   1876 
   1877 void rsDebug(const char *s, const uint4 *c) {
   1878     SC_debugUI4(s, *c);
   1879 }
   1880 
   1881 void rsDebug(const char *s, long c) {
   1882     SC_debugLL64(s, c);
   1883 }
   1884 
   1885 void rsDebug(const char *s, long long c) {
   1886     SC_debugLL64(s, c);
   1887 }
   1888 
   1889 void rsDebug(const char *s, const long2 *c) {
   1890     SC_debugL2(s, *c);
   1891 }
   1892 
   1893 void rsDebug(const char *s, const long3 *c) {
   1894     SC_debugL3(s, *c);
   1895 }
   1896 
   1897 void rsDebug(const char *s, const long4 *c) {
   1898     SC_debugL4(s, *c);
   1899 }
   1900 
   1901 void rsDebug(const char *s, unsigned long c) {
   1902     SC_debugULL64(s, c);
   1903 }
   1904 
   1905 void rsDebug(const char *s, unsigned long long c) {
   1906     SC_debugULL64(s, c);
   1907 }
   1908 
   1909 void rsDebug(const char *s, const ulong2 *c) {
   1910     SC_debugUL2(s, *c);
   1911 }
   1912 
   1913 void rsDebug(const char *s, const ulong3 *c) {
   1914     SC_debugUL3(s, *c);
   1915 }
   1916 
   1917 void rsDebug(const char *s, const ulong4 *c) {
   1918     SC_debugUL4(s, *c);
   1919 }
   1920 
   1921 // FIXME: We need to export these function signatures for the compatibility
   1922 // library. The C++ name mangling that LLVM uses for ext_vector_type requires
   1923 // different versions for "long" vs. "long long". Note that the called
   1924 // functions are still using the appropriate 64-bit sizes.
   1925 typedef long l2 __attribute__((ext_vector_type(2)));
   1926 typedef long l3 __attribute__((ext_vector_type(3)));
   1927 typedef long l4 __attribute__((ext_vector_type(4)));
   1928 typedef unsigned long ul2 __attribute__((ext_vector_type(2)));
   1929 typedef unsigned long ul3 __attribute__((ext_vector_type(3)));
   1930 typedef unsigned long ul4 __attribute__((ext_vector_type(4)));
   1931 
   1932 void rsDebug(const char *s, const l2 *c) {
   1933     SC_debugL2(s, *(const long2 *)c);
   1934 }
   1935 
   1936 void rsDebug(const char *s, const l3 *c) {
   1937     SC_debugL3(s, *(const long3 *)c);
   1938 }
   1939 
   1940 void rsDebug(const char *s, const l4 *c) {
   1941     SC_debugL4(s, *(const long4 *)c);
   1942 }
   1943 
   1944 void rsDebug(const char *s, const ul2 *c) {
   1945     SC_debugUL2(s, *(const ulong2 *)c);
   1946 }
   1947 
   1948 void rsDebug(const char *s, const ul3 *c) {
   1949     SC_debugUL3(s, *(const ulong3 *)c);
   1950 }
   1951 
   1952 void rsDebug(const char *s, const ul4 *c) {
   1953     SC_debugUL4(s, *(const ulong4 *)c);
   1954 }
   1955 
   1956 void rsDebug(const char *s, const long2 c) {
   1957     SC_debugL2(s, c);
   1958 }
   1959 
   1960 void rsDebug(const char *s, const long3 c) {
   1961     SC_debugL3(s, c);
   1962 }
   1963 
   1964 void rsDebug(const char *s, const long4 c) {
   1965     SC_debugL4(s, c);
   1966 }
   1967 
   1968 void rsDebug(const char *s, const ulong2 c) {
   1969     SC_debugUL2(s, c);
   1970 }
   1971 
   1972 void rsDebug(const char *s, const ulong3 c) {
   1973     SC_debugUL3(s, c);
   1974 }
   1975 
   1976 void rsDebug(const char *s, const ulong4 c) {
   1977     SC_debugUL4(s, c);
   1978 }
   1979 
   1980 
   1981 void rsDebug(const char *s, const void *p) {
   1982     SC_debugP(s, p);
   1983 }
   1984 #endif // RS_COMPATIBILITY_LIB
   1985 
   1986 extern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name) {
   1987     ScriptC *s = (ScriptC *)pContext;
   1988     const RsdCpuReference::CpuSymbol *syms = gSyms;
   1989     const RsdCpuReference::CpuSymbol *sym = NULL;
   1990 
   1991     if (!sym) {
   1992         while (syms->fnPtr) {
   1993             if (!strcmp(syms->name, name)) {
   1994                 return syms;
   1995             }
   1996             syms++;
   1997         }
   1998     }
   1999 
   2000     return NULL;
   2001 }
   2002