rsdRuntimeStubs.cpp revision f598811a60088236222bb1879503842094ca378b
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "rsContext.h" 18#include "rsScriptC.h" 19#include "rsMatrix4x4.h" 20#include "rsMatrix3x3.h" 21#include "rsMatrix2x2.h" 22#include "rsRuntime.h" 23 24#include "utils/Timers.h" 25#include "rsdCore.h" 26#include "rsdBcc.h" 27 28#include "rsdRuntime.h" 29#include "rsdPath.h" 30#include "rsdAllocation.h" 31#include "rsdShaderCache.h" 32#include "rsdVertexArray.h" 33 34#include <time.h> 35 36using namespace android; 37using namespace android::renderscript; 38 39#define GET_TLS() ScriptTLSStruct * tls = \ 40 (ScriptTLSStruct *)pthread_getspecific(rsdgThreadTLSKey); \ 41 Context * rsc = tls->mContext; \ 42 ScriptC * sc = (ScriptC *) tls->mScript 43 44typedef float float2 __attribute__((ext_vector_type(2))); 45typedef float float3 __attribute__((ext_vector_type(3))); 46typedef float float4 __attribute__((ext_vector_type(4))); 47typedef char char2 __attribute__((ext_vector_type(2))); 48typedef char char3 __attribute__((ext_vector_type(3))); 49typedef char char4 __attribute__((ext_vector_type(4))); 50typedef unsigned char uchar2 __attribute__((ext_vector_type(2))); 51typedef unsigned char uchar3 __attribute__((ext_vector_type(3))); 52typedef unsigned char uchar4 __attribute__((ext_vector_type(4))); 53typedef short short2 __attribute__((ext_vector_type(2))); 54typedef short short3 __attribute__((ext_vector_type(3))); 55typedef short short4 __attribute__((ext_vector_type(4))); 56typedef unsigned short ushort2 __attribute__((ext_vector_type(2))); 57typedef unsigned short ushort3 __attribute__((ext_vector_type(3))); 58typedef unsigned short ushort4 __attribute__((ext_vector_type(4))); 59typedef int32_t int2 __attribute__((ext_vector_type(2))); 60typedef int32_t int3 __attribute__((ext_vector_type(3))); 61typedef int32_t int4 __attribute__((ext_vector_type(4))); 62typedef uint32_t uint2 __attribute__((ext_vector_type(2))); 63typedef uint32_t uint3 __attribute__((ext_vector_type(3))); 64typedef uint32_t uint4 __attribute__((ext_vector_type(4))); 65typedef long long long2 __attribute__((ext_vector_type(2))); 66typedef long long long3 __attribute__((ext_vector_type(3))); 67typedef long long long4 __attribute__((ext_vector_type(4))); 68typedef unsigned long long ulong2 __attribute__((ext_vector_type(2))); 69typedef unsigned long long ulong3 __attribute__((ext_vector_type(3))); 70typedef unsigned long long ulong4 __attribute__((ext_vector_type(4))); 71 72 73////////////////////////////////////////////////////////////////////////////// 74// Allocation 75////////////////////////////////////////////////////////////////////////////// 76 77 78static void SC_AllocationSyncAll2(Allocation *a, RsAllocationUsageType source) { 79 GET_TLS(); 80 rsrAllocationSyncAll(rsc, sc, a, source); 81} 82 83static void SC_AllocationSyncAll(Allocation *a) { 84 GET_TLS(); 85 rsrAllocationSyncAll(rsc, sc, a, RS_ALLOCATION_USAGE_SCRIPT); 86} 87 88static void SC_AllocationCopy1DRange(Allocation *dstAlloc, 89 uint32_t dstOff, 90 uint32_t dstMip, 91 uint32_t count, 92 Allocation *srcAlloc, 93 uint32_t srcOff, uint32_t srcMip) { 94 GET_TLS(); 95 rsrAllocationCopy1DRange(rsc, dstAlloc, dstOff, dstMip, count, 96 srcAlloc, srcOff, srcMip); 97} 98 99static void SC_AllocationCopy2DRange(Allocation *dstAlloc, 100 uint32_t dstXoff, uint32_t dstYoff, 101 uint32_t dstMip, uint32_t dstFace, 102 uint32_t width, uint32_t height, 103 Allocation *srcAlloc, 104 uint32_t srcXoff, uint32_t srcYoff, 105 uint32_t srcMip, uint32_t srcFace) { 106 GET_TLS(); 107 rsrAllocationCopy2DRange(rsc, dstAlloc, 108 dstXoff, dstYoff, dstMip, dstFace, 109 width, height, 110 srcAlloc, 111 srcXoff, srcYoff, srcMip, srcFace); 112} 113 114static void SC_AllocationIoSend(Allocation *alloc) { 115 GET_TLS(); 116 rsdAllocationIoSend(rsc, alloc); 117} 118 119 120static void SC_AllocationIoReceive(Allocation *alloc) { 121 GET_TLS(); 122 rsdAllocationIoReceive(rsc, alloc); 123} 124 125 126 127////////////////////////////////////////////////////////////////////////////// 128// Context 129////////////////////////////////////////////////////////////////////////////// 130 131static void SC_BindTexture(ProgramFragment *pf, uint32_t slot, Allocation *a) { 132 GET_TLS(); 133 rsrBindTexture(rsc, sc, pf, slot, a); 134} 135 136static void SC_BindVertexConstant(ProgramVertex *pv, uint32_t slot, Allocation *a) { 137 GET_TLS(); 138 rsrBindConstant(rsc, sc, pv, slot, a); 139} 140 141static void SC_BindFragmentConstant(ProgramFragment *pf, uint32_t slot, Allocation *a) { 142 GET_TLS(); 143 rsrBindConstant(rsc, sc, pf, slot, a); 144} 145 146static void SC_BindSampler(ProgramFragment *pf, uint32_t slot, Sampler *s) { 147 GET_TLS(); 148 rsrBindSampler(rsc, sc, pf, slot, s); 149} 150 151static void SC_BindProgramStore(ProgramStore *ps) { 152 GET_TLS(); 153 rsrBindProgramStore(rsc, sc, ps); 154} 155 156static void SC_BindProgramFragment(ProgramFragment *pf) { 157 GET_TLS(); 158 rsrBindProgramFragment(rsc, sc, pf); 159} 160 161static void SC_BindProgramVertex(ProgramVertex *pv) { 162 GET_TLS(); 163 rsrBindProgramVertex(rsc, sc, pv); 164} 165 166static void SC_BindProgramRaster(ProgramRaster *pr) { 167 GET_TLS(); 168 rsrBindProgramRaster(rsc, sc, pr); 169} 170 171static void SC_BindFrameBufferObjectColorTarget(Allocation *a, uint32_t slot) { 172 GET_TLS(); 173 rsrBindFrameBufferObjectColorTarget(rsc, sc, a, slot); 174} 175 176static void SC_BindFrameBufferObjectDepthTarget(Allocation *a) { 177 GET_TLS(); 178 rsrBindFrameBufferObjectDepthTarget(rsc, sc, a); 179} 180 181static void SC_ClearFrameBufferObjectColorTarget(uint32_t slot) { 182 GET_TLS(); 183 rsrClearFrameBufferObjectColorTarget(rsc, sc, slot); 184} 185 186static void SC_ClearFrameBufferObjectDepthTarget(Context *, Script *) { 187 GET_TLS(); 188 rsrClearFrameBufferObjectDepthTarget(rsc, sc); 189} 190 191static void SC_ClearFrameBufferObjectTargets(Context *, Script *) { 192 GET_TLS(); 193 rsrClearFrameBufferObjectTargets(rsc, sc); 194} 195 196 197////////////////////////////////////////////////////////////////////////////// 198// VP 199////////////////////////////////////////////////////////////////////////////// 200 201static void SC_VpLoadProjectionMatrix(const rsc_Matrix *m) { 202 GET_TLS(); 203 rsrVpLoadProjectionMatrix(rsc, sc, m); 204} 205 206static void SC_VpLoadModelMatrix(const rsc_Matrix *m) { 207 GET_TLS(); 208 rsrVpLoadModelMatrix(rsc, sc, m); 209} 210 211static void SC_VpLoadTextureMatrix(const rsc_Matrix *m) { 212 GET_TLS(); 213 rsrVpLoadTextureMatrix(rsc, sc, m); 214} 215 216static void SC_PfConstantColor(ProgramFragment *pf, float r, float g, float b, float a) { 217 GET_TLS(); 218 rsrPfConstantColor(rsc, sc, pf, r, g, b, a); 219} 220 221static void SC_VpGetProjectionMatrix(rsc_Matrix *m) { 222 GET_TLS(); 223 rsrVpGetProjectionMatrix(rsc, sc, m); 224} 225 226 227////////////////////////////////////////////////////////////////////////////// 228// Drawing 229////////////////////////////////////////////////////////////////////////////// 230 231static void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1, 232 float x2, float y2, float z2, float u2, float v2, 233 float x3, float y3, float z3, float u3, float v3, 234 float x4, float y4, float z4, float u4, float v4) { 235 GET_TLS(); 236 237 if (!rsc->setupCheck()) { 238 return; 239 } 240 241 RsdHal *dc = (RsdHal *)rsc->mHal.drv; 242 if (!dc->gl.shaderCache->setup(rsc)) { 243 return; 244 } 245 246 //ALOGE("Quad"); 247 //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1); 248 //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2); 249 //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3); 250 //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4); 251 252 float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4}; 253 const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4}; 254 255 RsdVertexArray::Attrib attribs[2]; 256 attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position"); 257 attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0"); 258 259 RsdVertexArray va(attribs, 2); 260 va.setup(rsc); 261 262 RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4); 263} 264 265static void SC_DrawQuad(float x1, float y1, float z1, 266 float x2, float y2, float z2, 267 float x3, float y3, float z3, 268 float x4, float y4, float z4) { 269 GET_TLS(); 270 SC_DrawQuadTexCoords(x1, y1, z1, 0, 1, 271 x2, y2, z2, 1, 1, 272 x3, y3, z3, 1, 0, 273 x4, y4, z4, 0, 0); 274} 275 276static void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) { 277 GET_TLS(); 278 279 ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex()); 280 rsc->setProgramVertex(rsc->getDefaultProgramVertex()); 281 //rsc->setupCheck(); 282 283 //GLint crop[4] = {0, h, w, -h}; 284 285 float sh = rsc->getHeight(); 286 287 SC_DrawQuad(x, sh - y, z, 288 x+w, sh - y, z, 289 x+w, sh - (y+h), z, 290 x, sh - (y+h), z); 291 rsc->setProgramVertex((ProgramVertex *)tmp.get()); 292} 293 294static void SC_DrawRect(float x1, float y1, float x2, float y2, float z) { 295 GET_TLS(); 296 297 SC_DrawQuad(x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z); 298 299} 300 301static void SC_DrawPath(Path *p) { 302 GET_TLS(); 303 //rsrDrawPath(rsc, sc, p); 304 rsdPathDraw(rsc, p); 305} 306 307static void SC_DrawMesh(Mesh *m) { 308 GET_TLS(); 309 rsrDrawMesh(rsc, sc, m); 310} 311 312static void SC_DrawMeshPrimitive(Mesh *m, uint32_t primIndex) { 313 GET_TLS(); 314 rsrDrawMeshPrimitive(rsc, sc, m, primIndex); 315} 316 317static void SC_DrawMeshPrimitiveRange(Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len) { 318 GET_TLS(); 319 rsrDrawMeshPrimitiveRange(rsc, sc, m, primIndex, start, len); 320} 321 322static void SC_MeshComputeBoundingBox(Mesh *m, 323 float *minX, float *minY, float *minZ, 324 float *maxX, float *maxY, float *maxZ) { 325 GET_TLS(); 326 rsrMeshComputeBoundingBox(rsc, sc, m, minX, minY, minZ, maxX, maxY, maxZ); 327} 328 329 330 331////////////////////////////////////////////////////////////////////////////// 332// 333////////////////////////////////////////////////////////////////////////////// 334 335 336static void SC_Color(float r, float g, float b, float a) { 337 GET_TLS(); 338 rsrColor(rsc, sc, r, g, b, a); 339} 340 341static void SC_Finish() { 342 GET_TLS(); 343 rsdGLFinish(rsc); 344} 345 346static void SC_ClearColor(float r, float g, float b, float a) { 347 GET_TLS(); 348 rsrPrepareClear(rsc, sc); 349 rsdGLClearColor(rsc, r, g, b, a); 350} 351 352static void SC_ClearDepth(float v) { 353 GET_TLS(); 354 rsrPrepareClear(rsc, sc); 355 rsdGLClearDepth(rsc, v); 356} 357 358static uint32_t SC_GetWidth() { 359 GET_TLS(); 360 return rsrGetWidth(rsc, sc); 361} 362 363static uint32_t SC_GetHeight() { 364 GET_TLS(); 365 return rsrGetHeight(rsc, sc); 366} 367 368static void SC_DrawTextAlloc(Allocation *a, int x, int y) { 369 GET_TLS(); 370 rsrDrawTextAlloc(rsc, sc, a, x, y); 371} 372 373static void SC_DrawText(const char *text, int x, int y) { 374 GET_TLS(); 375 rsrDrawText(rsc, sc, text, x, y); 376} 377 378static void SC_MeasureTextAlloc(Allocation *a, 379 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 380 GET_TLS(); 381 rsrMeasureTextAlloc(rsc, sc, a, left, right, top, bottom); 382} 383 384static void SC_MeasureText(const char *text, 385 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 386 GET_TLS(); 387 rsrMeasureText(rsc, sc, text, left, right, top, bottom); 388} 389 390static void SC_BindFont(Font *f) { 391 GET_TLS(); 392 rsrBindFont(rsc, sc, f); 393} 394 395static void SC_FontColor(float r, float g, float b, float a) { 396 GET_TLS(); 397 rsrFontColor(rsc, sc, r, g, b, a); 398} 399 400 401 402////////////////////////////////////////////////////////////////////////////// 403// 404////////////////////////////////////////////////////////////////////////////// 405 406static void SC_SetObject(ObjectBase **dst, ObjectBase * src) { 407 GET_TLS(); 408 rsrSetObject(rsc, sc, dst, src); 409} 410 411static void SC_ClearObject(ObjectBase **dst) { 412 GET_TLS(); 413 rsrClearObject(rsc, sc, dst); 414} 415 416static bool SC_IsObject(const ObjectBase *src) { 417 GET_TLS(); 418 return rsrIsObject(rsc, sc, src); 419} 420 421 422 423 424static const Allocation * SC_GetAllocation(const void *ptr) { 425 GET_TLS(); 426 return rsdScriptGetAllocationForPointer(rsc, sc, ptr); 427} 428 429static void SC_ForEach_SAA(Script *target, 430 Allocation *in, 431 Allocation *out) { 432 GET_TLS(); 433 rsrForEach(rsc, sc, target, in, out, NULL, 0, NULL); 434} 435 436static void SC_ForEach_SAAU(Script *target, 437 Allocation *in, 438 Allocation *out, 439 const void *usr) { 440 GET_TLS(); 441 rsrForEach(rsc, sc, target, in, out, usr, 0, NULL); 442} 443 444static void SC_ForEach_SAAUS(Script *target, 445 Allocation *in, 446 Allocation *out, 447 const void *usr, 448 const RsScriptCall *call) { 449 GET_TLS(); 450 rsrForEach(rsc, sc, target, in, out, usr, 0, call); 451} 452 453static void SC_ForEach_SAAUL(Script *target, 454 Allocation *in, 455 Allocation *out, 456 const void *usr, 457 uint32_t usrLen) { 458 GET_TLS(); 459 rsrForEach(rsc, sc, target, in, out, usr, usrLen, NULL); 460} 461 462static void SC_ForEach_SAAULS(Script *target, 463 Allocation *in, 464 Allocation *out, 465 const void *usr, 466 uint32_t usrLen, 467 const RsScriptCall *call) { 468 GET_TLS(); 469 rsrForEach(rsc, sc, target, in, out, usr, usrLen, call); 470} 471 472 473 474////////////////////////////////////////////////////////////////////////////// 475// Time routines 476////////////////////////////////////////////////////////////////////////////// 477 478static float SC_GetDt() { 479 GET_TLS(); 480 return rsrGetDt(rsc, sc); 481} 482 483time_t SC_Time(time_t *timer) { 484 GET_TLS(); 485 return rsrTime(rsc, sc, timer); 486} 487 488tm* SC_LocalTime(tm *local, time_t *timer) { 489 GET_TLS(); 490 return rsrLocalTime(rsc, sc, local, timer); 491} 492 493int64_t SC_UptimeMillis() { 494 GET_TLS(); 495 return rsrUptimeMillis(rsc, sc); 496} 497 498int64_t SC_UptimeNanos() { 499 GET_TLS(); 500 return rsrUptimeNanos(rsc, sc); 501} 502 503////////////////////////////////////////////////////////////////////////////// 504// Message routines 505////////////////////////////////////////////////////////////////////////////// 506 507static uint32_t SC_ToClient2(int cmdID, void *data, int len) { 508 GET_TLS(); 509 return rsrToClient(rsc, sc, cmdID, data, len); 510} 511 512static uint32_t SC_ToClient(int cmdID) { 513 GET_TLS(); 514 return rsrToClient(rsc, sc, cmdID, NULL, 0); 515} 516 517static uint32_t SC_ToClientBlocking2(int cmdID, void *data, int len) { 518 GET_TLS(); 519 return rsrToClientBlocking(rsc, sc, cmdID, data, len); 520} 521 522static uint32_t SC_ToClientBlocking(int cmdID) { 523 GET_TLS(); 524 return rsrToClientBlocking(rsc, sc, cmdID, NULL, 0); 525} 526 527int SC_divsi3(int a, int b) { 528 return a / b; 529} 530 531int SC_modsi3(int a, int b) { 532 return a % b; 533} 534 535unsigned int SC_udivsi3(unsigned int a, unsigned int b) { 536 return a / b; 537} 538 539unsigned int SC_umodsi3(unsigned int a, unsigned int b) { 540 return a % b; 541} 542 543static void SC_debugF(const char *s, float f) { 544 ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f))); 545} 546static void SC_debugFv2(const char *s, float f1, float f2) { 547 ALOGD("%s {%f, %f}", s, f1, f2); 548} 549static void SC_debugFv3(const char *s, float f1, float f2, float f3) { 550 ALOGD("%s {%f, %f, %f}", s, f1, f2, f3); 551} 552static void SC_debugFv4(const char *s, float f1, float f2, float f3, float f4) { 553 ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4); 554} 555static void SC_debugF2(const char *s, float2 f) { 556 ALOGD("%s {%f, %f}", s, f.x, f.y); 557} 558static void SC_debugF3(const char *s, float3 f) { 559 ALOGD("%s {%f, %f, %f}", s, f.x, f.y, f.z); 560} 561static void SC_debugF4(const char *s, float4 f) { 562 ALOGD("%s {%f, %f, %f, %f}", s, f.x, f.y, f.z, f.w); 563} 564static void SC_debugD(const char *s, double d) { 565 ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d))); 566} 567static void SC_debugFM4v4(const char *s, const float *f) { 568 ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]); 569 ALOGD("%s %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]); 570 ALOGD("%s %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]); 571 ALOGD("%s %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]); 572} 573static void SC_debugFM3v3(const char *s, const float *f) { 574 ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]); 575 ALOGD("%s %f, %f, %f", s, f[1], f[4], f[7]); 576 ALOGD("%s %f, %f, %f}",s, f[2], f[5], f[8]); 577} 578static void SC_debugFM2v2(const char *s, const float *f) { 579 ALOGD("%s {%f, %f", s, f[0], f[2]); 580 ALOGD("%s %f, %f}",s, f[1], f[3]); 581} 582static void SC_debugI8(const char *s, char c) { 583 ALOGD("%s %hhd 0x%hhx", s, c, (unsigned char)c); 584} 585static void SC_debugC2(const char *s, char2 c) { 586 ALOGD("%s {%hhd, %hhd} 0x%hhx 0x%hhx", s, c.x, c.y, (unsigned char)c.x, (unsigned char)c.y); 587} 588static void SC_debugC3(const char *s, char3 c) { 589 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); 590} 591static void SC_debugC4(const char *s, char4 c) { 592 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); 593} 594static void SC_debugU8(const char *s, unsigned char c) { 595 ALOGD("%s %hhu 0x%hhx", s, c, c); 596} 597static void SC_debugUC2(const char *s, uchar2 c) { 598 ALOGD("%s {%hhu, %hhu} 0x%hhx 0x%hhx", s, c.x, c.y, c.x, c.y); 599} 600static void SC_debugUC3(const char *s, uchar3 c) { 601 ALOGD("%s {%hhu, %hhu, %hhu} 0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, c.x, c.y, c.z); 602} 603static void SC_debugUC4(const char *s, uchar4 c) { 604 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); 605} 606static void SC_debugI16(const char *s, short c) { 607 ALOGD("%s %hd 0x%hx", s, c, c); 608} 609static void SC_debugS2(const char *s, short2 c) { 610 ALOGD("%s {%hd, %hd} 0x%hx 0x%hx", s, c.x, c.y, c.x, c.y); 611} 612static void SC_debugS3(const char *s, short3 c) { 613 ALOGD("%s {%hd, %hd, %hd} 0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z); 614} 615static void SC_debugS4(const char *s, short4 c) { 616 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); 617} 618static void SC_debugU16(const char *s, unsigned short c) { 619 ALOGD("%s %hu 0x%hx", s, c, c); 620} 621static void SC_debugUS2(const char *s, ushort2 c) { 622 ALOGD("%s {%hu, %hu} 0x%hx 0x%hx", s, c.x, c.y, c.x, c.y); 623} 624static void SC_debugUS3(const char *s, ushort3 c) { 625 ALOGD("%s {%hu, %hu, %hu} 0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z); 626} 627static void SC_debugUS4(const char *s, ushort4 c) { 628 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); 629} 630static void SC_debugI32(const char *s, int32_t i) { 631 ALOGD("%s %d 0x%x", s, i, i); 632} 633static void SC_debugI2(const char *s, int2 i) { 634 ALOGD("%s {%d, %d} 0x%x 0x%x", s, i.x, i.y, i.x, i.y); 635} 636static void SC_debugI3(const char *s, int3 i) { 637 ALOGD("%s {%d, %d, %d} 0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z); 638} 639static void SC_debugI4(const char *s, int4 i) { 640 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); 641} 642static void SC_debugU32(const char *s, uint32_t i) { 643 ALOGD("%s %u 0x%x", s, i, i); 644} 645static void SC_debugUI2(const char *s, uint2 i) { 646 ALOGD("%s {%u, %u} 0x%x 0x%x", s, i.x, i.y, i.x, i.y); 647} 648static void SC_debugUI3(const char *s, uint3 i) { 649 ALOGD("%s {%u, %u, %u} 0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z); 650} 651static void SC_debugUI4(const char *s, uint4 i) { 652 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); 653} 654static void SC_debugLL64(const char *s, long long ll) { 655 ALOGD("%s %lld 0x%llx", s, ll, ll); 656} 657static void SC_debugL2(const char *s, long2 ll) { 658 ALOGD("%s {%lld, %lld} 0x%llx 0x%llx", s, ll.x, ll.y, ll.x, ll.y); 659} 660static void SC_debugL3(const char *s, long3 ll) { 661 ALOGD("%s {%lld, %lld, %lld} 0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.x, ll.y, ll.z); 662} 663static void SC_debugL4(const char *s, long4 ll) { 664 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); 665} 666static void SC_debugULL64(const char *s, unsigned long long ll) { 667 ALOGD("%s %llu 0x%llx", s, ll, ll); 668} 669static void SC_debugUL2(const char *s, ulong2 ll) { 670 ALOGD("%s {%llu, %llu} 0x%llx 0x%llx", s, ll.x, ll.y, ll.x, ll.y); 671} 672static void SC_debugUL3(const char *s, ulong3 ll) { 673 ALOGD("%s {%llu, %llu, %llu} 0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.x, ll.y, ll.z); 674} 675static void SC_debugUL4(const char *s, ulong4 ll) { 676 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); 677} 678static void SC_debugP(const char *s, const void *p) { 679 ALOGD("%s %p", s, p); 680} 681 682 683////////////////////////////////////////////////////////////////////////////// 684// Stub implementation 685////////////////////////////////////////////////////////////////////////////// 686 687// llvm name mangling ref 688// <builtin-type> ::= v # void 689// ::= b # bool 690// ::= c # char 691// ::= a # signed char 692// ::= h # unsigned char 693// ::= s # short 694// ::= t # unsigned short 695// ::= i # int 696// ::= j # unsigned int 697// ::= l # long 698// ::= m # unsigned long 699// ::= x # long long, __int64 700// ::= y # unsigned long long, __int64 701// ::= f # float 702// ::= d # double 703 704static RsdSymbolTable gSyms[] = { 705 { "memset", (void *)&memset, true }, 706 { "memcpy", (void *)&memcpy, true }, 707 708 // Refcounting 709 { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_SetObject, true }, 710 { "_Z13rsClearObjectP10rs_element", (void *)&SC_ClearObject, true }, 711 { "_Z10rsIsObject10rs_element", (void *)&SC_IsObject, true }, 712 713 { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_SetObject, true }, 714 { "_Z13rsClearObjectP7rs_type", (void *)&SC_ClearObject, true }, 715 { "_Z10rsIsObject7rs_type", (void *)&SC_IsObject, true }, 716 717 { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_SetObject, true }, 718 { "_Z13rsClearObjectP13rs_allocation", (void *)&SC_ClearObject, true }, 719 { "_Z10rsIsObject13rs_allocation", (void *)&SC_IsObject, true }, 720 721 { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_SetObject, true }, 722 { "_Z13rsClearObjectP10rs_sampler", (void *)&SC_ClearObject, true }, 723 { "_Z10rsIsObject10rs_sampler", (void *)&SC_IsObject, true }, 724 725 { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_SetObject, true }, 726 { "_Z13rsClearObjectP9rs_script", (void *)&SC_ClearObject, true }, 727 { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject, true }, 728 729 { "_Z11rsSetObjectP7rs_pathS_", (void *)&SC_SetObject, true }, 730 { "_Z13rsClearObjectP7rs_path", (void *)&SC_ClearObject, true }, 731 { "_Z10rsIsObject7rs_path", (void *)&SC_IsObject, true }, 732 733 { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_SetObject, true }, 734 { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_ClearObject, true }, 735 { "_Z10rsIsObject7rs_mesh", (void *)&SC_IsObject, true }, 736 737 { "_Z11rsSetObjectP19rs_program_fragmentS_", (void *)&SC_SetObject, true }, 738 { "_Z13rsClearObjectP19rs_program_fragment", (void *)&SC_ClearObject, true }, 739 { "_Z10rsIsObject19rs_program_fragment", (void *)&SC_IsObject, true }, 740 741 { "_Z11rsSetObjectP17rs_program_vertexS_", (void *)&SC_SetObject, true }, 742 { "_Z13rsClearObjectP17rs_program_vertex", (void *)&SC_ClearObject, true }, 743 { "_Z10rsIsObject17rs_program_vertex", (void *)&SC_IsObject, true }, 744 745 { "_Z11rsSetObjectP17rs_program_rasterS_", (void *)&SC_SetObject, true }, 746 { "_Z13rsClearObjectP17rs_program_raster", (void *)&SC_ClearObject, true }, 747 { "_Z10rsIsObject17rs_program_raster", (void *)&SC_IsObject, true }, 748 749 { "_Z11rsSetObjectP16rs_program_storeS_", (void *)&SC_SetObject, true }, 750 { "_Z13rsClearObjectP16rs_program_store", (void *)&SC_ClearObject, true }, 751 { "_Z10rsIsObject16rs_program_store", (void *)&SC_IsObject, true }, 752 753 { "_Z11rsSetObjectP7rs_fontS_", (void *)&SC_SetObject, true }, 754 { "_Z13rsClearObjectP7rs_font", (void *)&SC_ClearObject, true }, 755 { "_Z10rsIsObject7rs_font", (void *)&SC_IsObject, true }, 756 757 // Allocation ops 758 { "_Z21rsAllocationMarkDirty13rs_allocation", (void *)&SC_AllocationSyncAll, true }, 759 { "_Z20rsgAllocationSyncAll13rs_allocation", (void *)&SC_AllocationSyncAll, false }, 760 { "_Z20rsgAllocationSyncAll13rs_allocationj", (void *)&SC_AllocationSyncAll2, false }, 761 { "_Z20rsgAllocationSyncAll13rs_allocation24rs_allocation_usage_type", (void *)&SC_AllocationSyncAll2, false }, 762 { "_Z15rsGetAllocationPKv", (void *)&SC_GetAllocation, true }, 763 { "_Z18rsAllocationIoSend13rs_allocation", (void *)&SC_AllocationIoSend, false }, 764 { "_Z21rsAllocationIoReceive13rs_allocation", (void *)&SC_AllocationIoReceive, false }, 765 { "_Z23rsAllocationCopy1DRange13rs_allocationjjjS_jj", (void *)&SC_AllocationCopy1DRange, false }, 766 { "_Z23rsAllocationCopy2DRange13rs_allocationjjj26rs_allocation_cubemap_facejjS_jjjS0_", (void *)&SC_AllocationCopy2DRange, false }, 767 768 // Messaging 769 770 { "_Z14rsSendToClienti", (void *)&SC_ToClient, false }, 771 { "_Z14rsSendToClientiPKvj", (void *)&SC_ToClient2, false }, 772 { "_Z22rsSendToClientBlockingi", (void *)&SC_ToClientBlocking, false }, 773 { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_ToClientBlocking2, false }, 774 775 { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_BindProgramFragment, false }, 776 { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_BindProgramStore, false }, 777 { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_BindProgramVertex, false }, 778 { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_BindProgramRaster, false }, 779 { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_BindSampler, false }, 780 { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_BindTexture, false }, 781 { "_Z15rsgBindConstant19rs_program_fragmentj13rs_allocation", (void *)&SC_BindFragmentConstant, false }, 782 { "_Z15rsgBindConstant17rs_program_vertexj13rs_allocation", (void *)&SC_BindVertexConstant, false }, 783 784 { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadProjectionMatrix, false }, 785 { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadModelMatrix, false }, 786 { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadTextureMatrix, false }, 787 788 { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_VpGetProjectionMatrix, false }, 789 790 { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_PfConstantColor, false }, 791 792 { "_Z11rsgGetWidthv", (void *)&SC_GetWidth, false }, 793 { "_Z12rsgGetHeightv", (void *)&SC_GetHeight, false }, 794 795 796 { "_Z11rsgDrawRectfffff", (void *)&SC_DrawRect, false }, 797 { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_DrawQuad, false }, 798 { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_DrawQuadTexCoords, false }, 799 { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_DrawSpriteScreenspace, false }, 800 801 { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_DrawMesh, false }, 802 { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_DrawMeshPrimitive, false }, 803 { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_DrawMeshPrimitiveRange, false }, 804 { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_MeshComputeBoundingBox, false }, 805 806 { "_Z11rsgDrawPath7rs_path", (void *)&SC_DrawPath, false }, 807 808 { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false }, 809 { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false }, 810 811 { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText, false }, 812 { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc, false }, 813 { "_Z14rsgMeasureTextPKcPiS1_S1_S1_", (void *)&SC_MeasureText, false }, 814 { "_Z14rsgMeasureText13rs_allocationPiS0_S0_S0_", (void *)&SC_MeasureTextAlloc, false }, 815 816 { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont, false }, 817 { "_Z12rsgFontColorffff", (void *)&SC_FontColor, false }, 818 819 { "_Z18rsgBindColorTarget13rs_allocationj", (void *)&SC_BindFrameBufferObjectColorTarget, false }, 820 { "_Z18rsgBindDepthTarget13rs_allocation", (void *)&SC_BindFrameBufferObjectDepthTarget, false }, 821 { "_Z19rsgClearColorTargetj", (void *)&SC_ClearFrameBufferObjectColorTarget, false }, 822 { "_Z19rsgClearDepthTargetv", (void *)&SC_ClearFrameBufferObjectDepthTarget, false }, 823 { "_Z24rsgClearAllRenderTargetsv", (void *)&SC_ClearFrameBufferObjectTargets, false }, 824 825 { "_Z9rsForEach9rs_script13rs_allocationS0_", (void *)&SC_ForEach_SAA, true }, 826 { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach_SAAU, true }, 827 { "_Z9rsForEach9rs_script13rs_allocationS0_PKvPK14rs_script_call", (void *)&SC_ForEach_SAAUS, true }, 828 { "_Z9rsForEach9rs_script13rs_allocationS0_PKvj", (void *)&SC_ForEach_SAAUL, true }, 829 { "_Z9rsForEach9rs_script13rs_allocationS0_PKvjPK14rs_script_call", (void *)&SC_ForEach_SAAULS, true }, 830 831 // time 832 { "_Z6rsTimePi", (void *)&SC_Time, true }, 833 { "_Z11rsLocaltimeP5rs_tmPKi", (void *)&SC_LocalTime, true }, 834 { "_Z14rsUptimeMillisv", (void*)&SC_UptimeMillis, true }, 835 { "_Z13rsUptimeNanosv", (void*)&SC_UptimeNanos, true }, 836 { "_Z7rsGetDtv", (void*)&SC_GetDt, false }, 837 838 // misc 839 { "_Z5colorffff", (void *)&SC_Color, false }, 840 { "_Z9rsgFinishv", (void *)&SC_Finish, false }, 841 842 // Debug 843 { "_Z7rsDebugPKcf", (void *)&SC_debugF, true }, 844 { "_Z7rsDebugPKcff", (void *)&SC_debugFv2, true }, 845 { "_Z7rsDebugPKcfff", (void *)&SC_debugFv3, true }, 846 { "_Z7rsDebugPKcffff", (void *)&SC_debugFv4, true }, 847 { "_Z7rsDebugPKcDv2_f", (void *)&SC_debugF2, true }, 848 { "_Z7rsDebugPKcDv3_f", (void *)&SC_debugF3, true }, 849 { "_Z7rsDebugPKcDv4_f", (void *)&SC_debugF4, true }, 850 { "_Z7rsDebugPKcd", (void *)&SC_debugD, true }, 851 { "_Z7rsDebugPKcPK12rs_matrix4x4", (void *)&SC_debugFM4v4, true }, 852 { "_Z7rsDebugPKcPK12rs_matrix3x3", (void *)&SC_debugFM3v3, true }, 853 { "_Z7rsDebugPKcPK12rs_matrix2x2", (void *)&SC_debugFM2v2, true }, 854 { "_Z7rsDebugPKcc", (void *)&SC_debugI8, true }, 855 { "_Z7rsDebugPKcDv2_c", (void *)&SC_debugC2, true }, 856 { "_Z7rsDebugPKcDv3_c", (void *)&SC_debugC3, true }, 857 { "_Z7rsDebugPKcDv4_c", (void *)&SC_debugC4, true }, 858 { "_Z7rsDebugPKch", (void *)&SC_debugU8, true }, 859 { "_Z7rsDebugPKcDv2_h", (void *)&SC_debugUC2, true }, 860 { "_Z7rsDebugPKcDv3_h", (void *)&SC_debugUC3, true }, 861 { "_Z7rsDebugPKcDv4_h", (void *)&SC_debugUC4, true }, 862 { "_Z7rsDebugPKcs", (void *)&SC_debugI16, true }, 863 { "_Z7rsDebugPKcDv2_s", (void *)&SC_debugS2, true }, 864 { "_Z7rsDebugPKcDv3_s", (void *)&SC_debugS3, true }, 865 { "_Z7rsDebugPKcDv4_s", (void *)&SC_debugS4, true }, 866 { "_Z7rsDebugPKct", (void *)&SC_debugU16, true }, 867 { "_Z7rsDebugPKcDv2_t", (void *)&SC_debugUS2, true }, 868 { "_Z7rsDebugPKcDv3_t", (void *)&SC_debugUS3, true }, 869 { "_Z7rsDebugPKcDv4_t", (void *)&SC_debugUS4, true }, 870 { "_Z7rsDebugPKci", (void *)&SC_debugI32, true }, 871 { "_Z7rsDebugPKcDv2_i", (void *)&SC_debugI2, true }, 872 { "_Z7rsDebugPKcDv3_i", (void *)&SC_debugI3, true }, 873 { "_Z7rsDebugPKcDv4_i", (void *)&SC_debugI4, true }, 874 { "_Z7rsDebugPKcj", (void *)&SC_debugU32, true }, 875 { "_Z7rsDebugPKcDv2_j", (void *)&SC_debugUI2, true }, 876 { "_Z7rsDebugPKcDv3_j", (void *)&SC_debugUI3, true }, 877 { "_Z7rsDebugPKcDv4_j", (void *)&SC_debugUI4, true }, 878 // Both "long" and "unsigned long" need to be redirected to their 879 // 64-bit counterparts, since we have hacked Slang to use 64-bit 880 // for "long" on Arm (to be similar to Java). 881 { "_Z7rsDebugPKcl", (void *)&SC_debugLL64, true }, 882 { "_Z7rsDebugPKcDv2_l", (void *)&SC_debugL2, true }, 883 { "_Z7rsDebugPKcDv3_l", (void *)&SC_debugL3, true }, 884 { "_Z7rsDebugPKcDv4_l", (void *)&SC_debugL4, true }, 885 { "_Z7rsDebugPKcm", (void *)&SC_debugULL64, true }, 886 { "_Z7rsDebugPKcDv2_m", (void *)&SC_debugUL2, true }, 887 { "_Z7rsDebugPKcDv3_m", (void *)&SC_debugUL3, true }, 888 { "_Z7rsDebugPKcDv4_m", (void *)&SC_debugUL4, true }, 889 { "_Z7rsDebugPKcx", (void *)&SC_debugLL64, true }, 890 { "_Z7rsDebugPKcDv2_x", (void *)&SC_debugL2, true }, 891 { "_Z7rsDebugPKcDv3_x", (void *)&SC_debugL3, true }, 892 { "_Z7rsDebugPKcDv4_x", (void *)&SC_debugL4, true }, 893 { "_Z7rsDebugPKcy", (void *)&SC_debugULL64, true }, 894 { "_Z7rsDebugPKcDv2_y", (void *)&SC_debugUL2, true }, 895 { "_Z7rsDebugPKcDv3_y", (void *)&SC_debugUL3, true }, 896 { "_Z7rsDebugPKcDv4_y", (void *)&SC_debugUL4, true }, 897 { "_Z7rsDebugPKcPKv", (void *)&SC_debugP, true }, 898 899 { NULL, NULL, false } 900}; 901 902 903void* rsdLookupRuntimeStub(void* pContext, char const* name) { 904 ScriptC *s = (ScriptC *)pContext; 905 RsdSymbolTable *syms = gSyms; 906 const RsdSymbolTable *sym = rsdLookupSymbolMath(name); 907 908 if (!sym) { 909 while (syms->mPtr) { 910 if (!strcmp(syms->mName, name)) { 911 sym = syms; 912 } 913 syms++; 914 } 915 } 916 917 if (sym) { 918 s->mHal.info.isThreadable &= sym->threadable; 919 return sym->mPtr; 920 } 921 ALOGE("ScriptC sym lookup failed for %s", name); 922 return NULL; 923} 924 925 926