rsdRuntimeStubs.cpp revision 6b387c1e466b507007f0b388da8b037362154e9a
187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams/*
2709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Copyright (C) 2011-2012 The Android Open Source Project
387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *
487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * you may not use this file except in compliance with the License.
687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * You may obtain a copy of the License at
787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *
887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *
1087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * Unless required by applicable law or agreed to in writing, software
1187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * See the License for the specific language governing permissions and
1487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * limitations under the License.
1587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams */
1687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
1787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsContext.h"
186b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#include "rsElement.h"
1987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsScriptC.h"
2087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix4x4.h"
2187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix3x3.h"
2287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix2x2.h"
2387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsRuntime.h"
246b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#include "rsType.h"
2587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
2687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsdCore.h"
27807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams#include "rsdBcc.h"
2887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
29b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams#include "rsdAllocation.h"
30414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#include "rsdShaderCache.h"
31414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#include "rsdVertexArray.h"
3287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
3387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include <time.h>
3487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
3587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsusing namespace android;
3687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsusing namespace android::renderscript;
3787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
38a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float2 __attribute__((ext_vector_type(2)));
39a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float3 __attribute__((ext_vector_type(3)));
40a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float4 __attribute__((ext_vector_type(4)));
415261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double2 __attribute__((ext_vector_type(2)));
425261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double3 __attribute__((ext_vector_type(3)));
435261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double4 __attribute__((ext_vector_type(4)));
44a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char2 __attribute__((ext_vector_type(2)));
45a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char3 __attribute__((ext_vector_type(3)));
46a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char4 __attribute__((ext_vector_type(4)));
47a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar2 __attribute__((ext_vector_type(2)));
48a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar3 __attribute__((ext_vector_type(3)));
49a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar4 __attribute__((ext_vector_type(4)));
50d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short2 __attribute__((ext_vector_type(2)));
51d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short3 __attribute__((ext_vector_type(3)));
52d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short4 __attribute__((ext_vector_type(4)));
53d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort2 __attribute__((ext_vector_type(2)));
54d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort3 __attribute__((ext_vector_type(3)));
55d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort4 __attribute__((ext_vector_type(4)));
56a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int2 __attribute__((ext_vector_type(2)));
57a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int3 __attribute__((ext_vector_type(3)));
58a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int4 __attribute__((ext_vector_type(4)));
59a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint2 __attribute__((ext_vector_type(2)));
60a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint3 __attribute__((ext_vector_type(3)));
61a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint4 __attribute__((ext_vector_type(4)));
62d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long2 __attribute__((ext_vector_type(2)));
63d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long3 __attribute__((ext_vector_type(3)));
64d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long4 __attribute__((ext_vector_type(4)));
65d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong2 __attribute__((ext_vector_type(2)));
66d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong3 __attribute__((ext_vector_type(3)));
67d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong4 __attribute__((ext_vector_type(4)));
6887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
695261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint8_t uchar;
705261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint16_t ushort;
715261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint32_t uint;
720b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER
735261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint64_t ulong;
740b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif
7587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
76127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#ifndef __LP64__
77d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#define OPAQUETYPE(t) \
78d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    typedef struct { const int* const p; } __attribute__((packed, aligned(4))) t;
79127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#else
80127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#define OPAQUETYPE(t) \
81127d51c1193f4055795da967d47a13bedd3cb951Miao Wang    typedef struct { const void* p; const void* r; const void* v1; const void* v2; } t;
82127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#endif
83d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
84d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_element)
85d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_type)
86d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_allocation)
87d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_sampler)
88d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_script)
89d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_script_call)
902544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga Nainar
912544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_fragment);
922544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_store);
932544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_vertex);
942544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_raster);
952544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_mesh);
962544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_font);
972544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga Nainar
98d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#undef OPAQUETYPE
99d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
1007a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hinestypedef enum {
1017a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines    // Empty to avoid conflicting definitions with RsAllocationCubemapFace
1027a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines} rs_allocation_cubemap_face;
1037a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines
1046b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainartypedef enum {
1056b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // Empty to avoid conflicting definitions with RsYuvFormat
1066b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar} rs_yuv_format;
1076b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
1086b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainartypedef enum {
1096b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // Empty to avoid conflicting definitions with RsAllocationMipmapControl
1106b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar} rs_allocation_mipmap_control;
1116b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
112174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef struct { unsigned int val; } rs_allocation_usage_type;
113174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
114d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murraytypedef struct {
115d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_sec;     ///< seconds
116d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_min;     ///< minutes
117d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_hour;    ///< hours
118d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_mday;    ///< day of the month
119d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_mon;     ///< month
120d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_year;    ///< year
121d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_wday;    ///< day of the week
122d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_yday;    ///< day of the year
123d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_isdst;   ///< daylight savings time
124d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray} rs_tm;
125d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
1267153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// Some RS functions are not threadsafe but can be called from an invoke
1277153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// function.  Instead of summarily marking scripts that call these functions as
1287153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// not-threadable we detect calls to them in the driver and sends a fatal error
1297153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// message.
1307153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainarstatic bool failIfInKernel(Context *rsc, const char *funcName) {
1317153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
1327153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    RsdCpuReference *impl = (RsdCpuReference *) dc->mCpuRef;
1337153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
1347153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (impl->getInForEach()) {
1357153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        char buf[256];
1367153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        sprintf(buf, "Error: Call to unsupported function %s "
1377153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar                         "in kernel", funcName);
1387153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        rsc->setError(RS_ERROR_FATAL_DRIVER, buf);
1397153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return true;
1407153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    }
1417153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    return false;
1427153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar}
1437153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
14487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
145174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Allocation routines
14687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
14766d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic#if defined(__i386__) || (defined(__mips__) && __mips==32)
14866d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic// i386 and MIPS32 have different struct return passing to ARM; emulate with a pointer
149174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst Allocation * rsGetAllocation(const void *ptr) {
150709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
151174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
152174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
153174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0};
154174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    alloc->callUpdateCacheObject(rsc, &obj);
155174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return (Allocation *)obj.p;
15674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk}
157174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
158174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst android::renderscript::rs_allocation rsGetAllocation(const void *ptr) {
159709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
160174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
161174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
1627153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
16366d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic#ifndef __LP64__ // ARMv7
164174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0};
165174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else // AArch64/x86_64/MIPS64
166174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0, 0, 0, 0};
167174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
168174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    alloc->callUpdateCacheObject(rsc, &obj);
169174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return obj;
17074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk}
171174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
17274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
173174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationIoSend(::rs_allocation a) {
1741aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1757153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationIoSend"))
1767153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
177174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationIoSend(rsc, (Allocation *)a.p);
1781aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
1791aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
180174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationIoReceive(::rs_allocation a) {
1811aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1827153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationIoReceive"))
1837153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
184174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationIoReceive(rsc, (Allocation *)a.p);
1851aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
1861aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
187174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationCopy1DRange(
188174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation dstAlloc,
189174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstOff, uint32_t dstMip, uint32_t count,
190174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation srcAlloc,
191174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcOff, uint32_t srcMip) {
1921aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1937153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationCopy1DRange"))
1947153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
195174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationCopy1DRange(rsc, (Allocation *)dstAlloc.p, dstOff, dstMip,
196174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                             count, (Allocation *)srcAlloc.p, srcOff, srcMip);
1971aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
1981aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
199174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationCopy2DRange(
200174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation dstAlloc,
201174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstXoff, uint32_t dstYoff,
202174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstMip, rs_allocation_cubemap_face dstFace,
203174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t width, uint32_t height,
204174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation srcAlloc,
205174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcXoff, uint32_t srcYoff,
206174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcMip, rs_allocation_cubemap_face srcFace) {
2071aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
2087153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationCopy2DRange"))
2097153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
210174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationCopy2DRange(rsc, (Allocation *)dstAlloc.p,
2111aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray                             dstXoff, dstYoff, dstMip, dstFace,
212174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                             width, height, (Allocation *)srcAlloc.p,
2131aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray                             srcXoff, srcYoff, srcMip, srcFace);
2141aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
2151aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
2166b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarstatic android::renderscript::rs_element CreateElement(RsDataType dt,
2176b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                       RsDataKind dk,
2186b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                       bool isNormalized,
2196b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                       uint32_t vecSize) {
2206b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
2216b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2226b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // No need for validation here.  The rsCreateElement overload below is not
2236b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // exposed to the Script.  The Element-creation APIs call this function in a
2246b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // consistent manner and rsComponent.cpp asserts on any inconsistency.
2256b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Element *element = (Element *) rsrElementCreate(rsc, dt, dk, isNormalized,
2266b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                    vecSize);
2276b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_element obj = {};
2286b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (element == nullptr)
2296b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2306b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    element->callUpdateCacheObject(rsc, &obj);
2316b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
2326b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
2336b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2346b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarstatic android::renderscript::rs_type CreateType(RsElement element,
2356b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t dimX, uint32_t dimY,
2366b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t dimZ, bool mipmaps,
2376b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 bool faces,
2386b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t yuv_format) {
2396b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2406b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
2416b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_type obj = {};
2426b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2436b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (element == nullptr) {
2446b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Invalid element");
2456b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2466b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2476b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2486b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // validate yuv_format
2496b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    RsYuvFormat yuv = (RsYuvFormat) yuv_format;
2506b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (yuv != RS_YUV_NONE &&
2516b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_YV12 &&
2526b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_NV21 &&
2536b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_420_888) {
2546b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2556b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Invalid yuv_format %d\n", yuv_format);
2566b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2576b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2586b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2596b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // validate consistency of shape parameters
2606b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (dimZ > 0) {
2616b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (dimX < 1 || dimY < 1) {
2626b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: Both X and Y dimension required "
2636b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                  "when Z is present.");
2646b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2656b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2666b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (mipmaps) {
2676b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: mipmap control requires 2D types");
2686b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2696b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2706b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (faces) {
2716b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: Cube maps require 2D types");
2726b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2736b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2746b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2756b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (dimY > 0 && dimX < 1) {
2766b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: X dimension required when Y is "
2776b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar              "present.");
2786b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2796b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2806b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (mipmaps && dimY < 1) {
2816b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: mipmap control require 2D Types.");
2826b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2836b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2846b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (faces && dimY < 1) {
2856b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Cube maps require 2D Types.");
2866b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2876b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2886b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (yuv_format != RS_YUV_NONE) {
2896b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (dimZ != 0 || dimY == 0 || faces || mipmaps) {
2906b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: YUV only supports basic 2D.");
2916b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2926b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2936b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2946b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2956b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Type *type = (Type *) rsrTypeCreate(rsc, element, dimX, dimY, dimZ, mipmaps,
2966b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                        faces, yuv_format);
2976b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (type == nullptr)
2986b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2996b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    type->callUpdateCacheObject(rsc, &obj);
3006b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
3016b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3026b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3036b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarstatic android::renderscript::rs_allocation CreateAllocation(
3046b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        RsType type, RsAllocationMipmapControl mipmaps, uint32_t usages,
3056b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        void *ptr) {
3066b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3076b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
3086b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_allocation obj = {};
3096b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3106b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (type == nullptr) {
3116b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_allocation creation error: Invalid type");
3126b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3136b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
3146b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3156b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    uint32_t validUsages = RS_ALLOCATION_USAGE_SCRIPT | \
3166b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                           RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
3176b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (usages & ~validUsages) {
3186b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_allocation creation error: Invalid usage flag");
3196b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3206b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
3216b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3226b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Allocation *alloc = (Allocation *) rsrAllocationCreateTyped(rsc, type,
3236b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                                mipmaps, usages,
3246b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                                (uintptr_t) ptr);
3256b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (alloc == nullptr)
3266b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3276b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    alloc->callUpdateCacheObject(rsc, &obj);
3286b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3296b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
3306b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3316b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3326b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// Define rsCreateElement, rsCreateType and rsCreateAllocation entry points
3336b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// differently for 32-bit x86 and Mips.  The definitions for ARM32 and all
3346b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// 64-bit architectures is further below.
3356b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#if defined(__i386__) || (defined(__mips__) && __mips==32)
3366b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3376b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// The calling convention for the driver on 32-bit x86 and Mips returns
3386b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// rs_element etc. as a stack-return parameter.  The Script uses ARM32 calling
3396b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// conventions that return the structs in a register.  To match this convention,
3406b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// emulate the return value using a pointer.
3416b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarElement *rsCreateElement(int32_t dt, int32_t dk, bool isNormalized,
3426b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                         uint32_t vecSize) {
3436b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3446b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_element obj = CreateElement((RsDataType) dt,
3456b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          (RsDataKind) dk,
3466b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          isNormalized,
3476b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          vecSize);
3486b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Element *) obj.p;
3496b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3506b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3516b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarType *rsCreateType(::rs_element element, uint32_t dimX, uint32_t dimY,
3526b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                   uint32_t dimZ, bool mipmaps, bool faces,
3536b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                   rs_yuv_format yuv_format) {
3546b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_type obj = CreateType((RsElement) element.p, dimX,
3556b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                    dimY, dimZ, mipmaps, faces,
3566b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                    (RsYuvFormat) yuv_format);
3576b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Type *) obj.p;
3586b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3596b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3606b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarAllocation *rsCreateAllocation(::rs_type type,
3616b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                               rs_allocation_mipmap_control mipmaps,
3626b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                               uint32_t usages, void *ptr) {
3636b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3646b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_allocation obj;
3656b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    obj = CreateAllocation((RsType) type.p, (RsAllocationMipmapControl) mipmaps,
3666b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                           usages, ptr);
3676b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Allocation *) obj.p;
3686b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3696b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3706b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#else
3716b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_element rsCreateElement(int32_t dt, int32_t dk,
3726b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                  bool isNormalized,
3736b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                  uint32_t vecSize) {
3746b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3756b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateElement((RsDataType) dt, (RsDataKind) dk, isNormalized,
3766b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                         vecSize);
3776b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3786b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3796b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_type rsCreateType(::rs_element element, uint32_t dimX,
3806b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            uint32_t dimY, uint32_t dimZ,
3816b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            bool mipmaps, bool faces,
3826b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            rs_yuv_format yuv_format) {
3836b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateType((RsElement) element.p, dimX, dimY, dimZ, mipmaps, faces,
3846b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                      yuv_format);
3856b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3866b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3876b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_allocation rsCreateAllocation(
3886b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ::rs_type type, rs_allocation_mipmap_control mipmaps, uint32_t usages,
3896b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        void *ptr) {
3906b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3916b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateAllocation((RsType) type.p,
3926b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                            (RsAllocationMipmapControl) mipmaps,
3936b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                            usages, ptr);
3946b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3956b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#endif
3966b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
397174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
398174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Object routines
399174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
400174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define IS_CLEAR_SET_OBJ(t) \
401174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    bool rsIsObject(t src) { \
402174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return src.p != nullptr; \
403174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
404174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void __attribute__((overloadable)) rsClearObject(t *dst) { \
405174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        Context *rsc = RsdCpuReference::getTlsContext(); \
406174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsrClearObject(rsc, reinterpret_cast<rs_object_base *>(dst)); \
407174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
408174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void __attribute__((overloadable)) rsSetObject(t *dst, t src) { \
409174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        Context *rsc = RsdCpuReference::getTlsContext(); \
410174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsrSetObject(rsc, reinterpret_cast<rs_object_base *>(dst), (ObjectBase*)src.p); \
411174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
4127153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
413174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_element)
414174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_type)
415174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_allocation)
416174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_sampler)
417174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_script)
418b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams
419174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_mesh)
420174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_fragment)
421174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_vertex)
422174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_raster)
423174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_store)
424174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_font)
4251aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
426174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef IS_CLEAR_SET_OBJ
42774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
42887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
429174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Element routines
43087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
431174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void * ElementAt(Allocation *a, RsDataType dt, uint32_t vecSize,
432174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        uint32_t x, uint32_t y, uint32_t z) {
433709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
434174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Type *t = a->getType();
435174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Element *e = t->getElement();
436a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
437174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char buf[256];
438174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (x && (x >= t->getLODDimX(0))) {
439174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
440174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
441174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
442174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
443a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
444174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (y && (y >= t->getLODDimY(0))) {
445174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        sprintf(buf, "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
446174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
447174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
448174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
44987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
450174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (z && (z >= t->getLODDimZ(0))) {
451174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        sprintf(buf, "Out range ElementAt Z %i of %i", z, t->getLODDimZ(0));
452174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
453174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
454174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
45587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
456174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (vecSize > 0) {
457174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (vecSize != e->getVectorSize()) {
458174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
459174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
460174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            return nullptr;
461174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        }
46287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
463174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (dt != e->getType()) {
464174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
465174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
466174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            return nullptr;
467174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        }
468174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
46987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
470174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
471174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t eSize = e->getSizeBytes();
472174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t stride = a->mHal.drvState.lod[0].stride;
473174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t dimY = a->mHal.drvState.lod[0].dimY;
474174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return &p[(x * eSize) + (y * stride) + (z * stride * dimY)];
47587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
47687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
477174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y, uint32_t z) {
478174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Type *t = const_cast<Allocation*>((Allocation*)a.p)->getType();
479174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Element *e = t->getElement();
480174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void *tmp = ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
481174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (tmp != nullptr)
482174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        memcpy(tmp, ptr, e->getSizeBytes());
48387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
48487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
485174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y) {
486174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsSetElementAt(a, ptr, x, y, 0);
48787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
48887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
489174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x) {
490174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsSetElementAt(a, ptr, x, 0, 0);
49187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
49287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
493174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
494174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
49587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
49687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
497174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y) {
498174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsGetElementAt(a, x, y ,0);
49987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
50087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
501174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x) {
502174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsGetElementAt(a, x, 0, 0);
50387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
50487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
505174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define ELEMENT_AT(T, DT, VS) \
506174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z) { \
507174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
508174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (r != nullptr) ((T *)r)[0] = *val; \
509174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
510174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
511174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y) { \
512174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, val, x, y, 0); \
513174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
514174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x) { \
515174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, val, x, 0, 0); \
516174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
517174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z) { \
518174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
519174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (r != nullptr) *val = ((T *)r)[0]; \
520174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
521174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
522174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y) { \
523174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, val, x, y, 0); \
524174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
525174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x) { \
526174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, val, x, 0, 0); \
527174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
52887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
529174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char, RS_TYPE_SIGNED_8, 1)
530174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char2, RS_TYPE_SIGNED_8, 2)
531174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char3, RS_TYPE_SIGNED_8, 3)
532174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char4, RS_TYPE_SIGNED_8, 4)
533174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar, RS_TYPE_UNSIGNED_8, 1)
534174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar2, RS_TYPE_UNSIGNED_8, 2)
535174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar3, RS_TYPE_UNSIGNED_8, 3)
536174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar4, RS_TYPE_UNSIGNED_8, 4)
537174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short, RS_TYPE_SIGNED_16, 1)
538174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short2, RS_TYPE_SIGNED_16, 2)
539174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short3, RS_TYPE_SIGNED_16, 3)
540174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short4, RS_TYPE_SIGNED_16, 4)
541174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort, RS_TYPE_UNSIGNED_16, 1)
542174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort2, RS_TYPE_UNSIGNED_16, 2)
543174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort3, RS_TYPE_UNSIGNED_16, 3)
544174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort4, RS_TYPE_UNSIGNED_16, 4)
545174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int, RS_TYPE_SIGNED_32, 1)
546174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int2, RS_TYPE_SIGNED_32, 2)
547174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int3, RS_TYPE_SIGNED_32, 3)
548174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int4, RS_TYPE_SIGNED_32, 4)
549174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint, RS_TYPE_UNSIGNED_32, 1)
550174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint2, RS_TYPE_UNSIGNED_32, 2)
551174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint3, RS_TYPE_UNSIGNED_32, 3)
552174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint4, RS_TYPE_UNSIGNED_32, 4)
553174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long, RS_TYPE_SIGNED_64, 1)
554174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long2, RS_TYPE_SIGNED_64, 2)
555174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long3, RS_TYPE_SIGNED_64, 3)
556174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long4, RS_TYPE_SIGNED_64, 4)
557174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong, RS_TYPE_UNSIGNED_64, 1)
558174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong2, RS_TYPE_UNSIGNED_64, 2)
559174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong3, RS_TYPE_UNSIGNED_64, 3)
560174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong4, RS_TYPE_UNSIGNED_64, 4)
561174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float, RS_TYPE_FLOAT_32, 1)
562174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float2, RS_TYPE_FLOAT_32, 2)
563174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float3, RS_TYPE_FLOAT_32, 3)
564174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float4, RS_TYPE_FLOAT_32, 4)
565174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double, RS_TYPE_FLOAT_64, 1)
566174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double2, RS_TYPE_FLOAT_64, 2)
567174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double3, RS_TYPE_FLOAT_64, 3)
568174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double4, RS_TYPE_FLOAT_64, 4)
56987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
570174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef ELEMENT_AT
57187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
572174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
573174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen/*
574174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * We miss some symbols for rs{Get,Set}Element_long,ulong variants because 64
575174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * bit integer values are 'long' in RS-land but might be 'long long' in the
576174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * driver.  Define native_long* and native_ulong* types to be vectors of
577174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * 'long' as seen by the driver and define overloaded versions of
578174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * rsSetElementAt_* and rsGetElementAt_*.  This should get us the correct
579174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * mangled names in the driver.
580174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen */
58187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
582174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long2 __attribute__((ext_vector_type(2)));
583174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long3 __attribute__((ext_vector_type(3)));
584174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long4 __attribute__((ext_vector_type(4)));
585174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong2 __attribute__((ext_vector_type(2)));
586174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong3 __attribute__((ext_vector_type(3)));
587174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong4 __attribute__((ext_vector_type(4)));
58887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
589174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define ELEMENT_AT_OVERLOADS(T, U) \
590174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y, uint32_t z) { \
591174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, y, z); \
592174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
593174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y) { \
594174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, y, 0); \
595174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
596174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x) { \
597174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, 0, 0); \
598174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
599174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y, uint32_t z) { \
600174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, y, z); \
601174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
602174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y) { \
603174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, y, 0); \
604174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
605174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x) { \
606174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, 0, 0); \
607174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
60887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
609174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long2, native_long2)
610174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long3, native_long3)
611174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long4, native_long4)
612174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong, unsigned long)
613174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong2, native_ulong2)
614174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong3, native_ulong3)
615174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong4, native_ulong4)
616414a46166126da6864258bd25ff183f9a3c6261dStephen Hines
617174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// We also need variants of rs{Get,Set}ElementAt_long that take 'long long *' as
618174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// we might have this overloaded variant in old APKs.
619174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long, long long)
62087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
621174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef ELEMENT_AT_OVERLOADS
622174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
62387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
624174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
625174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// ForEach routines
626174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
627dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Nivoid rsForEachInternal(int slot,
628dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni                       rs_script_call *call,
629dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni                       int hasOutput,
630dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni                       int numIn,
631dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni                       ...) {
63212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni    Context *rsc = RsdCpuReference::getTlsContext();
63312398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni    Script *s = const_cast<Script*>(RsdCpuReference::getTlsScript());
634b0dabd1c86ddc67507bae00093002b54e86383f0Yang Ni    if (numIn > 100) {
635b0dabd1c86ddc67507bae00093002b54e86383f0Yang Ni        ALOGE("rsForEachInternal: too many inputs to a kernel.");
636dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        return;
637dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
638b0dabd1c86ddc67507bae00093002b54e86383f0Yang Ni    Allocation* inputs[100];
639dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    Allocation* out = nullptr;
640dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    va_list argp;
641dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    va_start(argp, numIn);
642dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    for (int i = 0; i < numIn; i++) {
643dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        ::rs_allocation alloc = va_arg(argp, ::rs_allocation);
644b0dabd1c86ddc67507bae00093002b54e86383f0Yang Ni        inputs[i] = (Allocation*)alloc.p;
645dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
646dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    if (hasOutput) {
647dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        ::rs_allocation outAlloc = va_arg(argp, ::rs_allocation);
648b0dabd1c86ddc67507bae00093002b54e86383f0Yang Ni        out = (Allocation*)outAlloc.p;
649dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
650dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    va_end(argp);
651b0dabd1c86ddc67507bae00093002b54e86383f0Yang Ni    rsrForEach(rsc, s, slot, numIn, numIn > 0 ? inputs : nullptr, out, nullptr, 0, (RsScriptCall*)call);
65212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni}
65312398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni
654174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
655174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
656174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
657174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
658174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const rs_script_call *call) {
659709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
660dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p,
6619479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               (Allocation *)out.p, usr, 0, (RsScriptCall *)call);
66287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
66387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
664174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
665174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
666174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
667174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr) {
668709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
669dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
6709479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, 0, nullptr);
67187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
67287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
673174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
674174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
675174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out) {
676709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
677dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
6789479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               nullptr, 0, nullptr);
67987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
68087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
681174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// These functions are only supported in 32-bit.
682174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
683174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
684174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
685174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
686174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
687174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             uint32_t usrLen) {
688709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
689dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
6909479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, usrLen, nullptr);
69187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
69287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
693174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
694174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
695174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
696174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
697174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             uint32_t usrLen,
698174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const rs_script_call *call) {
699709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
700dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
7019479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, usrLen, (RsScriptCall *)call);
70287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
703174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
70487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
70587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
706174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Message routines
70787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
708174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClient(int cmdID) {
709709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
710174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClient(rsc, cmdID, (const void *)nullptr, 0);
71187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
71287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
713174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClient(int cmdID, const void *data, uint32_t len) {
714709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
715174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClient(rsc, cmdID, data, len);
71687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
71787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
718174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClientBlocking(int cmdID) {
719709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
720174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClientBlocking(rsc, cmdID, (const void *)nullptr, 0);
72187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
72287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
723174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClientBlocking(int cmdID, const void *data, uint32_t len) {
724709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
725174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClientBlocking(rsc, cmdID, data, len);
72687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
72787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
728174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
729174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Time routines
730174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
73187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
732174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// time_t is int in 32-bit RenderScript.  time_t is long in bionic.  rsTime and
733174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// rsLocaltime are set to explicitly take 'const int *' so we generate the
734174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// correct mangled names.
735174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
736174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint rsTime(int *timer) {
737174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
738174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentime_t rsTime(time_t * timer) {
739174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
740709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
741174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrTime(rsc, (time_t *)timer);
74287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
74387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
744174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
745174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenrs_tm* rsLocaltime(rs_tm* local, const int *timer) {
746174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
747174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenrs_tm* rsLocaltime(rs_tm* local, const time_t *timer) {
748174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
749709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
750174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return (rs_tm*)rsrLocalTime(rsc, (tm*)local, (time_t *)timer);
75187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
75287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
753174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint64_t rsUptimeMillis() {
754709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
755174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrUptimeMillis(rsc);
75687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
75787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
758174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint64_t rsUptimeNanos() {
759709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
760174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrUptimeNanos(rsc);
76187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
76287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
763174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenfloat rsGetDt() {
764709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
765174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
766174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetDt(rsc, sc);
76787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
76887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
76987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
770174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Graphics routines
77187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
772174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef RS_COMPATIBILITY_LIB
773174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
774174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x2, float y2, float z2, float u2, float v2,
775174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x3, float y3, float z3, float u3, float v3,
776174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x4, float y4, float z4, float u4, float v4) {
7771aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
778dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
779174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (!rsc->setupCheck()) {
780174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return;
781174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
78287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
783174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
784174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (!dc->gl.shaderCache->setup(rsc)) {
785174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return;
786174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
787444bd208b4f129bd8e4c0cce4cf6d709c8900891Yong Chen
788174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("Quad");
789174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
790174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
791174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
792174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
793127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
794174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
795174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
796127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
797174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdVertexArray::Attrib attribs[2];
798174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    attribs[0].set(GL_FLOAT, 3, 12, false, (size_t)vtx, "ATTRIB_position");
799174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    attribs[1].set(GL_FLOAT, 2, 8, false, (size_t)tex, "ATTRIB_texture0");
800240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray
801174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdVertexArray va(attribs, 2);
802174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    va.setup(rsc);
803240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray
804174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
805240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray}
806174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
807174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawQuad(float x1, float y1, float z1,
808174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x2, float y2, float z2,
809174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x3, float y3, float z3,
810174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x4, float y4, float z4) {
811174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuadTexCoords(x1, y1, z1, 0, 1,
812174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x2, y2, z2, 1, 1,
813174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x3, y3, z3, 1, 0,
814174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x4, y4, z4, 0, 0);
81547211dca5b2fc1aa5680ddebe5c4270c08c06e5dTim Murray}
816174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
817174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) {
81847211dca5b2fc1aa5680ddebe5c4270c08c06e5dTim Murray    Context *rsc = RsdCpuReference::getTlsContext();
81987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
820174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
821174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
822174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //rsc->setupCheck();
823174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
824174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //GLint crop[4] = {0, h, w, -h};
825dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
826174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float sh = rsc->getHeight();
827c500e74d0848b721bf01cf0ab344a6adb035c312Jason Sams
828174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x,   sh - y,     z,
829174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x+w, sh - y,     z,
830174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x+w, sh - (y+h), z,
831174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x,   sh - (y+h), z);
832174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsc->setProgramVertex((ProgramVertex *)tmp.get());
83387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
83487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
835174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsAllocationMarkDirty(::rs_allocation a) {
836447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
837174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
838447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
83987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
840174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a) {
841447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
842174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
843447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
844dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
845174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a,
846174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          unsigned int usage) {
847447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
848174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)usage);
849447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
85087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
85187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
852174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a,
853174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          rs_allocation_usage_type source) {
854709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
855174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)source.val);
85687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
857174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
858174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramFragment(::rs_program_fragment pf) {
859174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
860174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramFragment(rsc, (ProgramFragment *)pf.p);
8610b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
862174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
863174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramStore(::rs_program_store ps) {
864174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
865174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramStore(rsc, (ProgramStore *)ps.p);
8660b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
867174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
868174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramVertex(::rs_program_vertex pv) {
869174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
870174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramVertex(rsc, (ProgramVertex *)pv.p);
8710b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
872174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
873174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramRaster(::rs_program_raster pr) {
874174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
875174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramRaster(rsc, (ProgramRaster *)pr.p);
8760b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
877174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
878174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindSampler(::rs_program_fragment pf,
879174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    uint32_t slot, ::rs_sampler s) {
880174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
881174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindSampler(rsc, (ProgramFragment *)pf.p, slot, (Sampler *)s.p);
8820b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
883174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
884174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindTexture(::rs_program_fragment pf,
885174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    uint32_t slot, ::rs_allocation a) {
886174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
887174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindTexture(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
8880b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
889174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
890174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindConstant(::rs_program_fragment pf,
891174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                     uint32_t slot, ::rs_allocation a) {
892174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
893174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindConstant(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
8940b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
895174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
896174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindConstant(::rs_program_vertex pv,
897174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                     uint32_t slot, ::rs_allocation a) {
898174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
899174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindConstant(rsc, (ProgramVertex *)pv.p, slot, (Allocation *)a.p);
9000b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
901174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
902174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadProjectionMatrix(const rs_matrix4x4 *m) {
903174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
904174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadProjectionMatrix(rsc, (const rsc_Matrix *)m);
9050b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
906174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
907174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadModelMatrix(const rs_matrix4x4 *m) {
908174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
909174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadModelMatrix(rsc, (const rsc_Matrix *)m);
9100b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
911174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
912174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *m) {
913174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
914174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadTextureMatrix(rsc, (const rsc_Matrix *)m);
9150b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
916174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
917174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexGetProjectionMatrix(rs_matrix4x4 *m) {
918174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
919174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpGetProjectionMatrix(rsc, (rsc_Matrix *)m);
9200b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
921174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
922174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramFragmentConstantColor(::rs_program_fragment pf,
923174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                     float r, float g, float b, float a) {
924174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
925174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPfConstantColor(rsc, (ProgramFragment *)pf.p, r, g, b, a);
9260b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
927174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
928174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsgGetWidth(void) {
929174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
930174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetWidth(rsc);
9310b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
932174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
933174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsgGetHeight(void) {
934174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
935174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetHeight(rsc);
9360b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
937174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
938174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawRect(float x1, float y1, float x2, float y2, float z) {
939174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x1, y2, z,
940174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y2, z,
941174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y1, z,
942174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x1, y1, z);
9430b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
944174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
945174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawQuad(float x1, float y1, float z1,
946174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x2, float y2, float z2,
947174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x3, float y3, float z3,
948174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x4, float y4, float z4) {
949174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x1, y1, z1,
950174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y2, z2,
951174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x3, y3, z3,
952174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x4, y4, z4);
9530b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
954174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
955174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
956174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x2, float y2, float z2, float u2, float v2,
957174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x3, float y3, float z3, float u3, float v3,
958174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x4, float y4, float z4, float u4, float v4) {
959174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuadTexCoords(x1, y1, z1, u1, v1,
960174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x2, y2, z2, u2, v2,
961174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x3, y3, z3, u3, v3,
962174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x4, y4, z4, u4, v4);
9630b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
964174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
965174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawSpriteScreenspace(float x, float y, float z, float w, float h) {
966174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawSpriteScreenspace(x, y, z, w, h);
9670b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
968174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
969174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism) {
970174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
971174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMesh(rsc, (Mesh *)ism.p);
9720b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
973174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
974174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism, uint primitiveIndex) {
975174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
976174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMeshPrimitive(rsc, (Mesh *)ism.p, primitiveIndex);
9770b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
978174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
979174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism, uint primitiveIndex, uint start, uint len) {
980174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
981174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMeshPrimitiveRange(rsc, (Mesh *)ism.p, primitiveIndex, start, len);
9820b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
983174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
984174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid  rsgMeshComputeBoundingBox(::rs_mesh mesh,
985174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                float *minX, float *minY, float *minZ,
986174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                float *maxX, float *maxY, float *maxZ) {
987174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
988174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeshComputeBoundingBox(rsc, (Mesh *)mesh.p, minX, minY, minZ, maxX, maxY, maxZ);
9890b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
990174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
991174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearColor(float r, float g, float b, float a) {
992174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
993174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPrepareClear(rsc);
994174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLClearColor(rsc, r, g, b, a);
9950b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
996174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
997174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearDepth(float value) {
998174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
999174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPrepareClear(rsc);
1000174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLClearDepth(rsc, value);
10010b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1002174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1003174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawText(const char *text, int x, int y) {
1004174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1005174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawText(rsc, text, x, y);
10060b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1007127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1008174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawText(::rs_allocation a, int x, int y) {
1009174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1010174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawTextAlloc(rsc, (Allocation *)a.p, x, y);
1011127d51c1193f4055795da967d47a13bedd3cb951Miao Wang}
1012127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1013174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgMeasureText(const char *text, int *left, int *right,
1014174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    int *top, int *bottom) {
1015174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1016174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeasureText(rsc, text, left, right, top, bottom);
1017127d51c1193f4055795da967d47a13bedd3cb951Miao Wang}
1018127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1019174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgMeasureText(::rs_allocation a, int *left, int *right,
1020174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    int *top, int *bottom) {
1021174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1022174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeasureTextAlloc(rsc, (Allocation *)a.p, left, right, top, bottom);
1023dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar}
1024dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
1025174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindFont(::rs_font font) {
1026174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1027174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFont(rsc, (Font *)font.p);
10280b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1029174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1030174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgFontColor(float r, float g, float b, float a) {
1031174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1032174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrFontColor(rsc, r, g, b, a);
10330b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1034174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1035174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindColorTarget(::rs_allocation a, uint slot) {
1036174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1037174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFrameBufferObjectColorTarget(rsc, (Allocation *)a.p, slot);
10380b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1039174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1040174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindDepthTarget(::rs_allocation a) {
1041174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1042174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFrameBufferObjectDepthTarget(rsc, (Allocation *)a.p);
10430b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1044174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1045174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearColorTarget(uint slot) {
1046174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1047174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectColorTarget(rsc, slot);
10480b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1049174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1050174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearDepthTarget(void) {
1051174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1052174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectDepthTarget(rsc);
10530b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1054174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1055174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearAllRenderTargets(void) {
1056174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1057174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectTargets(rsc);
10580b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1059127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1060174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid color(float r, float g, float b, float a) {
1061174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1062174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrColor(rsc, r, g, b, a);
10630b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10640b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1065174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgFinish(void) {
1066174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1067174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLFinish(rsc);
1068174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1069174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
10700b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1071174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
1072174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Debug routines
1073174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
10740b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f) {
1075174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
10760b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10770b575de8ed0b628d84d256f5846500b0385979bdTim Murray
10780b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2) {
1079174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, f1, f2);
10800b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10810b575de8ed0b628d84d256f5846500b0385979bdTim Murray
10820b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2, float f3) {
1083174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, f1, f2, f3);
10840b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10850b575de8ed0b628d84d256f5846500b0385979bdTim Murray
10860b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2, float f3, float f4) {
1087174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
10880b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10890b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1090174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float2 *f2) {
1091174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float2 f = *f2;
1092174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, f.x, f.y);
10930b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10940b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1095174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float3 *f3) {
1096174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float3 f = *f3;
1097174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, f.x, f.y, f.z);
10980b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10990b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1100174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float4 *f4) {
1101174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float4 f = *f4;
1102174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, f.x, f.y, f.z, f.w);
11030b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11040b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11050b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, double d) {
1106174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
11070b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11080b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1109174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double2 *d2) {
1110174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double2 d = *d2;
1111174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, d.x, d.y);
11126ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11136ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1114174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double3 *d3) {
1115174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double3 d = *d3;
1116174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, d.x, d.y, d.z);
11176ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11186ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1119174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double4 *d4) {
1120174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double4 d = *d4;
1121174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, d.x, d.y, d.z, d.w);
11226ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11236ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1124b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix4x4 *m) {
1125174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1126174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
1127174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
1128174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
1129174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
11300b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11310b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1132b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix3x3 *m) {
1133174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1134174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
1135174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
1136174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
11370b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11380b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1139b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix2x2 *m) {
1140174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1141174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f", s, f[0], f[2]);
1142174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f}",s, f[1], f[3]);
11430b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11440b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11450b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, char c) {
1146174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hhd  0x%hhx", s, c, (unsigned char)c);
11470b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11480b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1149174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char2 *c2) {
1150174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char2 c = *c2;
1151174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hhd, %hhd}  0x%hhx 0x%hhx", s, c.x, c.y, (unsigned char)c.x, (unsigned char)c.y);
11520b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11530b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1154174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char3 *c3) {
1155174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char3 c = *c3;
1156174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
11570b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11580b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1159174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char4 *c4) {
1160174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char4 c = *c4;
1161174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
11620b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11630b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11640b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, unsigned char c) {
1165174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hhu  0x%hhx", s, c, c);
11660b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11670b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1168174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar2 *c2) {
1169174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar2 c = *c2;
1170174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hhu, %hhu}  0x%hhx 0x%hhx", s, c.x, c.y, c.x, c.y);
11710b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11720b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1173174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar3 *c3) {
1174174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar3 c = *c3;
1175174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
11760b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11770b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1178174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar4 *c4) {
1179174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar4 c = *c4;
1180174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
11810b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11820b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11830b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, short c) {
1184174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hd  0x%hx", s, c, c);
11850b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11860b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1187174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short2 *c2) {
1188174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short2 c = *c2;
1189174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hd, %hd}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
11900b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11910b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1192174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short3 *c3) {
1193174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short3 c = *c3;
1194174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
11950b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11960b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1197174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short4 *c4) {
1198174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short4 c = *c4;
1199174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12000b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12010b575de8ed0b628d84d256f5846500b0385979bdTim Murray
12020b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, unsigned short c) {
1203174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hu  0x%hx", s, c, c);
1204174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1205174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1206174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort2 *c2) {
1207174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort2 c = *c2;
1208174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hu, %hu}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
12090b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12100b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1211174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort3 *c3) {
1212174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort3 c = *c3;
1213174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
1214174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1215174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1216174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort4 *c4) {
1217174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort4 c = *c4;
1218174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12190b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12200b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1221174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, int i) {
1222174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %d  0x%x", s, i, i);
12230b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12240b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1225174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int2 *i2) {
1226174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int2 i = *i2;
1227174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%d, %d}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
12280b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12290b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1230174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int3 *i3) {
1231174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int3 i = *i3;
1232174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12330b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12340b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1235174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int4 *i4) {
1236174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int4 i = *i4;
1237174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12380b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12390b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1240174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned int i) {
1241174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %u  0x%x", s, i, i);
12420b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12430b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1244174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint2 *i2) {
1245174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint2 i = *i2;
1246174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%u, %u}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
12470b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12480b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1249174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint3 *i3) {
1250174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint3 i = *i3;
1251174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12520b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12530b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1254174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint4 *i4) {
1255174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint4 i = *i4;
1256174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12570b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12580b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1259174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentemplate <typename T>
1260174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic inline long long LL(const T &x) {
1261174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return static_cast<long long>(x);
12620b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12630b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1264174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentemplate <typename T>
1265174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic inline unsigned long long LLu(const T &x) {
1266174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return static_cast<unsigned long long>(x);
12670b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12680b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1269174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, long l) {
1270174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %lld  0x%llx", s, LL(l), LL(l));
12710b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12720b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1273174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, long long ll) {
1274174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %lld  0x%llx", s, LL(ll), LL(ll));
12750b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12760b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1277b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long2 *c) {
1278174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long2 ll = *c;
1279174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
12800b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12810b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1282b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long3 *c) {
1283174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long3 ll = *c;
1284174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
12850b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12860b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1287b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long4 *c) {
1288174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long4 ll = *c;
1289174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
12900b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12910b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1292174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned long l) {
1293174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    unsigned long long ll = l;
1294174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %llu  0x%llx", s, ll, ll);
12950b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12960b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1297174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned long long ll) {
1298174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %llu  0x%llx", s, ll, ll);
12990b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13000b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1301b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong2 *c) {
1302174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong2 ll = *c;
1303174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
13040b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13050b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1306b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong3 *c) {
1307174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong3 ll = *c;
1308174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13090b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13100b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1311b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong4 *c) {
1312174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong4 ll = *c;
1313174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13140b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13150b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1316a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// FIXME: We need to export these function signatures for the compatibility
1317a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// library. The C++ name mangling that LLVM uses for ext_vector_type requires
1318a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// different versions for "long" vs. "long long". Note that the called
1319a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// functions are still using the appropriate 64-bit sizes.
1320127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1321127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#ifndef __LP64__
1322a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l2 __attribute__((ext_vector_type(2)));
1323a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l3 __attribute__((ext_vector_type(3)));
1324a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l4 __attribute__((ext_vector_type(4)));
1325a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul2 __attribute__((ext_vector_type(2)));
1326a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul3 __attribute__((ext_vector_type(3)));
1327a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul4 __attribute__((ext_vector_type(4)));
1328a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1329a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l2 *c) {
1330174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long2 ll = *(const long2 *)c;
1331174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
1332a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1333a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1334a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l3 *c) {
1335174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long3 ll = *(const long3 *)c;
1336174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1337a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1338a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1339a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l4 *c) {
1340174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long4 ll = *(const long4 *)c;
1341174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1342a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1343a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1344a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul2 *c) {
1345174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong2 ll = *(const ulong2 *)c;
1346174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
1347a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1348a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1349a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul3 *c) {
1350174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong3 ll = *(const ulong3 *)c;
1351174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1352a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1353a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1354a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul4 *c) {
1355174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong4 ll = *(const ulong4 *)c;
1356174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1357a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1358127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#endif
1359a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1360174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long2 ll) {
1361174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
13629f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13639f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1364174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long3 ll) {
1365174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13669f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13679f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1368174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long4 ll) {
1369174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13709f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13719f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1372174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong2 ll) {
1373174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
13749f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13759f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1376174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong3 ll) {
1377174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13789f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13799f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1380174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong4 ll) {
1381174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13829f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13839f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
13840b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, const void *p) {
1385174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %p", s, p);
13860b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
138787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
1388709a0978ae141198018ca9769f8d96292a8928e6Jason Samsextern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name) {
1389174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// TODO: remove
139044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    return nullptr;
139187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
1392