rsdRuntimeStubs.cpp revision b1f9eb6b37dace844ab927421c2dbfdff954e72d
187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams/*
2709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Copyright (C) 2011-2012 The Android Open Source Project
387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *
487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * you may not use this file except in compliance with the License.
687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * You may obtain a copy of the License at
787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *
887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *
1087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * Unless required by applicable law or agreed to in writing, software
1187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * See the License for the specific language governing permissions and
1487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * limitations under the License.
1587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams */
1687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
1787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsContext.h"
186b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#include "rsElement.h"
1987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsScriptC.h"
2087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix4x4.h"
2187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix3x3.h"
2287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix2x2.h"
2387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsRuntime.h"
246b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#include "rsType.h"
2587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
2687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsdCore.h"
27807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams#include "rsdBcc.h"
2887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
29b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams#include "rsdAllocation.h"
30414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#include "rsdShaderCache.h"
31414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#include "rsdVertexArray.h"
3287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
3387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include <time.h>
3487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
3587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsusing namespace android;
3687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsusing namespace android::renderscript;
3787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
3863bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga Nainartypedef __fp16 half;
3963bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga Nainartypedef half half2 __attribute__((ext_vector_type(2)));
4063bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga Nainartypedef half half3 __attribute__((ext_vector_type(3)));
4163bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga Nainartypedef half half4 __attribute__((ext_vector_type(4)));
4263bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga Nainar
43a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float2 __attribute__((ext_vector_type(2)));
44a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float3 __attribute__((ext_vector_type(3)));
45a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float4 __attribute__((ext_vector_type(4)));
465261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double2 __attribute__((ext_vector_type(2)));
475261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double3 __attribute__((ext_vector_type(3)));
485261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double4 __attribute__((ext_vector_type(4)));
49a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char2 __attribute__((ext_vector_type(2)));
50a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char3 __attribute__((ext_vector_type(3)));
51a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char4 __attribute__((ext_vector_type(4)));
52a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar2 __attribute__((ext_vector_type(2)));
53a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar3 __attribute__((ext_vector_type(3)));
54a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar4 __attribute__((ext_vector_type(4)));
55d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short2 __attribute__((ext_vector_type(2)));
56d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short3 __attribute__((ext_vector_type(3)));
57d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short4 __attribute__((ext_vector_type(4)));
58d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort2 __attribute__((ext_vector_type(2)));
59d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort3 __attribute__((ext_vector_type(3)));
60d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort4 __attribute__((ext_vector_type(4)));
61a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int2 __attribute__((ext_vector_type(2)));
62a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int3 __attribute__((ext_vector_type(3)));
63a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int4 __attribute__((ext_vector_type(4)));
64a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint2 __attribute__((ext_vector_type(2)));
65a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint3 __attribute__((ext_vector_type(3)));
66a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint4 __attribute__((ext_vector_type(4)));
67d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long2 __attribute__((ext_vector_type(2)));
68d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long3 __attribute__((ext_vector_type(3)));
69d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long4 __attribute__((ext_vector_type(4)));
70d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong2 __attribute__((ext_vector_type(2)));
71d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong3 __attribute__((ext_vector_type(3)));
72d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong4 __attribute__((ext_vector_type(4)));
7387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
745261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint8_t uchar;
755261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint16_t ushort;
765261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint32_t uint;
770b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER
785261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint64_t ulong;
790b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif
8087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
81127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#ifndef __LP64__
82d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#define OPAQUETYPE(t) \
83d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    typedef struct { const int* const p; } __attribute__((packed, aligned(4))) t;
84127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#else
85127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#define OPAQUETYPE(t) \
86127d51c1193f4055795da967d47a13bedd3cb951Miao Wang    typedef struct { const void* p; const void* r; const void* v1; const void* v2; } t;
87127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#endif
88d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
89d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_element)
90d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_type)
91d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_allocation)
92d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_sampler)
93d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_script)
94d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_script_call)
952544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga Nainar
962544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_fragment);
972544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_store);
982544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_vertex);
992544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_raster);
1002544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_mesh);
1012544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_font);
1022544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga Nainar
103d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#undef OPAQUETYPE
104d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
1057a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hinestypedef enum {
1067a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines    // Empty to avoid conflicting definitions with RsAllocationCubemapFace
1077a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines} rs_allocation_cubemap_face;
1087a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines
1096b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainartypedef enum {
1106b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // Empty to avoid conflicting definitions with RsYuvFormat
1116b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar} rs_yuv_format;
1126b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
1136b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainartypedef enum {
1146b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // Empty to avoid conflicting definitions with RsAllocationMipmapControl
1156b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar} rs_allocation_mipmap_control;
1166b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
117174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef struct { unsigned int val; } rs_allocation_usage_type;
118174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
119d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murraytypedef struct {
120d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_sec;     ///< seconds
121d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_min;     ///< minutes
122d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_hour;    ///< hours
123d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_mday;    ///< day of the month
124d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_mon;     ///< month
125d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_year;    ///< year
126d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_wday;    ///< day of the week
127d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_yday;    ///< day of the year
128d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_isdst;   ///< daylight savings time
129d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray} rs_tm;
130d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
1317153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// Some RS functions are not threadsafe but can be called from an invoke
1327153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// function.  Instead of summarily marking scripts that call these functions as
1337153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// not-threadable we detect calls to them in the driver and sends a fatal error
1347153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// message.
1357153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainarstatic bool failIfInKernel(Context *rsc, const char *funcName) {
1367153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
1377153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    RsdCpuReference *impl = (RsdCpuReference *) dc->mCpuRef;
1387153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
1397153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (impl->getInForEach()) {
1407153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        char buf[256];
141838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang        snprintf(buf, sizeof(buf), "Error: Call to unsupported function %s "
1427153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar                         "in kernel", funcName);
1437153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        rsc->setError(RS_ERROR_FATAL_DRIVER, buf);
1447153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return true;
1457153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    }
1467153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    return false;
1477153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar}
1487153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
14987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
150174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Allocation routines
15187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
15266d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic#if defined(__i386__) || (defined(__mips__) && __mips==32)
15366d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic// i386 and MIPS32 have different struct return passing to ARM; emulate with a pointer
154174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst Allocation * rsGetAllocation(const void *ptr) {
155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
156174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
157174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
158174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0};
159174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    alloc->callUpdateCacheObject(rsc, &obj);
160174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return (Allocation *)obj.p;
16174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk}
162174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
163174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst android::renderscript::rs_allocation rsGetAllocation(const void *ptr) {
164709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
165174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
166174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
1677153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
16866d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic#ifndef __LP64__ // ARMv7
169174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0};
170174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else // AArch64/x86_64/MIPS64
171174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0, 0, 0, 0};
172174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
173174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    alloc->callUpdateCacheObject(rsc, &obj);
174174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return obj;
17574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk}
176174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
17774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
178174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationIoSend(::rs_allocation a) {
1791aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1807153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationIoSend"))
1817153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
182174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationIoSend(rsc, (Allocation *)a.p);
1831aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
1841aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
185174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationIoReceive(::rs_allocation a) {
1861aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1877153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationIoReceive"))
1887153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
189174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationIoReceive(rsc, (Allocation *)a.p);
1901aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
1911aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
192174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationCopy1DRange(
193174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation dstAlloc,
194174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstOff, uint32_t dstMip, uint32_t count,
195174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation srcAlloc,
196174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcOff, uint32_t srcMip) {
1971aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1987153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationCopy1DRange"))
1997153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
200174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationCopy1DRange(rsc, (Allocation *)dstAlloc.p, dstOff, dstMip,
201174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                             count, (Allocation *)srcAlloc.p, srcOff, srcMip);
2021aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
2031aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
204174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationCopy2DRange(
205174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation dstAlloc,
206174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstXoff, uint32_t dstYoff,
207174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstMip, rs_allocation_cubemap_face dstFace,
208174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t width, uint32_t height,
209174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation srcAlloc,
210174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcXoff, uint32_t srcYoff,
211174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcMip, rs_allocation_cubemap_face srcFace) {
2121aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
2137153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationCopy2DRange"))
2147153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
215174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationCopy2DRange(rsc, (Allocation *)dstAlloc.p,
2161aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray                             dstXoff, dstYoff, dstMip, dstFace,
217174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                             width, height, (Allocation *)srcAlloc.p,
2181aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray                             srcXoff, srcYoff, srcMip, srcFace);
2191aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
2201aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
2216b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarstatic android::renderscript::rs_element CreateElement(RsDataType dt,
2226b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                       RsDataKind dk,
2236b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                       bool isNormalized,
2246b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                       uint32_t vecSize) {
2256b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
2266b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2276b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // No need for validation here.  The rsCreateElement overload below is not
2286b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // exposed to the Script.  The Element-creation APIs call this function in a
2296b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // consistent manner and rsComponent.cpp asserts on any inconsistency.
2306b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Element *element = (Element *) rsrElementCreate(rsc, dt, dk, isNormalized,
2316b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                    vecSize);
2326b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_element obj = {};
2336b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (element == nullptr)
2346b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2356b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    element->callUpdateCacheObject(rsc, &obj);
236b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni
237b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // Any new rsObject created from inside a script should have the usrRefCount
238b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // initialized to 0 and the sysRefCount initialized to 1.
239b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    element->incSysRef();
240b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    element->decUserRef();
241b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni
2426b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
2436b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
2446b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2456b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarstatic android::renderscript::rs_type CreateType(RsElement element,
2466b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t dimX, uint32_t dimY,
2476b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t dimZ, bool mipmaps,
2486b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 bool faces,
2496b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t yuv_format) {
2506b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2516b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
2526b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_type obj = {};
2536b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2546b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (element == nullptr) {
2556b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Invalid element");
2566b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2576b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2586b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2596b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // validate yuv_format
2606b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    RsYuvFormat yuv = (RsYuvFormat) yuv_format;
2616b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (yuv != RS_YUV_NONE &&
2626b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_YV12 &&
2636b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_NV21 &&
2646b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_420_888) {
2656b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2666b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Invalid yuv_format %d\n", yuv_format);
2676b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2686b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2696b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2706b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // validate consistency of shape parameters
2716b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (dimZ > 0) {
2726b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (dimX < 1 || dimY < 1) {
2736b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: Both X and Y dimension required "
2746b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                  "when Z is present.");
2756b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2766b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2776b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (mipmaps) {
2786b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: mipmap control requires 2D types");
2796b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2806b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2816b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (faces) {
2826b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: Cube maps require 2D types");
2836b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2846b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2856b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2866b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (dimY > 0 && dimX < 1) {
2876b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: X dimension required when Y is "
2886b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar              "present.");
2896b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2906b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2916b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (mipmaps && dimY < 1) {
2926b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: mipmap control require 2D Types.");
2936b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2946b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2956b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (faces && dimY < 1) {
2966b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Cube maps require 2D Types.");
2976b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2986b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2996b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (yuv_format != RS_YUV_NONE) {
3006b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (dimZ != 0 || dimY == 0 || faces || mipmaps) {
3016b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: YUV only supports basic 2D.");
3026b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
3036b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
3046b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
3056b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3066b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Type *type = (Type *) rsrTypeCreate(rsc, element, dimX, dimY, dimZ, mipmaps,
3076b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                        faces, yuv_format);
3086b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (type == nullptr)
3096b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3106b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    type->callUpdateCacheObject(rsc, &obj);
311b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni
312b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // Any new rsObject created from inside a script should have the usrRefCount
313b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // initialized to 0 and the sysRefCount initialized to 1.
314b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    type->incSysRef();
315b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    type->decUserRef();
316b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni
3176b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
3186b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3196b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3206b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarstatic android::renderscript::rs_allocation CreateAllocation(
3216b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        RsType type, RsAllocationMipmapControl mipmaps, uint32_t usages,
3226b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        void *ptr) {
3236b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3246b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
3256b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_allocation obj = {};
3266b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3276b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (type == nullptr) {
3286b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_allocation creation error: Invalid type");
3296b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3306b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
3316b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3326b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    uint32_t validUsages = RS_ALLOCATION_USAGE_SCRIPT | \
3336b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                           RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
3346b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (usages & ~validUsages) {
3356b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_allocation creation error: Invalid usage flag");
3366b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3376b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
3386b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3396b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Allocation *alloc = (Allocation *) rsrAllocationCreateTyped(rsc, type,
3406b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                                mipmaps, usages,
3416b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                                (uintptr_t) ptr);
3426b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (alloc == nullptr)
3436b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3446b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    alloc->callUpdateCacheObject(rsc, &obj);
3456b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
346b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // Any new rsObject created from inside a script should have the usrRefCount
347b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // initialized to 0 and the sysRefCount initialized to 1.
348b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    alloc->incSysRef();
349b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    alloc->decUserRef();
350b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni
3516b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
3526b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3536b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3546b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// Define rsCreateElement, rsCreateType and rsCreateAllocation entry points
3556b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// differently for 32-bit x86 and Mips.  The definitions for ARM32 and all
3566b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// 64-bit architectures is further below.
3576b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#if defined(__i386__) || (defined(__mips__) && __mips==32)
3586b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3596b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// The calling convention for the driver on 32-bit x86 and Mips returns
3606b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// rs_element etc. as a stack-return parameter.  The Script uses ARM32 calling
3616b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// conventions that return the structs in a register.  To match this convention,
3626b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// emulate the return value using a pointer.
3636b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarElement *rsCreateElement(int32_t dt, int32_t dk, bool isNormalized,
3646b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                         uint32_t vecSize) {
3656b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3666b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_element obj = CreateElement((RsDataType) dt,
3676b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          (RsDataKind) dk,
3686b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          isNormalized,
3696b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          vecSize);
3706b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Element *) obj.p;
3716b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3726b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3736b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarType *rsCreateType(::rs_element element, uint32_t dimX, uint32_t dimY,
3746b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                   uint32_t dimZ, bool mipmaps, bool faces,
3756b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                   rs_yuv_format yuv_format) {
3766b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_type obj = CreateType((RsElement) element.p, dimX,
3776b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                    dimY, dimZ, mipmaps, faces,
3786b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                    (RsYuvFormat) yuv_format);
3796b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Type *) obj.p;
3806b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3816b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3826b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarAllocation *rsCreateAllocation(::rs_type type,
3836b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                               rs_allocation_mipmap_control mipmaps,
3846b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                               uint32_t usages, void *ptr) {
3856b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3866b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_allocation obj;
3876b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    obj = CreateAllocation((RsType) type.p, (RsAllocationMipmapControl) mipmaps,
3886b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                           usages, ptr);
3896b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Allocation *) obj.p;
3906b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3916b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3926b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#else
3936b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_element rsCreateElement(int32_t dt, int32_t dk,
3946b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                  bool isNormalized,
3956b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                  uint32_t vecSize) {
3966b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3976b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateElement((RsDataType) dt, (RsDataKind) dk, isNormalized,
3986b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                         vecSize);
3996b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
4006b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
4016b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_type rsCreateType(::rs_element element, uint32_t dimX,
4026b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            uint32_t dimY, uint32_t dimZ,
4036b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            bool mipmaps, bool faces,
4046b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            rs_yuv_format yuv_format) {
4056b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateType((RsElement) element.p, dimX, dimY, dimZ, mipmaps, faces,
4066b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                      yuv_format);
4076b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
4086b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
4096b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_allocation rsCreateAllocation(
4106b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ::rs_type type, rs_allocation_mipmap_control mipmaps, uint32_t usages,
4116b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        void *ptr) {
4126b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
4136b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateAllocation((RsType) type.p,
4146b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                            (RsAllocationMipmapControl) mipmaps,
4156b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                            usages, ptr);
4166b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
4176b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#endif
4186b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
419174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
420174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Object routines
421174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
422174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define IS_CLEAR_SET_OBJ(t) \
423174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    bool rsIsObject(t src) { \
424174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return src.p != nullptr; \
425174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
426174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void __attribute__((overloadable)) rsClearObject(t *dst) { \
427174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        Context *rsc = RsdCpuReference::getTlsContext(); \
428174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsrClearObject(rsc, reinterpret_cast<rs_object_base *>(dst)); \
429174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
430174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void __attribute__((overloadable)) rsSetObject(t *dst, t src) { \
431174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        Context *rsc = RsdCpuReference::getTlsContext(); \
432174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsrSetObject(rsc, reinterpret_cast<rs_object_base *>(dst), (ObjectBase*)src.p); \
433174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
4347153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
435174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_element)
436174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_type)
437174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_allocation)
438174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_sampler)
439174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_script)
440b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams
441174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_mesh)
442174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_fragment)
443174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_vertex)
444174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_raster)
445174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_store)
446174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_font)
4471aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
448174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef IS_CLEAR_SET_OBJ
44974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
45087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
451174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Element routines
45287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
453174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void * ElementAt(Allocation *a, RsDataType dt, uint32_t vecSize,
454174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        uint32_t x, uint32_t y, uint32_t z) {
455709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
456174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Type *t = a->getType();
457174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Element *e = t->getElement();
458a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
459174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char buf[256];
460174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (x && (x >= t->getLODDimX(0))) {
461838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang        snprintf(buf, sizeof(buf), "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
462174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
463174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
464174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
465a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
466174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (y && (y >= t->getLODDimY(0))) {
467838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang        snprintf(buf, sizeof(buf), "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
468174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
469174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
470174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
47187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
472174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (z && (z >= t->getLODDimZ(0))) {
473838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang        snprintf(buf, sizeof(buf), "Out range ElementAt Z %i of %i", z, t->getLODDimZ(0));
474174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
475174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
476174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
47787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
478174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (vecSize > 0) {
479174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (vecSize != e->getVectorSize()) {
480838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang            snprintf(buf, sizeof(buf), "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
481174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
482174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            return nullptr;
483174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        }
48487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
485174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (dt != e->getType()) {
486838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang            snprintf(buf, sizeof(buf), "Data type mismatch for ElementAt %i of %i", dt, e->getType());
487174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
488174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            return nullptr;
489174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        }
490174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
49187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
492174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
493174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t eSize = e->getSizeBytes();
494174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t stride = a->mHal.drvState.lod[0].stride;
495174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t dimY = a->mHal.drvState.lod[0].dimY;
496174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return &p[(x * eSize) + (y * stride) + (z * stride * dimY)];
49787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
49887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
499174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y, uint32_t z) {
500174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Type *t = const_cast<Allocation*>((Allocation*)a.p)->getType();
501174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Element *e = t->getElement();
502174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void *tmp = ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
503174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (tmp != nullptr)
504174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        memcpy(tmp, ptr, e->getSizeBytes());
50587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
50687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
507174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y) {
508174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsSetElementAt(a, ptr, x, y, 0);
50987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
51087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
511174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x) {
512174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsSetElementAt(a, ptr, x, 0, 0);
51387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
51487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
515174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
516174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
51787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
51887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
519174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y) {
520174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsGetElementAt(a, x, y ,0);
52187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
52287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
523174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x) {
524174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsGetElementAt(a, x, 0, 0);
52587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
52687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
527174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define ELEMENT_AT(T, DT, VS) \
528174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z) { \
529174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
530174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (r != nullptr) ((T *)r)[0] = *val; \
531174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
532174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
533174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y) { \
534174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, val, x, y, 0); \
535174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
536174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x) { \
537174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, val, x, 0, 0); \
538174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
539174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z) { \
540174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
541174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (r != nullptr) *val = ((T *)r)[0]; \
542174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
543174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
544174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y) { \
545174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, val, x, y, 0); \
546174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
547174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x) { \
548174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, val, x, 0, 0); \
549174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
55087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
551174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char, RS_TYPE_SIGNED_8, 1)
552174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char2, RS_TYPE_SIGNED_8, 2)
553174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char3, RS_TYPE_SIGNED_8, 3)
554174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char4, RS_TYPE_SIGNED_8, 4)
555174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar, RS_TYPE_UNSIGNED_8, 1)
556174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar2, RS_TYPE_UNSIGNED_8, 2)
557174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar3, RS_TYPE_UNSIGNED_8, 3)
558174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar4, RS_TYPE_UNSIGNED_8, 4)
559174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short, RS_TYPE_SIGNED_16, 1)
560174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short2, RS_TYPE_SIGNED_16, 2)
561174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short3, RS_TYPE_SIGNED_16, 3)
562174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short4, RS_TYPE_SIGNED_16, 4)
563174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort, RS_TYPE_UNSIGNED_16, 1)
564174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort2, RS_TYPE_UNSIGNED_16, 2)
565174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort3, RS_TYPE_UNSIGNED_16, 3)
566174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort4, RS_TYPE_UNSIGNED_16, 4)
567174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int, RS_TYPE_SIGNED_32, 1)
568174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int2, RS_TYPE_SIGNED_32, 2)
569174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int3, RS_TYPE_SIGNED_32, 3)
570174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int4, RS_TYPE_SIGNED_32, 4)
571174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint, RS_TYPE_UNSIGNED_32, 1)
572174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint2, RS_TYPE_UNSIGNED_32, 2)
573174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint3, RS_TYPE_UNSIGNED_32, 3)
574174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint4, RS_TYPE_UNSIGNED_32, 4)
575174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long, RS_TYPE_SIGNED_64, 1)
576174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long2, RS_TYPE_SIGNED_64, 2)
577174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long3, RS_TYPE_SIGNED_64, 3)
578174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long4, RS_TYPE_SIGNED_64, 4)
579174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong, RS_TYPE_UNSIGNED_64, 1)
580174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong2, RS_TYPE_UNSIGNED_64, 2)
581174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong3, RS_TYPE_UNSIGNED_64, 3)
582174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong4, RS_TYPE_UNSIGNED_64, 4)
58363bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half, RS_TYPE_FLOAT_16, 1)
58463bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half2, RS_TYPE_FLOAT_16, 2)
58563bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half3, RS_TYPE_FLOAT_16, 3)
58663bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half4, RS_TYPE_FLOAT_16, 4)
587174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float, RS_TYPE_FLOAT_32, 1)
588174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float2, RS_TYPE_FLOAT_32, 2)
589174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float3, RS_TYPE_FLOAT_32, 3)
590174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float4, RS_TYPE_FLOAT_32, 4)
591174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double, RS_TYPE_FLOAT_64, 1)
592174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double2, RS_TYPE_FLOAT_64, 2)
593174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double3, RS_TYPE_FLOAT_64, 3)
594174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double4, RS_TYPE_FLOAT_64, 4)
59587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
596174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef ELEMENT_AT
59787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
598174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
599174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen/*
600174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * We miss some symbols for rs{Get,Set}Element_long,ulong variants because 64
601174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * bit integer values are 'long' in RS-land but might be 'long long' in the
602174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * driver.  Define native_long* and native_ulong* types to be vectors of
603174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * 'long' as seen by the driver and define overloaded versions of
604174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * rsSetElementAt_* and rsGetElementAt_*.  This should get us the correct
605174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * mangled names in the driver.
606174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen */
60787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
608174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long2 __attribute__((ext_vector_type(2)));
609174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long3 __attribute__((ext_vector_type(3)));
610174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long4 __attribute__((ext_vector_type(4)));
611174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong2 __attribute__((ext_vector_type(2)));
612174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong3 __attribute__((ext_vector_type(3)));
613174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong4 __attribute__((ext_vector_type(4)));
61487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
615174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define ELEMENT_AT_OVERLOADS(T, U) \
616174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y, uint32_t z) { \
617174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, y, z); \
618174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
619174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y) { \
620174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, y, 0); \
621174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
622174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x) { \
623174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, 0, 0); \
624174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
625174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y, uint32_t z) { \
626174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, y, z); \
627174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
628174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y) { \
629174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, y, 0); \
630174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
631174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x) { \
632174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, 0, 0); \
633174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
63487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
635174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long2, native_long2)
636174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long3, native_long3)
637174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long4, native_long4)
638174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong, unsigned long)
639174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong2, native_ulong2)
640174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong3, native_ulong3)
641174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong4, native_ulong4)
642414a46166126da6864258bd25ff183f9a3c6261dStephen Hines
643174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// We also need variants of rs{Get,Set}ElementAt_long that take 'long long *' as
644174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// we might have this overloaded variant in old APKs.
645174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long, long long)
64687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
647174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef ELEMENT_AT_OVERLOADS
648174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
64987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
650174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
651174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// ForEach routines
652174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
653dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Nivoid rsForEachInternal(int slot,
65479b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                       rs_script_call *options,
655dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni                       int hasOutput,
65679b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                       int numInputs,
65779b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                       ::rs_allocation* allocs) {
65812398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni    Context *rsc = RsdCpuReference::getTlsContext();
65912398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni    Script *s = const_cast<Script*>(RsdCpuReference::getTlsScript());
66079b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    if (numInputs > RS_KERNEL_MAX_ARGUMENTS) {
66179b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni        rsc->setError(RS_ERROR_BAD_SCRIPT,
66279b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                      "rsForEachInternal: too many inputs to a kernel.");
663dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        return;
664dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
66579b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    Allocation* inputs[RS_KERNEL_MAX_ARGUMENTS];
66679b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    for (int i = 0; i < numInputs; i++) {
66779b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni        inputs[i] = (Allocation*)allocs[i].p;
668dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
66979b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    Allocation* out = hasOutput ? (Allocation*)allocs[numInputs].p : nullptr;
67079b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    rsrForEach(rsc, s, slot, numInputs, numInputs > 0 ? inputs : nullptr, out,
67179b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni               nullptr, 0, (RsScriptCall*)options);
67212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni}
67312398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni
674174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
675174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
676174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
677174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
678174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const rs_script_call *call) {
679709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
680dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p,
6819479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               (Allocation *)out.p, usr, 0, (RsScriptCall *)call);
68287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
68387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
684174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
685174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
686174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
687174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr) {
688709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
689dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
6909479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, 0, nullptr);
69187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
69287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
693174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
694174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
695174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out) {
696709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
697dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
6989479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               nullptr, 0, nullptr);
69987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
70087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
701174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// These functions are only supported in 32-bit.
702174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
703174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
704174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
705174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
706174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
707174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             uint32_t usrLen) {
708709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
709dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
7109479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, usrLen, nullptr);
71187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
71287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
713174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
714174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
715174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
716174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
717174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             uint32_t usrLen,
718174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const rs_script_call *call) {
719709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
720dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
7219479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, usrLen, (RsScriptCall *)call);
72287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
723174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
72487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
72587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
726174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Message routines
72787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
728174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClient(int cmdID) {
729709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
730174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClient(rsc, cmdID, (const void *)nullptr, 0);
73187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
73287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
733174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClient(int cmdID, const void *data, uint32_t len) {
734709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
735174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClient(rsc, cmdID, data, len);
73687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
73787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
738174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClientBlocking(int cmdID) {
739709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
740174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClientBlocking(rsc, cmdID, (const void *)nullptr, 0);
74187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
74287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
743174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClientBlocking(int cmdID, const void *data, uint32_t len) {
744709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
745174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClientBlocking(rsc, cmdID, data, len);
74687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
74787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
748174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
749174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Time routines
750174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
75187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
752174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// time_t is int in 32-bit RenderScript.  time_t is long in bionic.  rsTime and
753174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// rsLocaltime are set to explicitly take 'const int *' so we generate the
754174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// correct mangled names.
755174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
756174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint rsTime(int *timer) {
757174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
758174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentime_t rsTime(time_t * timer) {
759174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
760709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
761174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrTime(rsc, (time_t *)timer);
76287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
76387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
764174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
765174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenrs_tm* rsLocaltime(rs_tm* local, const int *timer) {
766174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
767174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenrs_tm* rsLocaltime(rs_tm* local, const time_t *timer) {
768174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
769709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
770174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return (rs_tm*)rsrLocalTime(rsc, (tm*)local, (time_t *)timer);
77187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
77287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
773174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint64_t rsUptimeMillis() {
774709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
775174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrUptimeMillis(rsc);
77687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
77787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
778174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint64_t rsUptimeNanos() {
779709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
780174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrUptimeNanos(rsc);
78187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
78287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
783174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenfloat rsGetDt() {
784709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
785174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
786174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetDt(rsc, sc);
78787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
78887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
78987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
790174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Graphics routines
79187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
792174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef RS_COMPATIBILITY_LIB
793174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
794174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x2, float y2, float z2, float u2, float v2,
795174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x3, float y3, float z3, float u3, float v3,
796174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x4, float y4, float z4, float u4, float v4) {
7971aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
798dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
799174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (!rsc->setupCheck()) {
800174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return;
801174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
80287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
803174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
804174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (!dc->gl.shaderCache->setup(rsc)) {
805174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return;
806174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
807444bd208b4f129bd8e4c0cce4cf6d709c8900891Yong Chen
808174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("Quad");
809174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
810174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
811174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
812174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
813127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
814174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
815174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
816127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
817174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdVertexArray::Attrib attribs[2];
818174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    attribs[0].set(GL_FLOAT, 3, 12, false, (size_t)vtx, "ATTRIB_position");
819174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    attribs[1].set(GL_FLOAT, 2, 8, false, (size_t)tex, "ATTRIB_texture0");
820240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray
821174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdVertexArray va(attribs, 2);
822174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    va.setup(rsc);
823240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray
824174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
825240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray}
826174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
827174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawQuad(float x1, float y1, float z1,
828174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x2, float y2, float z2,
829174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x3, float y3, float z3,
830174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x4, float y4, float z4) {
831174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuadTexCoords(x1, y1, z1, 0, 1,
832174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x2, y2, z2, 1, 1,
833174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x3, y3, z3, 1, 0,
834174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x4, y4, z4, 0, 0);
83547211dca5b2fc1aa5680ddebe5c4270c08c06e5dTim Murray}
836174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
837174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) {
83847211dca5b2fc1aa5680ddebe5c4270c08c06e5dTim Murray    Context *rsc = RsdCpuReference::getTlsContext();
83987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
840174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
841174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
842174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //rsc->setupCheck();
843174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
844174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //GLint crop[4] = {0, h, w, -h};
845dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
846174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float sh = rsc->getHeight();
847c500e74d0848b721bf01cf0ab344a6adb035c312Jason Sams
848174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x,   sh - y,     z,
849174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x+w, sh - y,     z,
850174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x+w, sh - (y+h), z,
851174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x,   sh - (y+h), z);
852174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsc->setProgramVertex((ProgramVertex *)tmp.get());
85387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
85487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
855174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsAllocationMarkDirty(::rs_allocation a) {
856447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
857174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
858447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
85987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
860174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a) {
861447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
862174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
863447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
864dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
865174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a,
866174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          unsigned int usage) {
867447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
868174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)usage);
869447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
87087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
87187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
872174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a,
873174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          rs_allocation_usage_type source) {
874709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
875174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)source.val);
87687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
877174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
878174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramFragment(::rs_program_fragment pf) {
879174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
880174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramFragment(rsc, (ProgramFragment *)pf.p);
8810b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
882174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
883174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramStore(::rs_program_store ps) {
884174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
885174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramStore(rsc, (ProgramStore *)ps.p);
8860b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
887174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
888174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramVertex(::rs_program_vertex pv) {
889174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
890174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramVertex(rsc, (ProgramVertex *)pv.p);
8910b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
892174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
893174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramRaster(::rs_program_raster pr) {
894174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
895174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramRaster(rsc, (ProgramRaster *)pr.p);
8960b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
897174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
898174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindSampler(::rs_program_fragment pf,
899174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    uint32_t slot, ::rs_sampler s) {
900174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
901174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindSampler(rsc, (ProgramFragment *)pf.p, slot, (Sampler *)s.p);
9020b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
903174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
904174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindTexture(::rs_program_fragment pf,
905174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    uint32_t slot, ::rs_allocation a) {
906174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
907174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindTexture(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
9080b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
909174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
910174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindConstant(::rs_program_fragment pf,
911174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                     uint32_t slot, ::rs_allocation a) {
912174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
913174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindConstant(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
9140b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
915174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
916174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindConstant(::rs_program_vertex pv,
917174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                     uint32_t slot, ::rs_allocation a) {
918174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
919174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindConstant(rsc, (ProgramVertex *)pv.p, slot, (Allocation *)a.p);
9200b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
921174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
922174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadProjectionMatrix(const rs_matrix4x4 *m) {
923174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
924174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadProjectionMatrix(rsc, (const rsc_Matrix *)m);
9250b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
926174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
927174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadModelMatrix(const rs_matrix4x4 *m) {
928174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
929174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadModelMatrix(rsc, (const rsc_Matrix *)m);
9300b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
931174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
932174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *m) {
933174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
934174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadTextureMatrix(rsc, (const rsc_Matrix *)m);
9350b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
936174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
937174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexGetProjectionMatrix(rs_matrix4x4 *m) {
938174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
939174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpGetProjectionMatrix(rsc, (rsc_Matrix *)m);
9400b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
941174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
942174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramFragmentConstantColor(::rs_program_fragment pf,
943174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                     float r, float g, float b, float a) {
944174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
945174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPfConstantColor(rsc, (ProgramFragment *)pf.p, r, g, b, a);
9460b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
947174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
948174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsgGetWidth(void) {
949174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
950174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetWidth(rsc);
9510b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
952174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
953174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsgGetHeight(void) {
954174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
955174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetHeight(rsc);
9560b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
957174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
958174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawRect(float x1, float y1, float x2, float y2, float z) {
959174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x1, y2, z,
960174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y2, z,
961174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y1, z,
962174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x1, y1, z);
9630b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
964174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
965174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawQuad(float x1, float y1, float z1,
966174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x2, float y2, float z2,
967174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x3, float y3, float z3,
968174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x4, float y4, float z4) {
969174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x1, y1, z1,
970174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y2, z2,
971174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x3, y3, z3,
972174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x4, y4, z4);
9730b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
974174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
975174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
976174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x2, float y2, float z2, float u2, float v2,
977174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x3, float y3, float z3, float u3, float v3,
978174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x4, float y4, float z4, float u4, float v4) {
979174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuadTexCoords(x1, y1, z1, u1, v1,
980174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x2, y2, z2, u2, v2,
981174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x3, y3, z3, u3, v3,
982174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x4, y4, z4, u4, v4);
9830b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
984174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
985174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawSpriteScreenspace(float x, float y, float z, float w, float h) {
986174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawSpriteScreenspace(x, y, z, w, h);
9870b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
988174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
989174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism) {
990174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
991174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMesh(rsc, (Mesh *)ism.p);
9920b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
993174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
994174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism, uint primitiveIndex) {
995174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
996174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMeshPrimitive(rsc, (Mesh *)ism.p, primitiveIndex);
9970b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
998174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
999174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism, uint primitiveIndex, uint start, uint len) {
1000174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1001174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMeshPrimitiveRange(rsc, (Mesh *)ism.p, primitiveIndex, start, len);
10020b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1003174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1004174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid  rsgMeshComputeBoundingBox(::rs_mesh mesh,
1005174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                float *minX, float *minY, float *minZ,
1006174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                float *maxX, float *maxY, float *maxZ) {
1007174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1008174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeshComputeBoundingBox(rsc, (Mesh *)mesh.p, minX, minY, minZ, maxX, maxY, maxZ);
10090b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1010174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1011174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearColor(float r, float g, float b, float a) {
1012174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1013174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPrepareClear(rsc);
1014174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLClearColor(rsc, r, g, b, a);
10150b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1016174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1017174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearDepth(float value) {
1018174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1019174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPrepareClear(rsc);
1020174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLClearDepth(rsc, value);
10210b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1022174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1023174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawText(const char *text, int x, int y) {
1024174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1025174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawText(rsc, text, x, y);
10260b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1027127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1028174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawText(::rs_allocation a, int x, int y) {
1029174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1030174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawTextAlloc(rsc, (Allocation *)a.p, x, y);
1031127d51c1193f4055795da967d47a13bedd3cb951Miao Wang}
1032127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1033174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgMeasureText(const char *text, int *left, int *right,
1034174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    int *top, int *bottom) {
1035174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1036174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeasureText(rsc, text, left, right, top, bottom);
1037127d51c1193f4055795da967d47a13bedd3cb951Miao Wang}
1038127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1039174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgMeasureText(::rs_allocation a, int *left, int *right,
1040174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    int *top, int *bottom) {
1041174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1042174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeasureTextAlloc(rsc, (Allocation *)a.p, left, right, top, bottom);
1043dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar}
1044dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
1045174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindFont(::rs_font font) {
1046174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1047174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFont(rsc, (Font *)font.p);
10480b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1049174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1050174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgFontColor(float r, float g, float b, float a) {
1051174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1052174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrFontColor(rsc, r, g, b, a);
10530b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1054174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1055174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindColorTarget(::rs_allocation a, uint slot) {
1056174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1057174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFrameBufferObjectColorTarget(rsc, (Allocation *)a.p, slot);
10580b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1059174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1060174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindDepthTarget(::rs_allocation a) {
1061174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1062174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFrameBufferObjectDepthTarget(rsc, (Allocation *)a.p);
10630b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1064174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1065174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearColorTarget(uint slot) {
1066174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1067174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectColorTarget(rsc, slot);
10680b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1069174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1070174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearDepthTarget(void) {
1071174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1072174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectDepthTarget(rsc);
10730b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1074174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1075174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearAllRenderTargets(void) {
1076174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1077174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectTargets(rsc);
10780b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1079127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1080174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid color(float r, float g, float b, float a) {
1081174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1082174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrColor(rsc, r, g, b, a);
10830b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10840b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1085174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgFinish(void) {
1086174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1087174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLFinish(rsc);
1088174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1089174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
10900b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1091174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
1092174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Debug routines
1093174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
10940b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f) {
1095174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
10960b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10970b575de8ed0b628d84d256f5846500b0385979bdTim Murray
10980b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2) {
1099174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, f1, f2);
11000b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11010b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11020b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2, float f3) {
1103174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, f1, f2, f3);
11040b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11050b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11060b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2, float f3, float f4) {
1107174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
11080b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11090b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1110174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float2 *f2) {
1111174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float2 f = *f2;
1112174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, f.x, f.y);
11130b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11140b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1115174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float3 *f3) {
1116174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float3 f = *f3;
1117174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, f.x, f.y, f.z);
11180b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11190b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1120174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float4 *f4) {
1121174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float4 f = *f4;
1122174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, f.x, f.y, f.z, f.w);
11230b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11240b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11250b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, double d) {
1126174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
11270b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11280b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1129174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double2 *d2) {
1130174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double2 d = *d2;
1131174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, d.x, d.y);
11326ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11336ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1134174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double3 *d3) {
1135174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double3 d = *d3;
1136174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, d.x, d.y, d.z);
11376ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11386ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1139174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double4 *d4) {
1140174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double4 d = *d4;
1141174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, d.x, d.y, d.z, d.w);
11426ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11436ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1144b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix4x4 *m) {
1145174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1146174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
1147174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
1148174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
1149174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
11500b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11510b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1152b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix3x3 *m) {
1153174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1154174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
1155174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
1156174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
11570b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11580b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1159b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix2x2 *m) {
1160174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1161174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f", s, f[0], f[2]);
1162174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f}",s, f[1], f[3]);
11630b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11640b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11650b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, char c) {
1166174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hhd  0x%hhx", s, c, (unsigned char)c);
11670b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11680b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1169174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char2 *c2) {
1170174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char2 c = *c2;
1171174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hhd, %hhd}  0x%hhx 0x%hhx", s, c.x, c.y, (unsigned char)c.x, (unsigned char)c.y);
11720b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11730b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1174174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char3 *c3) {
1175174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char3 c = *c3;
1176174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    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);
11770b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11780b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1179174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char4 *c4) {
1180174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char4 c = *c4;
1181174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    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);
11820b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11830b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11840b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, unsigned char c) {
1185174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hhu  0x%hhx", s, c, c);
11860b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11870b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1188174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar2 *c2) {
1189174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar2 c = *c2;
1190174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hhu, %hhu}  0x%hhx 0x%hhx", s, c.x, c.y, c.x, c.y);
11910b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11920b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1193174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar3 *c3) {
1194174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar3 c = *c3;
1195174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hhu, %hhu, %hhu}  0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, c.x, c.y, c.z);
11960b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11970b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1198174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar4 *c4) {
1199174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar4 c = *c4;
1200174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    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);
12010b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12020b575de8ed0b628d84d256f5846500b0385979bdTim Murray
12030b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, short c) {
1204174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hd  0x%hx", s, c, c);
12050b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12060b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1207174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short2 *c2) {
1208174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short2 c = *c2;
1209174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hd, %hd}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
12100b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12110b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1212174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short3 *c3) {
1213174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short3 c = *c3;
1214174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hd, %hd, %hd}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z);
12150b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12160b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1217174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short4 *c4) {
1218174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short4 c = *c4;
1219174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    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);
12200b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12210b575de8ed0b628d84d256f5846500b0385979bdTim Murray
12220b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, unsigned short c) {
1223174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hu  0x%hx", s, c, c);
1224174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1225174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1226174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort2 *c2) {
1227174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort2 c = *c2;
1228174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hu, %hu}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
12290b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12300b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1231174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort3 *c3) {
1232174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort3 c = *c3;
1233174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hu, %hu, %hu}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z);
1234174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1235174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1236174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort4 *c4) {
1237174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort4 c = *c4;
1238174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    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);
12390b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12400b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1241174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, int i) {
1242174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %d  0x%x", s, i, i);
12430b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12440b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1245174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int2 *i2) {
1246174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int2 i = *i2;
1247174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%d, %d}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
12480b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12490b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1250174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int3 *i3) {
1251174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int3 i = *i3;
1252174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%d, %d, %d}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
12530b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12540b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1255174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int4 *i4) {
1256174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int4 i = *i4;
1257174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    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);
12580b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12590b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1260174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned int i) {
1261174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %u  0x%x", s, i, i);
12620b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12630b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1264174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint2 *i2) {
1265174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint2 i = *i2;
1266174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%u, %u}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
12670b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12680b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1269174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint3 *i3) {
1270174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint3 i = *i3;
1271174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%u, %u, %u}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
12720b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12730b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1274174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint4 *i4) {
1275174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint4 i = *i4;
1276174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    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);
12770b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12780b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1279174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentemplate <typename T>
1280174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic inline long long LL(const T &x) {
1281174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return static_cast<long long>(x);
12820b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12830b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1284174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentemplate <typename T>
1285174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic inline unsigned long long LLu(const T &x) {
1286174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return static_cast<unsigned long long>(x);
12870b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12880b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1289174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, long l) {
1290174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %lld  0x%llx", s, LL(l), LL(l));
12910b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12920b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1293174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, long long ll) {
1294174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %lld  0x%llx", s, LL(ll), LL(ll));
12950b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12960b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1297b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long2 *c) {
1298174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long2 ll = *c;
1299174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
13000b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13010b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1302b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long3 *c) {
1303174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long3 ll = *c;
1304174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld, %lld}  0x%llx 0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.x), LL(ll.y), LL(ll.z));
13050b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13060b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1307b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long4 *c) {
1308174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long4 ll = *c;
1309174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld, %lld, %lld}  0x%llx 0x%llx 0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.w), LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.w));
13100b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13110b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1312174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned long l) {
1313174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    unsigned long long ll = l;
1314174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %llu  0x%llx", s, ll, ll);
13150b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13160b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1317174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned long long ll) {
1318174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %llu  0x%llx", s, ll, ll);
13190b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13200b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1321b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong2 *c) {
1322174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong2 ll = *c;
1323174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
13240b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13250b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1326b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong3 *c) {
1327174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong3 ll = *c;
1328174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu, %llu}  0x%llx 0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.x), LLu(ll.y), LLu(ll.z));
13290b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13300b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1331b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong4 *c) {
1332174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong4 ll = *c;
1333174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu, %llu, %llu}  0x%llx 0x%llx 0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.w), LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.w));
13340b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13350b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1336a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// FIXME: We need to export these function signatures for the compatibility
1337a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// library. The C++ name mangling that LLVM uses for ext_vector_type requires
1338a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// different versions for "long" vs. "long long". Note that the called
1339a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// functions are still using the appropriate 64-bit sizes.
1340127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1341127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#ifndef __LP64__
1342a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l2 __attribute__((ext_vector_type(2)));
1343a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l3 __attribute__((ext_vector_type(3)));
1344a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l4 __attribute__((ext_vector_type(4)));
1345a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul2 __attribute__((ext_vector_type(2)));
1346a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul3 __attribute__((ext_vector_type(3)));
1347a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul4 __attribute__((ext_vector_type(4)));
1348a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1349a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l2 *c) {
1350174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long2 ll = *(const long2 *)c;
1351174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
1352a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1353a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1354a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l3 *c) {
1355174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long3 ll = *(const long3 *)c;
1356174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld, %lld}  0x%llx 0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.x), LL(ll.y), LL(ll.z));
1357a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1358a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1359a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l4 *c) {
1360174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long4 ll = *(const long4 *)c;
1361174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld, %lld, %lld}  0x%llx 0x%llx 0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.w), LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.w));
1362a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1363a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1364a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul2 *c) {
1365174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong2 ll = *(const ulong2 *)c;
1366174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
1367a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1368a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1369a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul3 *c) {
1370174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong3 ll = *(const ulong3 *)c;
1371174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu, %llu}  0x%llx 0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.x), LLu(ll.y), LLu(ll.z));
1372a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1373a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1374a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul4 *c) {
1375174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong4 ll = *(const ulong4 *)c;
1376174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu, %llu, %llu}  0x%llx 0x%llx 0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.w), LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.w));
1377a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1378127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#endif
1379a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1380174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long2 ll) {
1381174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
13829f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13839f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1384174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long3 ll) {
1385174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld, %lld}  0x%llx 0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.x), LL(ll.y), LL(ll.z));
13869f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13879f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1388174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long4 ll) {
1389174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld, %lld, %lld}  0x%llx 0x%llx 0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.w), LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.w));
13909f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13919f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1392174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong2 ll) {
1393174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
13949f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13959f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1396174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong3 ll) {
1397174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu, %llu}  0x%llx 0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.x), LLu(ll.y), LLu(ll.z));
13989f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13999f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1400174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong4 ll) {
1401174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu, %llu, %llu}  0x%llx 0x%llx 0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.w), LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.w));
14029f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
14039f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
14040b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, const void *p) {
1405174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %p", s, p);
14060b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
140787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
1408709a0978ae141198018ca9769f8d96292a8928e6Jason Samsextern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name) {
1409174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// TODO: remove
141044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    return nullptr;
141187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
1412