rsdRuntimeStubs.cpp revision 10adb0c2029f112b5738228617d5645f6ecea0c5
187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams/*
2709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Copyright (C) 2011-2012 The Android Open Source Project
387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *
487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * you may not use this file except in compliance with the License.
687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * You may obtain a copy of the License at
787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *
887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *
1087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * Unless required by applicable law or agreed to in writing, software
1187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * See the License for the specific language governing permissions and
1487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * limitations under the License.
1587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams */
1687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
1787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsContext.h"
186b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#include "rsElement.h"
1987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsScriptC.h"
2087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix4x4.h"
2187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix3x3.h"
2287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix2x2.h"
2387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsRuntime.h"
246b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#include "rsType.h"
2587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
2687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsdCore.h"
27807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams#include "rsdBcc.h"
2887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
29b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams#include "rsdAllocation.h"
30414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#include "rsdShaderCache.h"
31414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#include "rsdVertexArray.h"
3287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
3387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include <time.h>
3487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
3587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsusing namespace android;
3687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsusing namespace android::renderscript;
3787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
3863bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga Nainartypedef __fp16 half;
3963bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga Nainartypedef half half2 __attribute__((ext_vector_type(2)));
4063bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga Nainartypedef half half3 __attribute__((ext_vector_type(3)));
4163bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga Nainartypedef half half4 __attribute__((ext_vector_type(4)));
4263bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga Nainar
43a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float2 __attribute__((ext_vector_type(2)));
44a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float3 __attribute__((ext_vector_type(3)));
45a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef float float4 __attribute__((ext_vector_type(4)));
465261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double2 __attribute__((ext_vector_type(2)));
475261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double3 __attribute__((ext_vector_type(3)));
485261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef double double4 __attribute__((ext_vector_type(4)));
49a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char2 __attribute__((ext_vector_type(2)));
50a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char3 __attribute__((ext_vector_type(3)));
51a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef char char4 __attribute__((ext_vector_type(4)));
52a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar2 __attribute__((ext_vector_type(2)));
53a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar3 __attribute__((ext_vector_type(3)));
54a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef unsigned char uchar4 __attribute__((ext_vector_type(4)));
55d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short2 __attribute__((ext_vector_type(2)));
56d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short3 __attribute__((ext_vector_type(3)));
57d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int16_t short4 __attribute__((ext_vector_type(4)));
58d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort2 __attribute__((ext_vector_type(2)));
59d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort3 __attribute__((ext_vector_type(3)));
60d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint16_t ushort4 __attribute__((ext_vector_type(4)));
61a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int2 __attribute__((ext_vector_type(2)));
62a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int3 __attribute__((ext_vector_type(3)));
63a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef int32_t int4 __attribute__((ext_vector_type(4)));
64a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint2 __attribute__((ext_vector_type(2)));
65a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint3 __attribute__((ext_vector_type(3)));
66a1dd74c5ce4db0991020a4836be24fc35af4f301Rajeev Sharmatypedef uint32_t uint4 __attribute__((ext_vector_type(4)));
67d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long2 __attribute__((ext_vector_type(2)));
68d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long3 __attribute__((ext_vector_type(3)));
69d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef int64_t long4 __attribute__((ext_vector_type(4)));
70d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong2 __attribute__((ext_vector_type(2)));
71d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong3 __attribute__((ext_vector_type(3)));
72d8b8f8a16415496acc9844a89599ce7f377bd04dJason Samstypedef uint64_t ulong4 __attribute__((ext_vector_type(4)));
7387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
745261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint8_t uchar;
755261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint16_t ushort;
765261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint32_t uint;
770b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER
785261a5ea546ff358edd5aac7602fc4132434f481Jason Samstypedef uint64_t ulong;
790b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif
8087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
81127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#ifndef __LP64__
82d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#define OPAQUETYPE(t) \
83d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    typedef struct { const int* const p; } __attribute__((packed, aligned(4))) t;
84127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#else
85127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#define OPAQUETYPE(t) \
86127d51c1193f4055795da967d47a13bedd3cb951Miao Wang    typedef struct { const void* p; const void* r; const void* v1; const void* v2; } t;
87127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#endif
88d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
89d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_element)
90d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_type)
91d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_allocation)
92d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_sampler)
93d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_script)
94d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayOPAQUETYPE(rs_script_call)
952544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga Nainar
962544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_fragment);
972544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_store);
982544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_vertex);
992544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_program_raster);
1002544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_mesh);
1012544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga NainarOPAQUETYPE(rs_font);
1022544371624a3dd21ae2355e8fea870e29009332aPirama Arumuga Nainar
103d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#undef OPAQUETYPE
104d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
1057a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hinestypedef enum {
1067a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines    // Empty to avoid conflicting definitions with RsAllocationCubemapFace
1077a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines} rs_allocation_cubemap_face;
1087a01126d25c081f5b613eea80e5ff7e6c75c940fStephen Hines
1096b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainartypedef enum {
1106b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // Empty to avoid conflicting definitions with RsYuvFormat
1116b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar} rs_yuv_format;
1126b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
1136b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainartypedef enum {
1146b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // Empty to avoid conflicting definitions with RsAllocationMipmapControl
1156b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar} rs_allocation_mipmap_control;
1166b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
117174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef struct { unsigned int val; } rs_allocation_usage_type;
118174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
119d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murraytypedef struct {
120d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_sec;     ///< seconds
121d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_min;     ///< minutes
122d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_hour;    ///< hours
123d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_mday;    ///< day of the month
124d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_mon;     ///< month
125d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_year;    ///< year
126d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_wday;    ///< day of the week
127d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_yday;    ///< day of the year
128d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    int tm_isdst;   ///< daylight savings time
129d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray} rs_tm;
130d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
1317153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// Some RS functions are not threadsafe but can be called from an invoke
1327153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// function.  Instead of summarily marking scripts that call these functions as
1337153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// not-threadable we detect calls to them in the driver and sends a fatal error
1347153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar// message.
1357153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainarstatic bool failIfInKernel(Context *rsc, const char *funcName) {
1367153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
1377153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    RsdCpuReference *impl = (RsdCpuReference *) dc->mCpuRef;
1387153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
13910adb0c2029f112b5738228617d5645f6ecea0c5David Gross    if (impl->getInKernel()) {
1407153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        char buf[256];
141838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang        snprintf(buf, sizeof(buf), "Error: Call to unsupported function %s "
1427153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar                         "in kernel", funcName);
1437153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        rsc->setError(RS_ERROR_FATAL_DRIVER, buf);
1447153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return true;
1457153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    }
1467153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    return false;
1477153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar}
1487153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
14987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
150174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Allocation routines
15187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
15266d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic#if defined(__i386__) || (defined(__mips__) && __mips==32)
15366d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic// i386 and MIPS32 have different struct return passing to ARM; emulate with a pointer
154174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst Allocation * rsGetAllocation(const void *ptr) {
155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
156174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
157174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
158174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0};
159174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    alloc->callUpdateCacheObject(rsc, &obj);
160174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return (Allocation *)obj.p;
16174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk}
162174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
163174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst android::renderscript::rs_allocation rsGetAllocation(const void *ptr) {
164709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
165174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
166174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
1677153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
16866d9447a14af787b812b1014ec3eb242994dbc10Petar Jovanovic#ifndef __LP64__ // ARMv7
169174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0};
170174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else // AArch64/x86_64/MIPS64
171174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    android::renderscript::rs_allocation obj = {0, 0, 0, 0};
172174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
173174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    alloc->callUpdateCacheObject(rsc, &obj);
174174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return obj;
17574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk}
176174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
17774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
178174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationIoSend(::rs_allocation a) {
1791aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1807153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationIoSend"))
1817153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
182174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationIoSend(rsc, (Allocation *)a.p);
1831aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
1841aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
185174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationIoReceive(::rs_allocation a) {
1861aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1877153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationIoReceive"))
1887153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
189174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationIoReceive(rsc, (Allocation *)a.p);
1901aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
1911aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
192174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationCopy1DRange(
193174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation dstAlloc,
194174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstOff, uint32_t dstMip, uint32_t count,
195174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation srcAlloc,
196174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcOff, uint32_t srcMip) {
1971aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
1987153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationCopy1DRange"))
1997153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
200174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationCopy1DRange(rsc, (Allocation *)dstAlloc.p, dstOff, dstMip,
201174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                             count, (Allocation *)srcAlloc.p, srcOff, srcMip);
2021aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
2031aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
204174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsAllocationCopy2DRange(
205174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation dstAlloc,
206174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstXoff, uint32_t dstYoff,
207174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t dstMip, rs_allocation_cubemap_face dstFace,
208174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t width, uint32_t height,
209174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        ::rs_allocation srcAlloc,
210174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcXoff, uint32_t srcYoff,
211174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        uint32_t srcMip, rs_allocation_cubemap_face srcFace) {
2121aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
2137153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar    if (failIfInKernel(rsc, "rsAllocationCopy2DRange"))
2147153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar        return;
215174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationCopy2DRange(rsc, (Allocation *)dstAlloc.p,
2161aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray                             dstXoff, dstYoff, dstMip, dstFace,
217174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                             width, height, (Allocation *)srcAlloc.p,
2181aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray                             srcXoff, srcYoff, srcMip, srcFace);
2191aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray}
2201aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
2216b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarstatic android::renderscript::rs_element CreateElement(RsDataType dt,
2226b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                       RsDataKind dk,
2236b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                       bool isNormalized,
2246b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                       uint32_t vecSize) {
2256b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
2266b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2276b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // No need for validation here.  The rsCreateElement overload below is not
2286b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // exposed to the Script.  The Element-creation APIs call this function in a
2296b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // consistent manner and rsComponent.cpp asserts on any inconsistency.
2306b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Element *element = (Element *) rsrElementCreate(rsc, dt, dk, isNormalized,
2316b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                    vecSize);
2326b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_element obj = {};
2336b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (element == nullptr)
2346b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2356b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    element->callUpdateCacheObject(rsc, &obj);
2366b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
2376b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
2386b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2396b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarstatic android::renderscript::rs_type CreateType(RsElement element,
2406b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t dimX, uint32_t dimY,
2416b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t dimZ, bool mipmaps,
2426b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 bool faces,
2436b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t yuv_format) {
2446b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2456b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
2466b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_type obj = {};
2476b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2486b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (element == nullptr) {
2496b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Invalid element");
2506b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2516b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2526b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2536b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // validate yuv_format
2546b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    RsYuvFormat yuv = (RsYuvFormat) yuv_format;
2556b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (yuv != RS_YUV_NONE &&
2566b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_YV12 &&
2576b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_NV21 &&
2586b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_420_888) {
2596b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2606b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Invalid yuv_format %d\n", yuv_format);
2616b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2626b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2636b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2646b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // validate consistency of shape parameters
2656b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (dimZ > 0) {
2666b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (dimX < 1 || dimY < 1) {
2676b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: Both X and Y dimension required "
2686b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                  "when Z is present.");
2696b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2706b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2716b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (mipmaps) {
2726b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: mipmap control requires 2D types");
2736b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2746b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2756b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (faces) {
2766b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: Cube maps require 2D types");
2776b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2786b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2796b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2806b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (dimY > 0 && dimX < 1) {
2816b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: X dimension required when Y is "
2826b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar              "present.");
2836b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2846b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2856b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (mipmaps && dimY < 1) {
2866b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: mipmap control require 2D Types.");
2876b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2886b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2896b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (faces && dimY < 1) {
2906b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Cube maps require 2D Types.");
2916b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2926b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2936b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (yuv_format != RS_YUV_NONE) {
2946b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (dimZ != 0 || dimY == 0 || faces || mipmaps) {
2956b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: YUV only supports basic 2D.");
2966b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2976b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2986b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2996b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3006b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Type *type = (Type *) rsrTypeCreate(rsc, element, dimX, dimY, dimZ, mipmaps,
3016b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                        faces, yuv_format);
3026b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (type == nullptr)
3036b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3046b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    type->callUpdateCacheObject(rsc, &obj);
3056b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
3066b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3076b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3086b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarstatic android::renderscript::rs_allocation CreateAllocation(
3096b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        RsType type, RsAllocationMipmapControl mipmaps, uint32_t usages,
3106b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        void *ptr) {
3116b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3126b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
3136b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_allocation obj = {};
3146b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3156b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (type == nullptr) {
3166b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_allocation creation error: Invalid type");
3176b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3186b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
3196b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3206b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    uint32_t validUsages = RS_ALLOCATION_USAGE_SCRIPT | \
3216b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                           RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
3226b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (usages & ~validUsages) {
3236b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_allocation creation error: Invalid usage flag");
3246b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3256b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
3266b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3276b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Allocation *alloc = (Allocation *) rsrAllocationCreateTyped(rsc, type,
3286b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                                mipmaps, usages,
3296b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                                (uintptr_t) ptr);
3306b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (alloc == nullptr)
3316b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3326b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    alloc->callUpdateCacheObject(rsc, &obj);
3336b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3346b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
3356b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3366b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3376b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// Define rsCreateElement, rsCreateType and rsCreateAllocation entry points
3386b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// differently for 32-bit x86 and Mips.  The definitions for ARM32 and all
3396b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// 64-bit architectures is further below.
3406b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#if defined(__i386__) || (defined(__mips__) && __mips==32)
3416b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3426b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// The calling convention for the driver on 32-bit x86 and Mips returns
3436b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// rs_element etc. as a stack-return parameter.  The Script uses ARM32 calling
3446b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// conventions that return the structs in a register.  To match this convention,
3456b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// emulate the return value using a pointer.
3466b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarElement *rsCreateElement(int32_t dt, int32_t dk, bool isNormalized,
3476b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                         uint32_t vecSize) {
3486b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3496b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_element obj = CreateElement((RsDataType) dt,
3506b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          (RsDataKind) dk,
3516b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          isNormalized,
3526b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          vecSize);
3536b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Element *) obj.p;
3546b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3556b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3566b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarType *rsCreateType(::rs_element element, uint32_t dimX, uint32_t dimY,
3576b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                   uint32_t dimZ, bool mipmaps, bool faces,
3586b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                   rs_yuv_format yuv_format) {
3596b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_type obj = CreateType((RsElement) element.p, dimX,
3606b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                    dimY, dimZ, mipmaps, faces,
3616b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                    (RsYuvFormat) yuv_format);
3626b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Type *) obj.p;
3636b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3646b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3656b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarAllocation *rsCreateAllocation(::rs_type type,
3666b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                               rs_allocation_mipmap_control mipmaps,
3676b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                               uint32_t usages, void *ptr) {
3686b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3696b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_allocation obj;
3706b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    obj = CreateAllocation((RsType) type.p, (RsAllocationMipmapControl) mipmaps,
3716b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                           usages, ptr);
3726b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Allocation *) obj.p;
3736b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3746b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3756b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#else
3766b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_element rsCreateElement(int32_t dt, int32_t dk,
3776b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                  bool isNormalized,
3786b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                  uint32_t vecSize) {
3796b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3806b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateElement((RsDataType) dt, (RsDataKind) dk, isNormalized,
3816b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                         vecSize);
3826b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3836b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3846b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_type rsCreateType(::rs_element element, uint32_t dimX,
3856b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            uint32_t dimY, uint32_t dimZ,
3866b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            bool mipmaps, bool faces,
3876b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            rs_yuv_format yuv_format) {
3886b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateType((RsElement) element.p, dimX, dimY, dimZ, mipmaps, faces,
3896b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                      yuv_format);
3906b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3916b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3926b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_allocation rsCreateAllocation(
3936b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ::rs_type type, rs_allocation_mipmap_control mipmaps, uint32_t usages,
3946b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        void *ptr) {
3956b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3966b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateAllocation((RsType) type.p,
3976b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                            (RsAllocationMipmapControl) mipmaps,
3986b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                            usages, ptr);
3996b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
4006b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#endif
4016b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
402174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
403174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Object routines
404174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
405174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define IS_CLEAR_SET_OBJ(t) \
406174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    bool rsIsObject(t src) { \
407174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return src.p != nullptr; \
408174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
409174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void __attribute__((overloadable)) rsClearObject(t *dst) { \
410174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        Context *rsc = RsdCpuReference::getTlsContext(); \
411174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsrClearObject(rsc, reinterpret_cast<rs_object_base *>(dst)); \
412174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
413174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void __attribute__((overloadable)) rsSetObject(t *dst, t src) { \
414174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        Context *rsc = RsdCpuReference::getTlsContext(); \
415174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsrSetObject(rsc, reinterpret_cast<rs_object_base *>(dst), (ObjectBase*)src.p); \
416174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
4177153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
418174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_element)
419174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_type)
420174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_allocation)
421174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_sampler)
422174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_script)
423b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams
424174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_mesh)
425174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_fragment)
426174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_vertex)
427174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_raster)
428174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_store)
429174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_font)
4301aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
431174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef IS_CLEAR_SET_OBJ
43274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
43387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
434174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Element routines
43587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
436174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void * ElementAt(Allocation *a, RsDataType dt, uint32_t vecSize,
437174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        uint32_t x, uint32_t y, uint32_t z) {
438709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
439174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Type *t = a->getType();
440174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Element *e = t->getElement();
441a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
442174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char buf[256];
443174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (x && (x >= t->getLODDimX(0))) {
444838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang        snprintf(buf, sizeof(buf), "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
445174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
446174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
447174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
448a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
449174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (y && (y >= t->getLODDimY(0))) {
450838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang        snprintf(buf, sizeof(buf), "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
451174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
452174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
453174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
45487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
455174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (z && (z >= t->getLODDimZ(0))) {
456838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang        snprintf(buf, sizeof(buf), "Out range ElementAt Z %i of %i", z, t->getLODDimZ(0));
457174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
458174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
459174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
46087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
461174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (vecSize > 0) {
462174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (vecSize != e->getVectorSize()) {
463838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang            snprintf(buf, sizeof(buf), "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
464174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
465174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            return nullptr;
466174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        }
46787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
468174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (dt != e->getType()) {
469838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang            snprintf(buf, sizeof(buf), "Data type mismatch for ElementAt %i of %i", dt, e->getType());
470174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
471174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            return nullptr;
472174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        }
473174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
47487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
475174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
476174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t eSize = e->getSizeBytes();
477174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t stride = a->mHal.drvState.lod[0].stride;
478174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t dimY = a->mHal.drvState.lod[0].dimY;
479174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return &p[(x * eSize) + (y * stride) + (z * stride * dimY)];
48087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
48187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
482174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y, uint32_t z) {
483174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Type *t = const_cast<Allocation*>((Allocation*)a.p)->getType();
484174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Element *e = t->getElement();
485174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void *tmp = ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
486174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (tmp != nullptr)
487174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        memcpy(tmp, ptr, e->getSizeBytes());
48887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
48987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
490174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y) {
491174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsSetElementAt(a, ptr, x, y, 0);
49287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
49387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
494174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x) {
495174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsSetElementAt(a, ptr, x, 0, 0);
49687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
49787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
498174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
499174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
50087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
50187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
502174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y) {
503174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsGetElementAt(a, x, y ,0);
50487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
50587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
506174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x) {
507174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsGetElementAt(a, x, 0, 0);
50887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
50987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
510174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define ELEMENT_AT(T, DT, VS) \
511174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z) { \
512174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
513174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (r != nullptr) ((T *)r)[0] = *val; \
514174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
515174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
516174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y) { \
517174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, val, x, y, 0); \
518174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
519174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x) { \
520174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, val, x, 0, 0); \
521174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
522174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z) { \
523174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
524174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (r != nullptr) *val = ((T *)r)[0]; \
525174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
526174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
527174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y) { \
528174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, val, x, y, 0); \
529174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
530174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x) { \
531174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, val, x, 0, 0); \
532174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
53387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
534174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char, RS_TYPE_SIGNED_8, 1)
535174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char2, RS_TYPE_SIGNED_8, 2)
536174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char3, RS_TYPE_SIGNED_8, 3)
537174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char4, RS_TYPE_SIGNED_8, 4)
538174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar, RS_TYPE_UNSIGNED_8, 1)
539174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar2, RS_TYPE_UNSIGNED_8, 2)
540174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar3, RS_TYPE_UNSIGNED_8, 3)
541174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar4, RS_TYPE_UNSIGNED_8, 4)
542174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short, RS_TYPE_SIGNED_16, 1)
543174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short2, RS_TYPE_SIGNED_16, 2)
544174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short3, RS_TYPE_SIGNED_16, 3)
545174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short4, RS_TYPE_SIGNED_16, 4)
546174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort, RS_TYPE_UNSIGNED_16, 1)
547174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort2, RS_TYPE_UNSIGNED_16, 2)
548174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort3, RS_TYPE_UNSIGNED_16, 3)
549174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort4, RS_TYPE_UNSIGNED_16, 4)
550174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int, RS_TYPE_SIGNED_32, 1)
551174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int2, RS_TYPE_SIGNED_32, 2)
552174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int3, RS_TYPE_SIGNED_32, 3)
553174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int4, RS_TYPE_SIGNED_32, 4)
554174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint, RS_TYPE_UNSIGNED_32, 1)
555174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint2, RS_TYPE_UNSIGNED_32, 2)
556174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint3, RS_TYPE_UNSIGNED_32, 3)
557174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint4, RS_TYPE_UNSIGNED_32, 4)
558174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long, RS_TYPE_SIGNED_64, 1)
559174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long2, RS_TYPE_SIGNED_64, 2)
560174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long3, RS_TYPE_SIGNED_64, 3)
561174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long4, RS_TYPE_SIGNED_64, 4)
562174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong, RS_TYPE_UNSIGNED_64, 1)
563174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong2, RS_TYPE_UNSIGNED_64, 2)
564174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong3, RS_TYPE_UNSIGNED_64, 3)
565174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong4, RS_TYPE_UNSIGNED_64, 4)
56663bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half, RS_TYPE_FLOAT_16, 1)
56763bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half2, RS_TYPE_FLOAT_16, 2)
56863bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half3, RS_TYPE_FLOAT_16, 3)
56963bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half4, RS_TYPE_FLOAT_16, 4)
570174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float, RS_TYPE_FLOAT_32, 1)
571174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float2, RS_TYPE_FLOAT_32, 2)
572174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float3, RS_TYPE_FLOAT_32, 3)
573174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float4, RS_TYPE_FLOAT_32, 4)
574174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double, RS_TYPE_FLOAT_64, 1)
575174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double2, RS_TYPE_FLOAT_64, 2)
576174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double3, RS_TYPE_FLOAT_64, 3)
577174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double4, RS_TYPE_FLOAT_64, 4)
57887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
579174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef ELEMENT_AT
58087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
581174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
582174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen/*
583174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * We miss some symbols for rs{Get,Set}Element_long,ulong variants because 64
584174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * bit integer values are 'long' in RS-land but might be 'long long' in the
585174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * driver.  Define native_long* and native_ulong* types to be vectors of
586174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * 'long' as seen by the driver and define overloaded versions of
587174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * rsSetElementAt_* and rsGetElementAt_*.  This should get us the correct
588174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * mangled names in the driver.
589174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen */
59087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
591174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long2 __attribute__((ext_vector_type(2)));
592174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long3 __attribute__((ext_vector_type(3)));
593174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long4 __attribute__((ext_vector_type(4)));
594174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong2 __attribute__((ext_vector_type(2)));
595174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong3 __attribute__((ext_vector_type(3)));
596174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong4 __attribute__((ext_vector_type(4)));
59787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
598174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define ELEMENT_AT_OVERLOADS(T, U) \
599174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y, uint32_t z) { \
600174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, y, z); \
601174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
602174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y) { \
603174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, y, 0); \
604174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
605174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x) { \
606174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, 0, 0); \
607174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
608174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y, uint32_t z) { \
609174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, y, z); \
610174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
611174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y) { \
612174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, y, 0); \
613174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
614174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x) { \
615174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, 0, 0); \
616174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
61787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
618174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long2, native_long2)
619174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long3, native_long3)
620174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long4, native_long4)
621174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong, unsigned long)
622174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong2, native_ulong2)
623174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong3, native_ulong3)
624174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong4, native_ulong4)
625414a46166126da6864258bd25ff183f9a3c6261dStephen Hines
626174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// We also need variants of rs{Get,Set}ElementAt_long that take 'long long *' as
627174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// we might have this overloaded variant in old APKs.
628174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long, long long)
62987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
630174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef ELEMENT_AT_OVERLOADS
631174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
63287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
633174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
634174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// ForEach routines
635174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
636dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Nivoid rsForEachInternal(int slot,
63779b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                       rs_script_call *options,
638dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni                       int hasOutput,
63979b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                       int numInputs,
64079b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                       ::rs_allocation* allocs) {
64112398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni    Context *rsc = RsdCpuReference::getTlsContext();
64212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni    Script *s = const_cast<Script*>(RsdCpuReference::getTlsScript());
64379b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    if (numInputs > RS_KERNEL_MAX_ARGUMENTS) {
64479b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni        rsc->setError(RS_ERROR_BAD_SCRIPT,
64579b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                      "rsForEachInternal: too many inputs to a kernel.");
646dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        return;
647dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
64879b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    Allocation* inputs[RS_KERNEL_MAX_ARGUMENTS];
64979b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    for (int i = 0; i < numInputs; i++) {
65079b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni        inputs[i] = (Allocation*)allocs[i].p;
651dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
65279b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    Allocation* out = hasOutput ? (Allocation*)allocs[numInputs].p : nullptr;
65379b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    rsrForEach(rsc, s, slot, numInputs, numInputs > 0 ? inputs : nullptr, out,
65479b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni               nullptr, 0, (RsScriptCall*)options);
65512398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni}
65612398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni
657174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
658174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
659174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
660174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
661174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const rs_script_call *call) {
662709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
663dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p,
6649479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               (Allocation *)out.p, usr, 0, (RsScriptCall *)call);
66587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
66687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
667174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
668174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
669174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
670174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr) {
671709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
672dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
6739479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, 0, nullptr);
67487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
67587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
676174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
677174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
678174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out) {
679709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
680dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
6819479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               nullptr, 0, nullptr);
68287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
68387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
684174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// These functions are only supported in 32-bit.
685174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
686174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
687174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
688174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
689174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
690174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             uint32_t usrLen) {
691709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
692dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
6939479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, usrLen, nullptr);
69487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
69587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
696174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
697174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
698174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
699174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
700174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             uint32_t usrLen,
701174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const rs_script_call *call) {
702709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
703dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
7049479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, usrLen, (RsScriptCall *)call);
70587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
706174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
70787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
70887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
709174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Message routines
71087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
711174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClient(int cmdID) {
712709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
713174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClient(rsc, cmdID, (const void *)nullptr, 0);
71487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
71587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
716174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClient(int cmdID, const void *data, uint32_t len) {
717709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
718174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClient(rsc, cmdID, data, len);
71987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
72087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
721174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClientBlocking(int cmdID) {
722709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
723174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClientBlocking(rsc, cmdID, (const void *)nullptr, 0);
72487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
72587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
726174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClientBlocking(int cmdID, const void *data, uint32_t len) {
727709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
728174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClientBlocking(rsc, cmdID, data, len);
72987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
73087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
731174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
732174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Time routines
733174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
73487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
735174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// time_t is int in 32-bit RenderScript.  time_t is long in bionic.  rsTime and
736174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// rsLocaltime are set to explicitly take 'const int *' so we generate the
737174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// correct mangled names.
738174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
739174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint rsTime(int *timer) {
740174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
741174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentime_t rsTime(time_t * timer) {
742174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
743709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
744174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrTime(rsc, (time_t *)timer);
74587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
74687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
747174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
748174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenrs_tm* rsLocaltime(rs_tm* local, const int *timer) {
749174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
750174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenrs_tm* rsLocaltime(rs_tm* local, const time_t *timer) {
751174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
752709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
753174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return (rs_tm*)rsrLocalTime(rsc, (tm*)local, (time_t *)timer);
75487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
75587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
756174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint64_t rsUptimeMillis() {
757709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
758174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrUptimeMillis(rsc);
75987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
76087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
761174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint64_t rsUptimeNanos() {
762709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
763174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrUptimeNanos(rsc);
76487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
76587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
766174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenfloat rsGetDt() {
767709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
768174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
769174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetDt(rsc, sc);
77087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
77187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
77287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
773174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Graphics routines
77487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
775174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef RS_COMPATIBILITY_LIB
776174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
777174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x2, float y2, float z2, float u2, float v2,
778174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x3, float y3, float z3, float u3, float v3,
779174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x4, float y4, float z4, float u4, float v4) {
7801aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
781dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
782174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (!rsc->setupCheck()) {
783174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return;
784174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
78587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
786174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
787174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (!dc->gl.shaderCache->setup(rsc)) {
788174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return;
789174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
790444bd208b4f129bd8e4c0cce4cf6d709c8900891Yong Chen
791174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("Quad");
792174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
793174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
794174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
795174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
796127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
797174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
798174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
799127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
800174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdVertexArray::Attrib attribs[2];
801174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    attribs[0].set(GL_FLOAT, 3, 12, false, (size_t)vtx, "ATTRIB_position");
802174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    attribs[1].set(GL_FLOAT, 2, 8, false, (size_t)tex, "ATTRIB_texture0");
803240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray
804174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdVertexArray va(attribs, 2);
805174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    va.setup(rsc);
806240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray
807174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
808240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray}
809174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
810174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawQuad(float x1, float y1, float z1,
811174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x2, float y2, float z2,
812174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x3, float y3, float z3,
813174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x4, float y4, float z4) {
814174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuadTexCoords(x1, y1, z1, 0, 1,
815174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x2, y2, z2, 1, 1,
816174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x3, y3, z3, 1, 0,
817174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x4, y4, z4, 0, 0);
81847211dca5b2fc1aa5680ddebe5c4270c08c06e5dTim Murray}
819174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
820174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) {
82147211dca5b2fc1aa5680ddebe5c4270c08c06e5dTim Murray    Context *rsc = RsdCpuReference::getTlsContext();
82287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
823174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
824174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
825174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //rsc->setupCheck();
826174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
827174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //GLint crop[4] = {0, h, w, -h};
828dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
829174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float sh = rsc->getHeight();
830c500e74d0848b721bf01cf0ab344a6adb035c312Jason Sams
831174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x,   sh - y,     z,
832174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x+w, sh - y,     z,
833174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x+w, sh - (y+h), z,
834174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x,   sh - (y+h), z);
835174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsc->setProgramVertex((ProgramVertex *)tmp.get());
83687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
83787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
838174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsAllocationMarkDirty(::rs_allocation a) {
839447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
840174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
841447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
84287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
843174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a) {
844447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
845174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
846447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
847dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
848174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a,
849174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          unsigned int usage) {
850447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
851174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)usage);
852447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
85387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
85487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
855174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a,
856174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          rs_allocation_usage_type source) {
857709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
858174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)source.val);
85987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
860174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
861174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramFragment(::rs_program_fragment pf) {
862174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
863174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramFragment(rsc, (ProgramFragment *)pf.p);
8640b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
865174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
866174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramStore(::rs_program_store ps) {
867174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
868174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramStore(rsc, (ProgramStore *)ps.p);
8690b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
870174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
871174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramVertex(::rs_program_vertex pv) {
872174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
873174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramVertex(rsc, (ProgramVertex *)pv.p);
8740b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
875174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
876174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramRaster(::rs_program_raster pr) {
877174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
878174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramRaster(rsc, (ProgramRaster *)pr.p);
8790b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
880174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
881174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindSampler(::rs_program_fragment pf,
882174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    uint32_t slot, ::rs_sampler s) {
883174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
884174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindSampler(rsc, (ProgramFragment *)pf.p, slot, (Sampler *)s.p);
8850b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
886174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
887174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindTexture(::rs_program_fragment pf,
888174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    uint32_t slot, ::rs_allocation a) {
889174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
890174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindTexture(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
8910b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
892174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
893174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindConstant(::rs_program_fragment pf,
894174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                     uint32_t slot, ::rs_allocation a) {
895174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
896174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindConstant(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
8970b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
898174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
899174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindConstant(::rs_program_vertex pv,
900174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                     uint32_t slot, ::rs_allocation a) {
901174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
902174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindConstant(rsc, (ProgramVertex *)pv.p, slot, (Allocation *)a.p);
9030b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
904174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
905174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadProjectionMatrix(const rs_matrix4x4 *m) {
906174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
907174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadProjectionMatrix(rsc, (const rsc_Matrix *)m);
9080b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
909174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
910174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadModelMatrix(const rs_matrix4x4 *m) {
911174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
912174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadModelMatrix(rsc, (const rsc_Matrix *)m);
9130b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
914174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
915174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *m) {
916174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
917174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadTextureMatrix(rsc, (const rsc_Matrix *)m);
9180b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
919174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
920174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexGetProjectionMatrix(rs_matrix4x4 *m) {
921174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
922174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpGetProjectionMatrix(rsc, (rsc_Matrix *)m);
9230b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
924174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
925174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramFragmentConstantColor(::rs_program_fragment pf,
926174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                     float r, float g, float b, float a) {
927174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
928174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPfConstantColor(rsc, (ProgramFragment *)pf.p, r, g, b, a);
9290b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
930174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
931174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsgGetWidth(void) {
932174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
933174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetWidth(rsc);
9340b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
935174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
936174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsgGetHeight(void) {
937174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
938174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetHeight(rsc);
9390b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
940174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
941174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawRect(float x1, float y1, float x2, float y2, float z) {
942174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x1, y2, z,
943174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y2, z,
944174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y1, z,
945174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x1, y1, z);
9460b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
947174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
948174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawQuad(float x1, float y1, float z1,
949174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x2, float y2, float z2,
950174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x3, float y3, float z3,
951174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x4, float y4, float z4) {
952174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x1, y1, z1,
953174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y2, z2,
954174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x3, y3, z3,
955174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x4, y4, z4);
9560b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
957174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
958174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
959174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x2, float y2, float z2, float u2, float v2,
960174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x3, float y3, float z3, float u3, float v3,
961174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x4, float y4, float z4, float u4, float v4) {
962174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuadTexCoords(x1, y1, z1, u1, v1,
963174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x2, y2, z2, u2, v2,
964174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x3, y3, z3, u3, v3,
965174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x4, y4, z4, u4, v4);
9660b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
967174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
968174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawSpriteScreenspace(float x, float y, float z, float w, float h) {
969174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawSpriteScreenspace(x, y, z, w, h);
9700b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
971174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
972174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism) {
973174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
974174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMesh(rsc, (Mesh *)ism.p);
9750b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
976174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
977174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism, uint primitiveIndex) {
978174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
979174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMeshPrimitive(rsc, (Mesh *)ism.p, primitiveIndex);
9800b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
981174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
982174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism, uint primitiveIndex, uint start, uint len) {
983174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
984174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMeshPrimitiveRange(rsc, (Mesh *)ism.p, primitiveIndex, start, len);
9850b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
986174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
987174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid  rsgMeshComputeBoundingBox(::rs_mesh mesh,
988174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                float *minX, float *minY, float *minZ,
989174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                float *maxX, float *maxY, float *maxZ) {
990174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
991174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeshComputeBoundingBox(rsc, (Mesh *)mesh.p, minX, minY, minZ, maxX, maxY, maxZ);
9920b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
993174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
994174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearColor(float r, float g, float b, float a) {
995174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
996174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPrepareClear(rsc);
997174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLClearColor(rsc, r, g, b, a);
9980b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
999174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1000174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearDepth(float value) {
1001174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1002174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPrepareClear(rsc);
1003174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLClearDepth(rsc, value);
10040b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1005174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1006174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawText(const char *text, int x, int y) {
1007174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1008174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawText(rsc, text, x, y);
10090b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1010127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1011174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawText(::rs_allocation a, int x, int y) {
1012174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1013174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawTextAlloc(rsc, (Allocation *)a.p, x, y);
1014127d51c1193f4055795da967d47a13bedd3cb951Miao Wang}
1015127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1016174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgMeasureText(const char *text, int *left, int *right,
1017174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    int *top, int *bottom) {
1018174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1019174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeasureText(rsc, text, left, right, top, bottom);
1020127d51c1193f4055795da967d47a13bedd3cb951Miao Wang}
1021127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1022174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgMeasureText(::rs_allocation a, int *left, int *right,
1023174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    int *top, int *bottom) {
1024174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1025174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeasureTextAlloc(rsc, (Allocation *)a.p, left, right, top, bottom);
1026dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar}
1027dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
1028174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindFont(::rs_font font) {
1029174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1030174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFont(rsc, (Font *)font.p);
10310b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1032174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1033174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgFontColor(float r, float g, float b, float a) {
1034174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1035174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrFontColor(rsc, r, g, b, a);
10360b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1037174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1038174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindColorTarget(::rs_allocation a, uint slot) {
1039174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1040174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFrameBufferObjectColorTarget(rsc, (Allocation *)a.p, slot);
10410b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1042174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1043174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindDepthTarget(::rs_allocation a) {
1044174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1045174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFrameBufferObjectDepthTarget(rsc, (Allocation *)a.p);
10460b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1047174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1048174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearColorTarget(uint slot) {
1049174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1050174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectColorTarget(rsc, slot);
10510b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1052174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1053174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearDepthTarget(void) {
1054174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1055174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectDepthTarget(rsc);
10560b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1057174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1058174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearAllRenderTargets(void) {
1059174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1060174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectTargets(rsc);
10610b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1062127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1063174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid color(float r, float g, float b, float a) {
1064174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1065174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrColor(rsc, r, g, b, a);
10660b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10670b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1068174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgFinish(void) {
1069174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1070174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLFinish(rsc);
1071174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1072174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
10730b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1074174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
1075174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Debug routines
1076174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
10770b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f) {
1078174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
10790b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10800b575de8ed0b628d84d256f5846500b0385979bdTim Murray
10810b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2) {
1082174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, f1, f2);
10830b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10840b575de8ed0b628d84d256f5846500b0385979bdTim Murray
10850b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2, float f3) {
1086174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, f1, f2, f3);
10870b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10880b575de8ed0b628d84d256f5846500b0385979bdTim Murray
10890b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2, float f3, float f4) {
1090174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
10910b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10920b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1093174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float2 *f2) {
1094174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float2 f = *f2;
1095174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, f.x, f.y);
10960b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10970b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1098174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float3 *f3) {
1099174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float3 f = *f3;
1100174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, f.x, f.y, f.z);
11010b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11020b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1103174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float4 *f4) {
1104174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float4 f = *f4;
1105174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, f.x, f.y, f.z, f.w);
11060b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11070b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11080b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, double d) {
1109174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
11100b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11110b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1112174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double2 *d2) {
1113174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double2 d = *d2;
1114174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, d.x, d.y);
11156ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11166ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1117174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double3 *d3) {
1118174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double3 d = *d3;
1119174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, d.x, d.y, d.z);
11206ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11216ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1122174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double4 *d4) {
1123174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double4 d = *d4;
1124174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, d.x, d.y, d.z, d.w);
11256ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11266ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1127b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix4x4 *m) {
1128174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1129174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
1130174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
1131174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
1132174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
11330b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11340b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1135b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix3x3 *m) {
1136174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1137174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
1138174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
1139174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
11400b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11410b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1142b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix2x2 *m) {
1143174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1144174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f", s, f[0], f[2]);
1145174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f}",s, f[1], f[3]);
11460b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11470b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11480b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, char c) {
1149174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hhd  0x%hhx", s, c, (unsigned char)c);
11500b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11510b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1152174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char2 *c2) {
1153174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char2 c = *c2;
1154174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hhd, %hhd}  0x%hhx 0x%hhx", s, c.x, c.y, (unsigned char)c.x, (unsigned char)c.y);
11550b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11560b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1157174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char3 *c3) {
1158174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char3 c = *c3;
1159174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
11600b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11610b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1162174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char4 *c4) {
1163174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char4 c = *c4;
1164174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
11650b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11660b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11670b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, unsigned char c) {
1168174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hhu  0x%hhx", s, c, c);
11690b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11700b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1171174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar2 *c2) {
1172174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar2 c = *c2;
1173174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hhu, %hhu}  0x%hhx 0x%hhx", s, c.x, c.y, c.x, c.y);
11740b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11750b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1176174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar3 *c3) {
1177174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar3 c = *c3;
1178174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
11790b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11800b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1181174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar4 *c4) {
1182174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar4 c = *c4;
1183174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
11840b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11850b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11860b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, short c) {
1187174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hd  0x%hx", s, c, c);
11880b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11890b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1190174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short2 *c2) {
1191174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short2 c = *c2;
1192174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hd, %hd}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
11930b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11940b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1195174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short3 *c3) {
1196174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short3 c = *c3;
1197174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
11980b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11990b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1200174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short4 *c4) {
1201174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short4 c = *c4;
1202174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12030b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12040b575de8ed0b628d84d256f5846500b0385979bdTim Murray
12050b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, unsigned short c) {
1206174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hu  0x%hx", s, c, c);
1207174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1208174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1209174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort2 *c2) {
1210174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort2 c = *c2;
1211174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hu, %hu}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
12120b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12130b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1214174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort3 *c3) {
1215174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort3 c = *c3;
1216174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
1217174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1218174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1219174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort4 *c4) {
1220174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort4 c = *c4;
1221174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12220b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12230b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1224174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, int i) {
1225174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %d  0x%x", s, i, i);
12260b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12270b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1228174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int2 *i2) {
1229174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int2 i = *i2;
1230174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%d, %d}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
12310b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12320b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1233174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int3 *i3) {
1234174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int3 i = *i3;
1235174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12360b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12370b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1238174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int4 *i4) {
1239174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int4 i = *i4;
1240174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12410b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12420b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1243174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned int i) {
1244174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %u  0x%x", s, i, i);
12450b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12460b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1247174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint2 *i2) {
1248174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint2 i = *i2;
1249174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%u, %u}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
12500b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12510b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1252174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint3 *i3) {
1253174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint3 i = *i3;
1254174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12550b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12560b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1257174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint4 *i4) {
1258174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint4 i = *i4;
1259174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12600b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12610b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1262174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentemplate <typename T>
1263174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic inline long long LL(const T &x) {
1264174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return static_cast<long long>(x);
12650b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12660b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1267174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentemplate <typename T>
1268174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic inline unsigned long long LLu(const T &x) {
1269174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return static_cast<unsigned long long>(x);
12700b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12710b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1272174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, long l) {
1273174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %lld  0x%llx", s, LL(l), LL(l));
12740b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12750b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1276174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, long long ll) {
1277174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %lld  0x%llx", s, LL(ll), LL(ll));
12780b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12790b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1280b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long2 *c) {
1281174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long2 ll = *c;
1282174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
12830b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12840b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1285b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long3 *c) {
1286174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long3 ll = *c;
1287174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
12880b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12890b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1290b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long4 *c) {
1291174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long4 ll = *c;
1292174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
12930b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12940b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1295174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned long l) {
1296174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    unsigned long long ll = l;
1297174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %llu  0x%llx", s, ll, ll);
12980b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12990b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1300174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned long long ll) {
1301174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %llu  0x%llx", s, ll, ll);
13020b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13030b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1304b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong2 *c) {
1305174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong2 ll = *c;
1306174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
13070b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13080b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1309b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong3 *c) {
1310174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong3 ll = *c;
1311174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13120b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13130b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1314b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong4 *c) {
1315174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong4 ll = *c;
1316174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13170b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13180b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1319a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// FIXME: We need to export these function signatures for the compatibility
1320a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// library. The C++ name mangling that LLVM uses for ext_vector_type requires
1321a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// different versions for "long" vs. "long long". Note that the called
1322a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// functions are still using the appropriate 64-bit sizes.
1323127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1324127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#ifndef __LP64__
1325a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l2 __attribute__((ext_vector_type(2)));
1326a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l3 __attribute__((ext_vector_type(3)));
1327a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l4 __attribute__((ext_vector_type(4)));
1328a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul2 __attribute__((ext_vector_type(2)));
1329a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul3 __attribute__((ext_vector_type(3)));
1330a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul4 __attribute__((ext_vector_type(4)));
1331a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1332a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l2 *c) {
1333174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long2 ll = *(const long2 *)c;
1334174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
1335a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1336a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1337a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l3 *c) {
1338174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long3 ll = *(const long3 *)c;
1339174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1340a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1341a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1342a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l4 *c) {
1343174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long4 ll = *(const long4 *)c;
1344174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1345a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1346a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1347a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul2 *c) {
1348174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong2 ll = *(const ulong2 *)c;
1349174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
1350a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1351a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1352a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul3 *c) {
1353174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong3 ll = *(const ulong3 *)c;
1354174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1355a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1356a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1357a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul4 *c) {
1358174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong4 ll = *(const ulong4 *)c;
1359174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1360a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1361127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#endif
1362a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1363174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long2 ll) {
1364174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
13659f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13669f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1367174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long3 ll) {
1368174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13699f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13709f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1371174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long4 ll) {
1372174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13739f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13749f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1375174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong2 ll) {
1376174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
13779f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13789f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1379174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong3 ll) {
1380174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13819f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13829f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1383174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong4 ll) {
1384174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13859f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
13869f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
13870b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, const void *p) {
1388174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %p", s, p);
13890b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
139087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
1391709a0978ae141198018ca9769f8d96292a8928e6Jason Samsextern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name) {
1392174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// TODO: remove
139344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    return nullptr;
139487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
1395