rsdRuntimeStubs.cpp revision dda5cb5b59ae02ec03001ea12c374413714f3d38
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"
1887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsScriptC.h"
1987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix4x4.h"
2087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix3x3.h"
2187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix2x2.h"
2287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsRuntime.h"
2387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
2487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsdCore.h"
25807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams#include "rsdBcc.h"
2687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
27b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams#include "rsdAllocation.h"
28414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#include "rsdShaderCache.h"
29414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#include "rsdVertexArray.h"
3087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
3187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include <time.h>
3287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
3387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsusing namespace android;
3487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsusing namespace android::renderscript;
3587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
36a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float2 __attribute__((ext_vector_type(2)));
37a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float3 __attribute__((ext_vector_type(3)));
38a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float4 __attribute__((ext_vector_type(4)));
395261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double2 __attribute__((ext_vector_type(2)));
405261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double3 __attribute__((ext_vector_type(3)));
415261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double4 __attribute__((ext_vector_type(4)));
42a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char2 __attribute__((ext_vector_type(2)));
43a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char3 __attribute__((ext_vector_type(3)));
44a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char4 __attribute__((ext_vector_type(4)));
45a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar2 __attribute__((ext_vector_type(2)));
46a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar3 __attribute__((ext_vector_type(3)));
47a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar4 __attribute__((ext_vector_type(4)));
48d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short2 __attribute__((ext_vector_type(2)));
49d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short3 __attribute__((ext_vector_type(3)));
50d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short4 __attribute__((ext_vector_type(4)));
51d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort2 __attribute__((ext_vector_type(2)));
52d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort3 __attribute__((ext_vector_type(3)));
53d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort4 __attribute__((ext_vector_type(4)));
54a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int2 __attribute__((ext_vector_type(2)));
55a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int3 __attribute__((ext_vector_type(3)));
56a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int4 __attribute__((ext_vector_type(4)));
57a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint2 __attribute__((ext_vector_type(2)));
58a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint3 __attribute__((ext_vector_type(3)));
59a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint4 __attribute__((ext_vector_type(4)));
60d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long2 __attribute__((ext_vector_type(2)));
61d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long3 __attribute__((ext_vector_type(3)));
62d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long4 __attribute__((ext_vector_type(4)));
63d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong2 __attribute__((ext_vector_type(2)));
64d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong3 __attribute__((ext_vector_type(3)));
65d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong4 __attribute__((ext_vector_type(4)));
6687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
675261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint8_t uchar;
685261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint16_t ushort;
695261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint32_t uint;
700b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER
715261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint64_t ulong;
720b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif
7387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
74127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#ifndef __LP64__
75d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#define OPAQUETYPE(t) \
76d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    typedef struct { const int* const p; } __attribute__((packed, aligned(4))) t;
77127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#else
78127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#define OPAQUETYPE(t) \
79127d51c1193f4055795da967d47a13bedd3cb951Miao Wang    typedef struct { const void* p; const void* r; const void* v1; const void* v2; } t;
80127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#endif
81d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
82d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_element)
83d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_type)
84d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_allocation)
85d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_sampler)
86d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_script)
87d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_script_call)
882544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga Nainar
892544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_fragment);
902544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_store);
912544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_vertex);
922544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_raster);
932544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_mesh);
942544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_font);
952544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga Nainar
96d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#undef OPAQUETYPE
97d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
987a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hinestypedef enum {
997a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines    // Empty to avoid conflicting definitions with RsAllocationCubemapFace
1007a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines} rs_allocation_cubemap_face;
1017a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines
102174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef struct { unsigned int val; } rs_allocation_usage_type;
103174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
104d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murraytypedef struct {
105d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_sec;     ///< seconds
106d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_min;     ///< minutes
107d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_hour;    ///< hours
108d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_mday;    ///< day of the month
109d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_mon;     ///< month
110d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_year;    ///< year
111d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_wday;    ///< day of the week
112d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_yday;    ///< day of the year
113d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_isdst;   ///< daylight savings time
114d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray} rs_tm;
115d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
1167153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// Some RS functions are not threadsafe but can be called from an invoke
1177153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// function.  Instead of summarily marking scripts that call these functions as
1187153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// not-threadable we detect calls to them in the driver and sends a fatal error
1197153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// message.
1207153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainarstatic bool failIfInKernel(Context *rsc, const char *funcName) {
1217153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
1227153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    RsdCpuReference *impl = (RsdCpuReference *) dc->mCpuRef;
1237153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
1247153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (impl->getInForEach()) {
1257153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        char buf[256];
1267153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        sprintf(buf, "Error: Call to unsupported function %s "
1277153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar                         "in kernel", funcName);
1287153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        rsc->setError(RS_ERROR_FATAL_DRIVER, buf);
1297153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return true;
1307153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    }
1317153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    return false;
1327153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar}
1337153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
13487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
135174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Allocation routines
13687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
13766d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic#if defined(__i386__) || (defined(__mips__) && __mips==32)
13866d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic// i386 and MIPS32 have different struct return passing to ARM; emulate with a pointer
139174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst Allocation * rsGetAllocation(const void *ptr) {
140709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
141174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
142174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
143174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0};
144174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    alloc->callUpdateCacheObject(rsc, &obj);
145174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return (Allocation *)obj.p;
14674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk}
147174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
148174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst android::renderscript::rs_allocation rsGetAllocation(const void *ptr) {
149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
150174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
151174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
1527153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
15366d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic#ifndef __LP64__ // ARMv7
154174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0};
155174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else // AArch64/x86_64/MIPS64
156174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0, 0, 0, 0};
157174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
158174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    alloc->callUpdateCacheObject(rsc, &obj);
159174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return obj;
16074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk}
161174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
16274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
163174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationIoSend(::rs_allocation a) {
1641aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1657153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationIoSend"))
1667153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
167174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationIoSend(rsc, (Allocation *)a.p);
1681aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
1691aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
170174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationIoReceive(::rs_allocation a) {
1711aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1727153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationIoReceive"))
1737153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
174174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationIoReceive(rsc, (Allocation *)a.p);
1751aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
1761aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
177174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationCopy1DRange(
178174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation dstAlloc,
179174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstOff, uint32_t dstMip, uint32_t count,
180174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation srcAlloc,
181174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcOff, uint32_t srcMip) {
1821aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1837153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationCopy1DRange"))
1847153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
185174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationCopy1DRange(rsc, (Allocation *)dstAlloc.p, dstOff, dstMip,
186174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                             count, (Allocation *)srcAlloc.p, srcOff, srcMip);
1871aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
1881aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
189174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationCopy2DRange(
190174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation dstAlloc,
191174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstXoff, uint32_t dstYoff,
192174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstMip, rs_allocation_cubemap_face dstFace,
193174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t width, uint32_t height,
194174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation srcAlloc,
195174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcXoff, uint32_t srcYoff,
196174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcMip, rs_allocation_cubemap_face srcFace) {
1971aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1987153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationCopy2DRange"))
1997153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
200174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationCopy2DRange(rsc, (Allocation *)dstAlloc.p,
2011aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray                             dstXoff, dstYoff, dstMip, dstFace,
202174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                             width, height, (Allocation *)srcAlloc.p,
2031aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray                             srcXoff, srcYoff, srcMip, srcFace);
2041aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
2051aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
206174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
207174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Object routines
208174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
209174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define IS_CLEAR_SET_OBJ(t) \
210174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    bool rsIsObject(t src) { \
211174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return src.p != nullptr; \
212174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
213174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void __attribute__((overloadable)) rsClearObject(t *dst) { \
214174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        Context *rsc = RsdCpuReference::getTlsContext(); \
215174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsrClearObject(rsc, reinterpret_cast<rs_object_base *>(dst)); \
216174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
217174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void __attribute__((overloadable)) rsSetObject(t *dst, t src) { \
218174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        Context *rsc = RsdCpuReference::getTlsContext(); \
219174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsrSetObject(rsc, reinterpret_cast<rs_object_base *>(dst), (ObjectBase*)src.p); \
220174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
2217153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
222174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_element)
223174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_type)
224174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_allocation)
225174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_sampler)
226174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_script)
227b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams
228174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_mesh)
229174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_fragment)
230174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_vertex)
231174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_raster)
232174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_store)
233174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_font)
2341aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
235174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef IS_CLEAR_SET_OBJ
23674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
23787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
238174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Element routines
23987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
240174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void * ElementAt(Allocation *a, RsDataType dt, uint32_t vecSize,
241174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        uint32_t x, uint32_t y, uint32_t z) {
242709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
243174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Type *t = a->getType();
244174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Element *e = t->getElement();
245a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
246174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char buf[256];
247174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (x && (x >= t->getLODDimX(0))) {
248174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
249174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
250174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
251174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
252a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
253174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (y && (y >= t->getLODDimY(0))) {
254174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        sprintf(buf, "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
255174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
256174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
257174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
25887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
259174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (z && (z >= t->getLODDimZ(0))) {
260174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        sprintf(buf, "Out range ElementAt Z %i of %i", z, t->getLODDimZ(0));
261174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
262174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
263174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
26487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
265174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (vecSize > 0) {
266174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (vecSize != e->getVectorSize()) {
267174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
268174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
269174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            return nullptr;
270174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        }
27187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
272174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (dt != e->getType()) {
273174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
274174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
275174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            return nullptr;
276174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        }
277174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
27887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
279174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
280174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t eSize = e->getSizeBytes();
281174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t stride = a->mHal.drvState.lod[0].stride;
282174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t dimY = a->mHal.drvState.lod[0].dimY;
283174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return &p[(x * eSize) + (y * stride) + (z * stride * dimY)];
28487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
28587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
286174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y, uint32_t z) {
287174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Type *t = const_cast<Allocation*>((Allocation*)a.p)->getType();
288174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Element *e = t->getElement();
289174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void *tmp = ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
290174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (tmp != nullptr)
291174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        memcpy(tmp, ptr, e->getSizeBytes());
29287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
29387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
294174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y) {
295174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsSetElementAt(a, ptr, x, y, 0);
29687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
29787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
298174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x) {
299174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsSetElementAt(a, ptr, x, 0, 0);
30087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
30187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
302174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
303174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
30487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
30587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
306174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y) {
307174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsGetElementAt(a, x, y ,0);
30887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
30987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
310174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x) {
311174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsGetElementAt(a, x, 0, 0);
31287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
31387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
314174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define ELEMENT_AT(T, DT, VS) \
315174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z) { \
316174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
317174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (r != nullptr) ((T *)r)[0] = *val; \
318174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
319174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
320174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y) { \
321174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, val, x, y, 0); \
322174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
323174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x) { \
324174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, val, x, 0, 0); \
325174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
326174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z) { \
327174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
328174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (r != nullptr) *val = ((T *)r)[0]; \
329174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
330174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
331174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y) { \
332174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, val, x, y, 0); \
333174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
334174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x) { \
335174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, val, x, 0, 0); \
336174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
33787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
338174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char, RS_TYPE_SIGNED_8, 1)
339174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char2, RS_TYPE_SIGNED_8, 2)
340174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char3, RS_TYPE_SIGNED_8, 3)
341174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char4, RS_TYPE_SIGNED_8, 4)
342174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar, RS_TYPE_UNSIGNED_8, 1)
343174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar2, RS_TYPE_UNSIGNED_8, 2)
344174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar3, RS_TYPE_UNSIGNED_8, 3)
345174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar4, RS_TYPE_UNSIGNED_8, 4)
346174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short, RS_TYPE_SIGNED_16, 1)
347174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short2, RS_TYPE_SIGNED_16, 2)
348174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short3, RS_TYPE_SIGNED_16, 3)
349174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short4, RS_TYPE_SIGNED_16, 4)
350174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort, RS_TYPE_UNSIGNED_16, 1)
351174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort2, RS_TYPE_UNSIGNED_16, 2)
352174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort3, RS_TYPE_UNSIGNED_16, 3)
353174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort4, RS_TYPE_UNSIGNED_16, 4)
354174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int, RS_TYPE_SIGNED_32, 1)
355174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int2, RS_TYPE_SIGNED_32, 2)
356174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int3, RS_TYPE_SIGNED_32, 3)
357174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int4, RS_TYPE_SIGNED_32, 4)
358174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint, RS_TYPE_UNSIGNED_32, 1)
359174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint2, RS_TYPE_UNSIGNED_32, 2)
360174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint3, RS_TYPE_UNSIGNED_32, 3)
361174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint4, RS_TYPE_UNSIGNED_32, 4)
362174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long, RS_TYPE_SIGNED_64, 1)
363174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long2, RS_TYPE_SIGNED_64, 2)
364174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long3, RS_TYPE_SIGNED_64, 3)
365174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long4, RS_TYPE_SIGNED_64, 4)
366174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong, RS_TYPE_UNSIGNED_64, 1)
367174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong2, RS_TYPE_UNSIGNED_64, 2)
368174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong3, RS_TYPE_UNSIGNED_64, 3)
369174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong4, RS_TYPE_UNSIGNED_64, 4)
370174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float, RS_TYPE_FLOAT_32, 1)
371174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float2, RS_TYPE_FLOAT_32, 2)
372174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float3, RS_TYPE_FLOAT_32, 3)
373174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float4, RS_TYPE_FLOAT_32, 4)
374174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double, RS_TYPE_FLOAT_64, 1)
375174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double2, RS_TYPE_FLOAT_64, 2)
376174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double3, RS_TYPE_FLOAT_64, 3)
377174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double4, RS_TYPE_FLOAT_64, 4)
37887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
379174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef ELEMENT_AT
38087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
381174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
382174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen/*
383174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * We miss some symbols for rs{Get,Set}Element_long,ulong variants because 64
384174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * bit integer values are 'long' in RS-land but might be 'long long' in the
385174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * driver.  Define native_long* and native_ulong* types to be vectors of
386174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * 'long' as seen by the driver and define overloaded versions of
387174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * rsSetElementAt_* and rsGetElementAt_*.  This should get us the correct
388174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * mangled names in the driver.
389174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen */
39087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
391174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long2 __attribute__((ext_vector_type(2)));
392174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long3 __attribute__((ext_vector_type(3)));
393174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long4 __attribute__((ext_vector_type(4)));
394174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong2 __attribute__((ext_vector_type(2)));
395174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong3 __attribute__((ext_vector_type(3)));
396174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong4 __attribute__((ext_vector_type(4)));
39787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
398174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define ELEMENT_AT_OVERLOADS(T, U) \
399174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y, uint32_t z) { \
400174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, y, z); \
401174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
402174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y) { \
403174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, y, 0); \
404174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
405174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x) { \
406174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, 0, 0); \
407174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
408174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y, uint32_t z) { \
409174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, y, z); \
410174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
411174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y) { \
412174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, y, 0); \
413174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
414174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x) { \
415174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, 0, 0); \
416174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
41787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
418174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long2, native_long2)
419174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long3, native_long3)
420174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long4, native_long4)
421174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong, unsigned long)
422174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong2, native_ulong2)
423174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong3, native_ulong3)
424174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong4, native_ulong4)
425414a46166126da6864258bd25ff183f9a3c6261dStephen Hines
426174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// We also need variants of rs{Get,Set}ElementAt_long that take 'long long *' as
427174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// we might have this overloaded variant in old APKs.
428174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long, long long)
42987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
430174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef ELEMENT_AT_OVERLOADS
431174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
43287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
433174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
434174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// ForEach routines
435174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
436dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Nivoid rsForEachInternal(int slot,
437dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni                       rs_script_call *call,
438dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni                       int hasOutput,
439dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni                       int numIn,
440dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni                       ...) {
44112398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni    Context *rsc = RsdCpuReference::getTlsContext();
44212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni    Script *s = const_cast<Script*>(RsdCpuReference::getTlsScript());
443dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    std::unique_ptr<Allocation*> inputs(numIn > 0 ? new Allocation*[numIn] : nullptr);
444dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    if (numIn > 0 && inputs == nullptr) {
445dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        ALOGE("rsForEachInternal: out of memory for %u inputs.", numIn);
446dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        return;
447dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
448dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    Allocation* out = nullptr;
449dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    va_list argp;
450dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    va_start(argp, numIn);
451dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    for (int i = 0; i < numIn; i++) {
452dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        ::rs_allocation alloc = va_arg(argp, ::rs_allocation);
453dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        inputs.get()[i] = reinterpret_cast<Allocation*>(const_cast<int*>(alloc.p));
454dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
455dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    if (hasOutput) {
456dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        ::rs_allocation outAlloc = va_arg(argp, ::rs_allocation);
457dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        out = reinterpret_cast<Allocation*>(const_cast<int*>(outAlloc.p));
458dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
459dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    va_end(argp);
460dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, s, slot, numIn, inputs.get(), out, nullptr, 0, (RsScriptCall*)call);
46112398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni}
46212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni
463174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
464174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
465174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
466174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
467174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const rs_script_call *call) {
468709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
469dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p,
4709479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               (Allocation *)out.p, usr, 0, (RsScriptCall *)call);
47187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
47287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
473174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
474174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
475174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
476174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr) {
477709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
478dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
4799479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, 0, nullptr);
48087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
48187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
482174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
483174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
484174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out) {
485709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
486dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
4879479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               nullptr, 0, nullptr);
48887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
48987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
490174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// These functions are only supported in 32-bit.
491174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
492174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
493174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
494174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
495174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
496174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             uint32_t usrLen) {
497709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
498dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
4999479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, usrLen, nullptr);
50087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
50187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
502174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
503174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
504174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
505174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
506174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             uint32_t usrLen,
507174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const rs_script_call *call) {
508709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
509dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
5109479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, usrLen, (RsScriptCall *)call);
51187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
512174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
51387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
51487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
515174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Message routines
51687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
517174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClient(int cmdID) {
518709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
519174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClient(rsc, cmdID, (const void *)nullptr, 0);
52087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
52187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
522174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClient(int cmdID, const void *data, uint32_t len) {
523709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
524174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClient(rsc, cmdID, data, len);
52587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
52687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
527174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClientBlocking(int cmdID) {
528709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
529174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClientBlocking(rsc, cmdID, (const void *)nullptr, 0);
53087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
53187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
532174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClientBlocking(int cmdID, const void *data, uint32_t len) {
533709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
534174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClientBlocking(rsc, cmdID, data, len);
53587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
53687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
537174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
538174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Time routines
539174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
54087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
541174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// time_t is int in 32-bit RenderScript.  time_t is long in bionic.  rsTime and
542174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// rsLocaltime are set to explicitly take 'const int *' so we generate the
543174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// correct mangled names.
544174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
545174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint rsTime(int *timer) {
546174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
547174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentime_t rsTime(time_t * timer) {
548174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
549709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
550174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrTime(rsc, (time_t *)timer);
55187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
55287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
553174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
554174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenrs_tm* rsLocaltime(rs_tm* local, const int *timer) {
555174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
556174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenrs_tm* rsLocaltime(rs_tm* local, const time_t *timer) {
557174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
558709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
559174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return (rs_tm*)rsrLocalTime(rsc, (tm*)local, (time_t *)timer);
56087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
56187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
562174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint64_t rsUptimeMillis() {
563709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
564174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrUptimeMillis(rsc);
56587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
56687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
567174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint64_t rsUptimeNanos() {
568709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
569174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrUptimeNanos(rsc);
57087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
57187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
572174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenfloat rsGetDt() {
573709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
574174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
575174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetDt(rsc, sc);
57687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
57787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
57887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
579174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Graphics routines
58087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
581174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef RS_COMPATIBILITY_LIB
582174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
583174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x2, float y2, float z2, float u2, float v2,
584174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x3, float y3, float z3, float u3, float v3,
585174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x4, float y4, float z4, float u4, float v4) {
5861aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
587dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
588174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (!rsc->setupCheck()) {
589174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return;
590174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
59187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
592174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
593174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (!dc->gl.shaderCache->setup(rsc)) {
594174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return;
595174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
596444bd208b4f129bd8e4c0cce4cf6d709c8900891Yong Chen
597174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("Quad");
598174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
599174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
600174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
601174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
602127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
603174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
604174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
605127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
606174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdVertexArray::Attrib attribs[2];
607174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    attribs[0].set(GL_FLOAT, 3, 12, false, (size_t)vtx, "ATTRIB_position");
608174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    attribs[1].set(GL_FLOAT, 2, 8, false, (size_t)tex, "ATTRIB_texture0");
609240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray
610174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdVertexArray va(attribs, 2);
611174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    va.setup(rsc);
612240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray
613174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
614240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray}
615174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
616174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawQuad(float x1, float y1, float z1,
617174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x2, float y2, float z2,
618174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x3, float y3, float z3,
619174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x4, float y4, float z4) {
620174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuadTexCoords(x1, y1, z1, 0, 1,
621174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x2, y2, z2, 1, 1,
622174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x3, y3, z3, 1, 0,
623174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x4, y4, z4, 0, 0);
62447211dca5b2fc1aa5680ddebe5c4270c08c06e5dTim Murray}
625174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
626174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) {
62747211dca5b2fc1aa5680ddebe5c4270c08c06e5dTim Murray    Context *rsc = RsdCpuReference::getTlsContext();
62887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
629174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
630174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
631174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //rsc->setupCheck();
632174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
633174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //GLint crop[4] = {0, h, w, -h};
634dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
635174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float sh = rsc->getHeight();
636c500e74d0848b721bf01cf0ab344a6adb035c312Jason Sams
637174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x,   sh - y,     z,
638174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x+w, sh - y,     z,
639174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x+w, sh - (y+h), z,
640174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x,   sh - (y+h), z);
641174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsc->setProgramVertex((ProgramVertex *)tmp.get());
64287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
64387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
644174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsAllocationMarkDirty(::rs_allocation a) {
645447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
646174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
647447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
64887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
649174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a) {
650447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
651174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
652447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
653dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
654174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a,
655174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          unsigned int usage) {
656447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
657174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)usage);
658447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
65987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
66087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
661174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a,
662174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          rs_allocation_usage_type source) {
663709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
664174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)source.val);
66587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
666174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
667174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramFragment(::rs_program_fragment pf) {
668174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
669174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramFragment(rsc, (ProgramFragment *)pf.p);
6700b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
671174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
672174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramStore(::rs_program_store ps) {
673174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
674174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramStore(rsc, (ProgramStore *)ps.p);
6750b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
676174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
677174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramVertex(::rs_program_vertex pv) {
678174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
679174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramVertex(rsc, (ProgramVertex *)pv.p);
6800b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
681174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
682174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramRaster(::rs_program_raster pr) {
683174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
684174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramRaster(rsc, (ProgramRaster *)pr.p);
6850b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
686174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
687174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindSampler(::rs_program_fragment pf,
688174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    uint32_t slot, ::rs_sampler s) {
689174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
690174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindSampler(rsc, (ProgramFragment *)pf.p, slot, (Sampler *)s.p);
6910b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
692174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
693174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindTexture(::rs_program_fragment pf,
694174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    uint32_t slot, ::rs_allocation a) {
695174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
696174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindTexture(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
6970b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
698174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
699174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindConstant(::rs_program_fragment pf,
700174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                     uint32_t slot, ::rs_allocation a) {
701174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
702174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindConstant(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
7030b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
704174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
705174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindConstant(::rs_program_vertex pv,
706174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                     uint32_t slot, ::rs_allocation a) {
707174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
708174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindConstant(rsc, (ProgramVertex *)pv.p, slot, (Allocation *)a.p);
7090b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
710174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
711174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadProjectionMatrix(const rs_matrix4x4 *m) {
712174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
713174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadProjectionMatrix(rsc, (const rsc_Matrix *)m);
7140b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
715174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
716174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadModelMatrix(const rs_matrix4x4 *m) {
717174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
718174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadModelMatrix(rsc, (const rsc_Matrix *)m);
7190b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
720174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
721174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *m) {
722174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
723174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadTextureMatrix(rsc, (const rsc_Matrix *)m);
7240b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
725174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
726174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexGetProjectionMatrix(rs_matrix4x4 *m) {
727174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
728174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpGetProjectionMatrix(rsc, (rsc_Matrix *)m);
7290b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
730174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
731174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramFragmentConstantColor(::rs_program_fragment pf,
732174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                     float r, float g, float b, float a) {
733174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
734174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPfConstantColor(rsc, (ProgramFragment *)pf.p, r, g, b, a);
7350b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
736174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
737174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsgGetWidth(void) {
738174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
739174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetWidth(rsc);
7400b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
741174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
742174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsgGetHeight(void) {
743174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
744174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetHeight(rsc);
7450b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
746174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
747174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawRect(float x1, float y1, float x2, float y2, float z) {
748174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x1, y2, z,
749174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y2, z,
750174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y1, z,
751174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x1, y1, z);
7520b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
753174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
754174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawQuad(float x1, float y1, float z1,
755174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x2, float y2, float z2,
756174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x3, float y3, float z3,
757174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x4, float y4, float z4) {
758174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x1, y1, z1,
759174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y2, z2,
760174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x3, y3, z3,
761174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x4, y4, z4);
7620b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
763174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
764174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
765174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x2, float y2, float z2, float u2, float v2,
766174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x3, float y3, float z3, float u3, float v3,
767174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x4, float y4, float z4, float u4, float v4) {
768174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuadTexCoords(x1, y1, z1, u1, v1,
769174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x2, y2, z2, u2, v2,
770174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x3, y3, z3, u3, v3,
771174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x4, y4, z4, u4, v4);
7720b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
773174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
774174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawSpriteScreenspace(float x, float y, float z, float w, float h) {
775174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawSpriteScreenspace(x, y, z, w, h);
7760b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
777174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
778174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism) {
779174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
780174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMesh(rsc, (Mesh *)ism.p);
7810b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
782174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
783174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism, uint primitiveIndex) {
784174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
785174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMeshPrimitive(rsc, (Mesh *)ism.p, primitiveIndex);
7860b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
787174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
788174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism, uint primitiveIndex, uint start, uint len) {
789174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
790174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMeshPrimitiveRange(rsc, (Mesh *)ism.p, primitiveIndex, start, len);
7910b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
792174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
793174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid  rsgMeshComputeBoundingBox(::rs_mesh mesh,
794174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                float *minX, float *minY, float *minZ,
795174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                float *maxX, float *maxY, float *maxZ) {
796174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
797174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeshComputeBoundingBox(rsc, (Mesh *)mesh.p, minX, minY, minZ, maxX, maxY, maxZ);
7980b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
799174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
800174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearColor(float r, float g, float b, float a) {
801174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
802174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPrepareClear(rsc);
803174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLClearColor(rsc, r, g, b, a);
8040b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
805174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
806174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearDepth(float value) {
807174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
808174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPrepareClear(rsc);
809174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLClearDepth(rsc, value);
8100b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
811174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
812174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawText(const char *text, int x, int y) {
813174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
814174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawText(rsc, text, x, y);
8150b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
816127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
817174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawText(::rs_allocation a, int x, int y) {
818174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
819174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawTextAlloc(rsc, (Allocation *)a.p, x, y);
820127d51c1193f4055795da967d47a13bedd3cb951Miao Wang}
821127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
822174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgMeasureText(const char *text, int *left, int *right,
823174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    int *top, int *bottom) {
824174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
825174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeasureText(rsc, text, left, right, top, bottom);
826127d51c1193f4055795da967d47a13bedd3cb951Miao Wang}
827127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
828174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgMeasureText(::rs_allocation a, int *left, int *right,
829174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    int *top, int *bottom) {
830174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
831174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeasureTextAlloc(rsc, (Allocation *)a.p, left, right, top, bottom);
832dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar}
833dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
834174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindFont(::rs_font font) {
835174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
836174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFont(rsc, (Font *)font.p);
8370b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
838174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
839174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgFontColor(float r, float g, float b, float a) {
840174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
841174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrFontColor(rsc, r, g, b, a);
8420b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
843174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
844174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindColorTarget(::rs_allocation a, uint slot) {
845174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
846174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFrameBufferObjectColorTarget(rsc, (Allocation *)a.p, slot);
8470b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
848174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
849174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindDepthTarget(::rs_allocation a) {
850174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
851174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFrameBufferObjectDepthTarget(rsc, (Allocation *)a.p);
8520b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
853174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
854174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearColorTarget(uint slot) {
855174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
856174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectColorTarget(rsc, slot);
8570b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
858174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
859174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearDepthTarget(void) {
860174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
861174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectDepthTarget(rsc);
8620b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
863174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
864174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearAllRenderTargets(void) {
865174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
866174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectTargets(rsc);
8670b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
868127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
869174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid color(float r, float g, float b, float a) {
870174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
871174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrColor(rsc, r, g, b, a);
8720b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
8730b575de8ed0b628d84d256f5846500b0385979bdTim Murray
874174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgFinish(void) {
875174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
876174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLFinish(rsc);
877174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
878174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
8790b575de8ed0b628d84d256f5846500b0385979bdTim Murray
880174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
881174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Debug routines
882174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
8830b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f) {
884174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
8850b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
8860b575de8ed0b628d84d256f5846500b0385979bdTim Murray
8870b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2) {
888174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, f1, f2);
8890b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
8900b575de8ed0b628d84d256f5846500b0385979bdTim Murray
8910b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2, float f3) {
892174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, f1, f2, f3);
8930b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
8940b575de8ed0b628d84d256f5846500b0385979bdTim Murray
8950b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2, float f3, float f4) {
896174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
8970b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
8980b575de8ed0b628d84d256f5846500b0385979bdTim Murray
899174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float2 *f2) {
900174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float2 f = *f2;
901174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, f.x, f.y);
9020b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9030b575de8ed0b628d84d256f5846500b0385979bdTim Murray
904174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float3 *f3) {
905174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float3 f = *f3;
906174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, f.x, f.y, f.z);
9070b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9080b575de8ed0b628d84d256f5846500b0385979bdTim Murray
909174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float4 *f4) {
910174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float4 f = *f4;
911174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, f.x, f.y, f.z, f.w);
9120b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9130b575de8ed0b628d84d256f5846500b0385979bdTim Murray
9140b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, double d) {
915174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
9160b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9170b575de8ed0b628d84d256f5846500b0385979bdTim Murray
918174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double2 *d2) {
919174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double2 d = *d2;
920174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, d.x, d.y);
9216ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
9226ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
923174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double3 *d3) {
924174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double3 d = *d3;
925174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, d.x, d.y, d.z);
9266ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
9276ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
928174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double4 *d4) {
929174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double4 d = *d4;
930174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, d.x, d.y, d.z, d.w);
9316ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
9326ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
933b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix4x4 *m) {
934174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
935174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
936174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
937174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
938174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
9390b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9400b575de8ed0b628d84d256f5846500b0385979bdTim Murray
941b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix3x3 *m) {
942174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
943174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
944174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
945174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
9460b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9470b575de8ed0b628d84d256f5846500b0385979bdTim Murray
948b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix2x2 *m) {
949174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
950174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f", s, f[0], f[2]);
951174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f}",s, f[1], f[3]);
9520b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9530b575de8ed0b628d84d256f5846500b0385979bdTim Murray
9540b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, char c) {
955174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hhd  0x%hhx", s, c, (unsigned char)c);
9560b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9570b575de8ed0b628d84d256f5846500b0385979bdTim Murray
958174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char2 *c2) {
959174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char2 c = *c2;
960174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hhd, %hhd}  0x%hhx 0x%hhx", s, c.x, c.y, (unsigned char)c.x, (unsigned char)c.y);
9610b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9620b575de8ed0b628d84d256f5846500b0385979bdTim Murray
963174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char3 *c3) {
964174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char3 c = *c3;
965174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
9660b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9670b575de8ed0b628d84d256f5846500b0385979bdTim Murray
968174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char4 *c4) {
969174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char4 c = *c4;
970174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
9710b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9720b575de8ed0b628d84d256f5846500b0385979bdTim Murray
9730b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, unsigned char c) {
974174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hhu  0x%hhx", s, c, c);
9750b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9760b575de8ed0b628d84d256f5846500b0385979bdTim Murray
977174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar2 *c2) {
978174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar2 c = *c2;
979174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hhu, %hhu}  0x%hhx 0x%hhx", s, c.x, c.y, c.x, c.y);
9800b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9810b575de8ed0b628d84d256f5846500b0385979bdTim Murray
982174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar3 *c3) {
983174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar3 c = *c3;
984174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
9850b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9860b575de8ed0b628d84d256f5846500b0385979bdTim Murray
987174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar4 *c4) {
988174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar4 c = *c4;
989174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
9900b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9910b575de8ed0b628d84d256f5846500b0385979bdTim Murray
9920b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, short c) {
993174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hd  0x%hx", s, c, c);
9940b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
9950b575de8ed0b628d84d256f5846500b0385979bdTim Murray
996174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short2 *c2) {
997174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short2 c = *c2;
998174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hd, %hd}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
9990b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10000b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1001174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short3 *c3) {
1002174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short3 c = *c3;
1003174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
10040b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10050b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1006174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short4 *c4) {
1007174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short4 c = *c4;
1008174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
10090b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10100b575de8ed0b628d84d256f5846500b0385979bdTim Murray
10110b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, unsigned short c) {
1012174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hu  0x%hx", s, c, c);
1013174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1014174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1015174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort2 *c2) {
1016174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort2 c = *c2;
1017174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hu, %hu}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
10180b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10190b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1020174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort3 *c3) {
1021174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort3 c = *c3;
1022174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
1023174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1024174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1025174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort4 *c4) {
1026174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort4 c = *c4;
1027174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
10280b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10290b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1030174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, int i) {
1031174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %d  0x%x", s, i, i);
10320b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10330b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1034174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int2 *i2) {
1035174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int2 i = *i2;
1036174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%d, %d}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
10370b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10380b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1039174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int3 *i3) {
1040174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int3 i = *i3;
1041174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
10420b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10430b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1044174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int4 *i4) {
1045174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int4 i = *i4;
1046174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
10470b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10480b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1049174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned int i) {
1050174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %u  0x%x", s, i, i);
10510b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10520b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1053174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint2 *i2) {
1054174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint2 i = *i2;
1055174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%u, %u}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
10560b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10570b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1058174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint3 *i3) {
1059174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint3 i = *i3;
1060174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
10610b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10620b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1063174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint4 *i4) {
1064174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint4 i = *i4;
1065174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
10660b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10670b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1068174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentemplate <typename T>
1069174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic inline long long LL(const T &x) {
1070174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return static_cast<long long>(x);
10710b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10720b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1073174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentemplate <typename T>
1074174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic inline unsigned long long LLu(const T &x) {
1075174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return static_cast<unsigned long long>(x);
10760b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10770b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1078174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, long l) {
1079174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %lld  0x%llx", s, LL(l), LL(l));
10800b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10810b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1082174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, long long ll) {
1083174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %lld  0x%llx", s, LL(ll), LL(ll));
10840b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10850b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1086b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long2 *c) {
1087174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long2 ll = *c;
1088174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
10890b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10900b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1091b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long3 *c) {
1092174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long3 ll = *c;
1093174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
10940b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10950b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1096b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long4 *c) {
1097174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long4 ll = *c;
1098174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
10990b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11000b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1101174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned long l) {
1102174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    unsigned long long ll = l;
1103174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %llu  0x%llx", s, ll, ll);
11040b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11050b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1106174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned long long ll) {
1107174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %llu  0x%llx", s, ll, ll);
11080b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11090b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1110b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong2 *c) {
1111174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong2 ll = *c;
1112174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
11130b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11140b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1115b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong3 *c) {
1116174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong3 ll = *c;
1117174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
11180b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11190b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1120b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong4 *c) {
1121174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong4 ll = *c;
1122174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
11230b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11240b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1125a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// FIXME: We need to export these function signatures for the compatibility
1126a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// library. The C++ name mangling that LLVM uses for ext_vector_type requires
1127a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// different versions for "long" vs. "long long". Note that the called
1128a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// functions are still using the appropriate 64-bit sizes.
1129127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1130127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#ifndef __LP64__
1131a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l2 __attribute__((ext_vector_type(2)));
1132a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l3 __attribute__((ext_vector_type(3)));
1133a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l4 __attribute__((ext_vector_type(4)));
1134a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul2 __attribute__((ext_vector_type(2)));
1135a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul3 __attribute__((ext_vector_type(3)));
1136a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul4 __attribute__((ext_vector_type(4)));
1137a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1138a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l2 *c) {
1139174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long2 ll = *(const long2 *)c;
1140174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
1141a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1142a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1143a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l3 *c) {
1144174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long3 ll = *(const long3 *)c;
1145174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1146a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1147a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1148a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l4 *c) {
1149174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long4 ll = *(const long4 *)c;
1150174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1151a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1152a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1153a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul2 *c) {
1154174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong2 ll = *(const ulong2 *)c;
1155174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
1156a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1157a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1158a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul3 *c) {
1159174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong3 ll = *(const ulong3 *)c;
1160174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1161a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1162a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1163a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul4 *c) {
1164174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong4 ll = *(const ulong4 *)c;
1165174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1166a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1167127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#endif
1168a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1169174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long2 ll) {
1170174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
11719f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
11729f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1173174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long3 ll) {
1174174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
11759f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
11769f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1177174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long4 ll) {
1178174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
11799f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
11809f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1181174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong2 ll) {
1182174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
11839f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
11849f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1185174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong3 ll) {
1186174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
11879f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
11889f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1189174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong4 ll) {
1190174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
11919f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
11929f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
11930b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, const void *p) {
1194174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %p", s, p);
11950b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
119687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
1197709a0978ae141198018ca9769f8d96292a8928e6Jason Samsextern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name) {
1198174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// TODO: remove
119944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    return nullptr;
120087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
1201