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);
236b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni
237b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // Any new rsObject created from inside a script should have the usrRefCount
238b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // initialized to 0 and the sysRefCount initialized to 1.
239b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    element->incSysRef();
240b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    element->decUserRef();
241b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni
2426b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
2436b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
2446b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2456b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarstatic android::renderscript::rs_type CreateType(RsElement element,
2466b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t dimX, uint32_t dimY,
2476b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t dimZ, bool mipmaps,
2486b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 bool faces,
2496b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                 uint32_t yuv_format) {
2506b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2516b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
2526b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_type obj = {};
2536b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2546b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (element == nullptr) {
2556b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Invalid element");
2566b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2576b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2586b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2596b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // validate yuv_format
2606b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    RsYuvFormat yuv = (RsYuvFormat) yuv_format;
2616b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (yuv != RS_YUV_NONE &&
2626b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_YV12 &&
2636b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_NV21 &&
2646b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        yuv != RS_YUV_420_888) {
2656b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2666b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Invalid yuv_format %d\n", yuv_format);
2676b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2686b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2696b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
2706b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    // validate consistency of shape parameters
2716b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (dimZ > 0) {
2726b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (dimX < 1 || dimY < 1) {
2736b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: Both X and Y dimension required "
2746b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                  "when Z is present.");
2756b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2766b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2776b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (mipmaps) {
2786b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: mipmap control requires 2D types");
2796b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2806b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2816b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (faces) {
2826b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: Cube maps require 2D types");
2836b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
2846b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
2856b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2866b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (dimY > 0 && dimX < 1) {
2876b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: X dimension required when Y is "
2886b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar              "present.");
2896b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2906b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2916b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (mipmaps && dimY < 1) {
2926b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: mipmap control require 2D Types.");
2936b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2946b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2956b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (faces && dimY < 1) {
2966b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_type creation error: Cube maps require 2D Types.");
2976b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
2986b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
2996b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (yuv_format != RS_YUV_NONE) {
3006b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        if (dimZ != 0 || dimY == 0 || faces || mipmaps) {
3016b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            ALOGE("rs_type creation error: YUV only supports basic 2D.");
3026b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar            return obj;
3036b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        }
3046b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
3056b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3066b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Type *type = (Type *) rsrTypeCreate(rsc, element, dimX, dimY, dimZ, mipmaps,
3076b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                        faces, yuv_format);
3086b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (type == nullptr)
3096b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3106b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    type->callUpdateCacheObject(rsc, &obj);
311b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni
312b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // Any new rsObject created from inside a script should have the usrRefCount
313b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // initialized to 0 and the sysRefCount initialized to 1.
314b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    type->incSysRef();
315b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    type->decUserRef();
316b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni
3176b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
3186b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3196b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3206b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarstatic android::renderscript::rs_allocation CreateAllocation(
3216b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        RsType type, RsAllocationMipmapControl mipmaps, uint32_t usages,
3226b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        void *ptr) {
3236b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3246b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
3256b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_allocation obj = {};
3266b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3276b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (type == nullptr) {
3286b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_allocation creation error: Invalid type");
3296b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3306b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
3316b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3326b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    uint32_t validUsages = RS_ALLOCATION_USAGE_SCRIPT | \
3336b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                           RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
3346b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (usages & ~validUsages) {
3356b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ALOGE("rs_allocation creation error: Invalid usage flag");
3366b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3376b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    }
3386b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3396b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    Allocation *alloc = (Allocation *) rsrAllocationCreateTyped(rsc, type,
3406b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                                mipmaps, usages,
3416b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                                (uintptr_t) ptr);
3426b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    if (alloc == nullptr)
3436b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        return obj;
3446b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    alloc->callUpdateCacheObject(rsc, &obj);
3456b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
346b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // Any new rsObject created from inside a script should have the usrRefCount
347b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    // initialized to 0 and the sysRefCount initialized to 1.
348b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    alloc->incSysRef();
349b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni    alloc->decUserRef();
350b1f9eb6b37dace844ab927421c2dbfdff954e72dYang Ni
3516b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return obj;
3526b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3536b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3546b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// Define rsCreateElement, rsCreateType and rsCreateAllocation entry points
3556b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// differently for 32-bit x86 and Mips.  The definitions for ARM32 and all
3566b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// 64-bit architectures is further below.
3576b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#if defined(__i386__) || (defined(__mips__) && __mips==32)
3586b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3596b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// The calling convention for the driver on 32-bit x86 and Mips returns
3606b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// rs_element etc. as a stack-return parameter.  The Script uses ARM32 calling
3616b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// conventions that return the structs in a register.  To match this convention,
3626b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar// emulate the return value using a pointer.
3636b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarElement *rsCreateElement(int32_t dt, int32_t dk, bool isNormalized,
3646b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                         uint32_t vecSize) {
3656b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3666b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_element obj = CreateElement((RsDataType) dt,
3676b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          (RsDataKind) dk,
3686b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          isNormalized,
3696b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                          vecSize);
3706b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Element *) obj.p;
3716b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3726b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3736b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarType *rsCreateType(::rs_element element, uint32_t dimX, uint32_t dimY,
3746b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                   uint32_t dimZ, bool mipmaps, bool faces,
3756b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                   rs_yuv_format yuv_format) {
3766b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_type obj = CreateType((RsElement) element.p, dimX,
3776b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                    dimY, dimZ, mipmaps, faces,
3786b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                    (RsYuvFormat) yuv_format);
3796b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Type *) obj.p;
3806b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3816b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3826b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga NainarAllocation *rsCreateAllocation(::rs_type type,
3836b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                               rs_allocation_mipmap_control mipmaps,
3846b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                               uint32_t usages, void *ptr) {
3856b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3866b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    android::renderscript::rs_allocation obj;
3876b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    obj = CreateAllocation((RsType) type.p, (RsAllocationMipmapControl) mipmaps,
3886b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                           usages, ptr);
3896b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return (Allocation *) obj.p;
3906b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
3916b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3926b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#else
3936b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_element rsCreateElement(int32_t dt, int32_t dk,
3946b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                  bool isNormalized,
3956b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                                  uint32_t vecSize) {
3966b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
3976b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateElement((RsDataType) dt, (RsDataKind) dk, isNormalized,
3986b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                         vecSize);
3996b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
4006b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
4016b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_type rsCreateType(::rs_element element, uint32_t dimX,
4026b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            uint32_t dimY, uint32_t dimZ,
4036b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            bool mipmaps, bool faces,
4046b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                                            rs_yuv_format yuv_format) {
4056b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateType((RsElement) element.p, dimX, dimY, dimZ, mipmaps, faces,
4066b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                      yuv_format);
4076b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
4086b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
4096b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainarandroid::renderscript::rs_allocation rsCreateAllocation(
4106b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        ::rs_type type, rs_allocation_mipmap_control mipmaps, uint32_t usages,
4116b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar        void *ptr) {
4126b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
4136b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar    return CreateAllocation((RsType) type.p,
4146b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                            (RsAllocationMipmapControl) mipmaps,
4156b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar                            usages, ptr);
4166b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar}
4176b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar#endif
4186b387c1e466b507007f0b388da8b037362154e9aPirama Arumuga Nainar
419174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
420174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Object routines
421174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
422174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define IS_CLEAR_SET_OBJ(t) \
423174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    bool rsIsObject(t src) { \
424174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return src.p != nullptr; \
425174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
426174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void __attribute__((overloadable)) rsClearObject(t *dst) { \
4275e48002cc4a11e9ce63852a77488cfb9f6765c2bYang Ni        rsrClearObject(reinterpret_cast<rs_object_base *>(dst)); \
428174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
429174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void __attribute__((overloadable)) rsSetObject(t *dst, t src) { \
430174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        Context *rsc = RsdCpuReference::getTlsContext(); \
431174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsrSetObject(rsc, reinterpret_cast<rs_object_base *>(dst), (ObjectBase*)src.p); \
432174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
4337153e1c8232882ee2bd7b975791a21e1ed9732fdPirama Arumuga Nainar
434174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_element)
435174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_type)
436174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_allocation)
437174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_sampler)
438174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_script)
439b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams
440174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_mesh)
441174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_fragment)
442174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_vertex)
443174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_raster)
444174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_program_store)
445174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenIS_CLEAR_SET_OBJ(::rs_font)
4461aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
447174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef IS_CLEAR_SET_OBJ
44874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
44987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
450174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Element routines
45187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
452174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void * ElementAt(Allocation *a, RsDataType dt, uint32_t vecSize,
453174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        uint32_t x, uint32_t y, uint32_t z) {
454709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
455174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Type *t = a->getType();
456174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Element *e = t->getElement();
457a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
458174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char buf[256];
459174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (x && (x >= t->getLODDimX(0))) {
460838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang        snprintf(buf, sizeof(buf), "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
461174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
462174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
463174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
464a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
465174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (y && (y >= t->getLODDimY(0))) {
466838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang        snprintf(buf, sizeof(buf), "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
467174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
468174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
469174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
47087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
471174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (z && (z >= t->getLODDimZ(0))) {
472838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang        snprintf(buf, sizeof(buf), "Out range ElementAt Z %i of %i", z, t->getLODDimZ(0));
473174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
474174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return nullptr;
475174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
47687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
477174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (vecSize > 0) {
478174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (vecSize != e->getVectorSize()) {
479838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang            snprintf(buf, sizeof(buf), "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
480174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
481174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            return nullptr;
482174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        }
48387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
484174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (dt != e->getType()) {
485838c2d0dc0b8b07d4aa8de4360765738c6d2770eMiao Wang            snprintf(buf, sizeof(buf), "Data type mismatch for ElementAt %i of %i", dt, e->getType());
486174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
487174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen            return nullptr;
488174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        }
489174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
49087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
491174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
492174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t eSize = e->getSizeBytes();
493174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t stride = a->mHal.drvState.lod[0].stride;
494174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const uint32_t dimY = a->mHal.drvState.lod[0].dimY;
495174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return &p[(x * eSize) + (y * stride) + (z * stride * dimY)];
49687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
49787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
498174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y, uint32_t z) {
499174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Type *t = const_cast<Allocation*>((Allocation*)a.p)->getType();
500174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Element *e = t->getElement();
501174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void *tmp = ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
502174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (tmp != nullptr)
503174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        memcpy(tmp, ptr, e->getSizeBytes());
50487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
50587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
506174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y) {
507174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsSetElementAt(a, ptr, x, y, 0);
50887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
50987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
510174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x) {
511174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsSetElementAt(a, ptr, x, 0, 0);
51287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
51387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
514174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
515174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
51687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
51787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
518174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y) {
519174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsGetElementAt(a, x, y ,0);
52087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
52187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
522174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenconst void *rsGetElementAt(::rs_allocation a, uint32_t x) {
523174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsGetElementAt(a, x, 0, 0);
52487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
52587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
526174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define ELEMENT_AT(T, DT, VS) \
527174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z) { \
528174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
529174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (r != nullptr) ((T *)r)[0] = *val; \
530174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
531174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
532174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y) { \
533174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, val, x, y, 0); \
534174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
535174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x) { \
536174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, val, x, 0, 0); \
537174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
538174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z) { \
539174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
540174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        if (r != nullptr) *val = ((T *)r)[0]; \
541174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
542174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
543174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y) { \
544174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, val, x, y, 0); \
545174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
546174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x) { \
547174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, val, x, 0, 0); \
548174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
54987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
550174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char, RS_TYPE_SIGNED_8, 1)
551174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char2, RS_TYPE_SIGNED_8, 2)
552174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char3, RS_TYPE_SIGNED_8, 3)
553174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(char4, RS_TYPE_SIGNED_8, 4)
554174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar, RS_TYPE_UNSIGNED_8, 1)
555174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar2, RS_TYPE_UNSIGNED_8, 2)
556174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar3, RS_TYPE_UNSIGNED_8, 3)
557174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uchar4, RS_TYPE_UNSIGNED_8, 4)
558174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short, RS_TYPE_SIGNED_16, 1)
559174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short2, RS_TYPE_SIGNED_16, 2)
560174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short3, RS_TYPE_SIGNED_16, 3)
561174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(short4, RS_TYPE_SIGNED_16, 4)
562174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort, RS_TYPE_UNSIGNED_16, 1)
563174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort2, RS_TYPE_UNSIGNED_16, 2)
564174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort3, RS_TYPE_UNSIGNED_16, 3)
565174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ushort4, RS_TYPE_UNSIGNED_16, 4)
566174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int, RS_TYPE_SIGNED_32, 1)
567174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int2, RS_TYPE_SIGNED_32, 2)
568174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int3, RS_TYPE_SIGNED_32, 3)
569174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(int4, RS_TYPE_SIGNED_32, 4)
570174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint, RS_TYPE_UNSIGNED_32, 1)
571174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint2, RS_TYPE_UNSIGNED_32, 2)
572174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint3, RS_TYPE_UNSIGNED_32, 3)
573174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(uint4, RS_TYPE_UNSIGNED_32, 4)
574174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long, RS_TYPE_SIGNED_64, 1)
575174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long2, RS_TYPE_SIGNED_64, 2)
576174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long3, RS_TYPE_SIGNED_64, 3)
577174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(long4, RS_TYPE_SIGNED_64, 4)
578174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong, RS_TYPE_UNSIGNED_64, 1)
579174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong2, RS_TYPE_UNSIGNED_64, 2)
580174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong3, RS_TYPE_UNSIGNED_64, 3)
581174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(ulong4, RS_TYPE_UNSIGNED_64, 4)
58263bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half, RS_TYPE_FLOAT_16, 1)
58363bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half2, RS_TYPE_FLOAT_16, 2)
58463bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half3, RS_TYPE_FLOAT_16, 3)
58563bd646ed141f5938263574d6372b6b83710e68cPirama Arumuga NainarELEMENT_AT(half4, RS_TYPE_FLOAT_16, 4)
586174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float, RS_TYPE_FLOAT_32, 1)
587174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float2, RS_TYPE_FLOAT_32, 2)
588174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float3, RS_TYPE_FLOAT_32, 3)
589174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(float4, RS_TYPE_FLOAT_32, 4)
590174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double, RS_TYPE_FLOAT_64, 1)
591174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double2, RS_TYPE_FLOAT_64, 2)
592174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double3, RS_TYPE_FLOAT_64, 3)
593174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT(double4, RS_TYPE_FLOAT_64, 4)
59487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
595174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef ELEMENT_AT
59687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
597174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
598174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen/*
599174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * We miss some symbols for rs{Get,Set}Element_long,ulong variants because 64
600174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * bit integer values are 'long' in RS-land but might be 'long long' in the
601174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * driver.  Define native_long* and native_ulong* types to be vectors of
602174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * 'long' as seen by the driver and define overloaded versions of
603174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * rsSetElementAt_* and rsGetElementAt_*.  This should get us the correct
604174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen * mangled names in the driver.
605174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen */
60687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
607174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long2 __attribute__((ext_vector_type(2)));
608174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long3 __attribute__((ext_vector_type(3)));
609174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef long native_long4 __attribute__((ext_vector_type(4)));
610174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong2 __attribute__((ext_vector_type(2)));
611174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong3 __attribute__((ext_vector_type(3)));
612174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentypedef unsigned long native_ulong4 __attribute__((ext_vector_type(4)));
61387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
614174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#define ELEMENT_AT_OVERLOADS(T, U) \
615174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y, uint32_t z) { \
616174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, y, z); \
617174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
618174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y) { \
619174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, y, 0); \
620174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
621174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x) { \
622174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsSetElementAt_##T(a, (T *) val, x, 0, 0); \
623174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
624174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y, uint32_t z) { \
625174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, y, z); \
626174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
627174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y) { \
628174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, y, 0); \
629174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
630174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x) { \
631174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        rsGetElementAt_##T(a, (T *) val, x, 0, 0); \
632174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    } \
63387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
634174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long2, native_long2)
635174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long3, native_long3)
636174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long4, native_long4)
637174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong, unsigned long)
638174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong2, native_ulong2)
639174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong3, native_ulong3)
640174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(ulong4, native_ulong4)
641414a46166126da6864258bd25ff183f9a3c6261dStephen Hines
642174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// We also need variants of rs{Get,Set}ElementAt_long that take 'long long *' as
643174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// we might have this overloaded variant in old APKs.
644174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong ChenELEMENT_AT_OVERLOADS(long, long long)
64587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
646174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#undef ELEMENT_AT_OVERLOADS
647174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
64887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
649174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
650174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// ForEach routines
651174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
652dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Nivoid rsForEachInternal(int slot,
65379b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                       rs_script_call *options,
654dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni                       int hasOutput,
65579b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                       int numInputs,
65679b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                       ::rs_allocation* allocs) {
65712398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni    Context *rsc = RsdCpuReference::getTlsContext();
65812398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni    Script *s = const_cast<Script*>(RsdCpuReference::getTlsScript());
65979b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    if (numInputs > RS_KERNEL_MAX_ARGUMENTS) {
66079b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni        rsc->setError(RS_ERROR_BAD_SCRIPT,
66179b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni                      "rsForEachInternal: too many inputs to a kernel.");
662dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni        return;
663dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
66479b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    Allocation* inputs[RS_KERNEL_MAX_ARGUMENTS];
66579b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    for (int i = 0; i < numInputs; i++) {
66679b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni        inputs[i] = (Allocation*)allocs[i].p;
667dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    }
66879b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    Allocation* out = hasOutput ? (Allocation*)allocs[numInputs].p : nullptr;
66979b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni    rsrForEach(rsc, s, slot, numInputs, numInputs > 0 ? inputs : nullptr, out,
67079b75b7ba646cebabe83c68f0ff72a8018f6b3eaYang Ni               nullptr, 0, (RsScriptCall*)options);
67112398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni}
67212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni
673174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
674174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
675174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
676174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
677174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const rs_script_call *call) {
678709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
679dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p,
6809479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               (Allocation *)out.p, usr, 0, (RsScriptCall *)call);
68187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
68287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
683174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
684174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
685174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
686174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr) {
687709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
688dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
6899479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, 0, nullptr);
69087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
69187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
692174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
693174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
694174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out) {
695709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
696dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
6979479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               nullptr, 0, nullptr);
69887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
69987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
700174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// These functions are only supported in 32-bit.
701174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
702174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
703174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
704174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
705174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
706174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             uint32_t usrLen) {
707709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
708dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
7099479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, usrLen, nullptr);
71087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
71187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
712174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid __attribute__((overloadable)) rsForEach(::rs_script script,
713174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation in,
714174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             ::rs_allocation out,
715174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const void *usr,
716174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             uint32_t usrLen,
717174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                             const rs_script_call *call) {
718709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
719dda5cb5b59ae02ec03001ea12c374413714f3d38Yang Ni    rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
7209479e5bf0152ecff022cd374e2e80905f88b1a5dPirama Arumuga Nainar               usr, usrLen, (RsScriptCall *)call);
72187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
722174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
72387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
72487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
725174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Message routines
72687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
727174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClient(int cmdID) {
728709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
729174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClient(rsc, cmdID, (const void *)nullptr, 0);
73087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
73187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
732174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClient(int cmdID, const void *data, uint32_t len) {
733709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
734174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClient(rsc, cmdID, data, len);
73587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
73687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
737174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClientBlocking(int cmdID) {
738709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
739174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClientBlocking(rsc, cmdID, (const void *)nullptr, 0);
74087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
74187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
742174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsSendToClientBlocking(int cmdID, const void *data, uint32_t len) {
743709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
744174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrToClientBlocking(rsc, cmdID, data, len);
74587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
74687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
747174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
748174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Time routines
749174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
75087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
751174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// time_t is int in 32-bit RenderScript.  time_t is long in bionic.  rsTime and
752174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// rsLocaltime are set to explicitly take 'const int *' so we generate the
753174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// correct mangled names.
754174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
755174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint rsTime(int *timer) {
756174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
757174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentime_t rsTime(time_t * timer) {
758174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
759709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
760174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrTime(rsc, (time_t *)timer);
76187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
76287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
763174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef __LP64__
764174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenrs_tm* rsLocaltime(rs_tm* local, const int *timer) {
765174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#else
766174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenrs_tm* rsLocaltime(rs_tm* local, const time_t *timer) {
767174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
768709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
769174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return (rs_tm*)rsrLocalTime(rsc, (tm*)local, (time_t *)timer);
77087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
77187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
772174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint64_t rsUptimeMillis() {
773709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
774174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrUptimeMillis(rsc);
77587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
77687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
777174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenint64_t rsUptimeNanos() {
778709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
779174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrUptimeNanos(rsc);
78087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
78187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
782174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenfloat rsGetDt() {
783709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
784174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const Script *sc = RsdCpuReference::getTlsScript();
785174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetDt(rsc, sc);
78687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
78787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
78887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
789174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Graphics routines
79087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams//////////////////////////////////////////////////////////////////////////////
791174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#ifndef RS_COMPATIBILITY_LIB
792174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
793174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x2, float y2, float z2, float u2, float v2,
794174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x3, float y3, float z3, float u3, float v3,
795174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                 float x4, float y4, float z4, float u4, float v4) {
7961aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    Context *rsc = RsdCpuReference::getTlsContext();
797dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
798174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (!rsc->setupCheck()) {
799174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return;
800174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
80187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
802174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
803174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    if (!dc->gl.shaderCache->setup(rsc)) {
804174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen        return;
805174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    }
806444bd208b4f129bd8e4c0cce4cf6d709c8900891Yong Chen
807174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("Quad");
808174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
809174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
810174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
811174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
812127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
813174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
814174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
815127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
816174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdVertexArray::Attrib attribs[2];
817174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    attribs[0].set(GL_FLOAT, 3, 12, false, (size_t)vtx, "ATTRIB_position");
818174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    attribs[1].set(GL_FLOAT, 2, 8, false, (size_t)tex, "ATTRIB_texture0");
819240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray
820174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RsdVertexArray va(attribs, 2);
821174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    va.setup(rsc);
822240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray
823174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
824240a6c96eb94734a84eed53349fb0928d3ce6d19Tim Murray}
825174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
826174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawQuad(float x1, float y1, float z1,
827174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x2, float y2, float z2,
828174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x3, float y3, float z3,
829174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                        float x4, float y4, float z4) {
830174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuadTexCoords(x1, y1, z1, 0, 1,
831174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x2, y2, z2, 1, 1,
832174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x3, y3, z3, 1, 0,
833174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x4, y4, z4, 0, 0);
83447211dca5b2fc1aa5680ddebe5c4270c08c06e5dTim Murray}
835174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
836174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) {
83747211dca5b2fc1aa5680ddebe5c4270c08c06e5dTim Murray    Context *rsc = RsdCpuReference::getTlsContext();
83887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
839174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
840174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
841174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //rsc->setupCheck();
842174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
843174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    //GLint crop[4] = {0, h, w, -h};
844dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
845174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float sh = rsc->getHeight();
846c500e74d0848b721bf01cf0ab344a6adb035c312Jason Sams
847174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x,   sh - y,     z,
848174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x+w, sh - y,     z,
849174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x+w, sh - (y+h), z,
850174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x,   sh - (y+h), z);
851174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsc->setProgramVertex((ProgramVertex *)tmp.get());
85287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
85387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
854174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsAllocationMarkDirty(::rs_allocation a) {
855447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
856174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
857447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
85887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
859174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a) {
860447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
861174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
862447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
863dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
864174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a,
865174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          unsigned int usage) {
866447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar    Context *rsc = RsdCpuReference::getTlsContext();
867174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)usage);
868447e8362fc760b3d2789dbfe1eec33f1fc6b1c0ePirama Arumuga Nainar}
86987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
87087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
871174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgAllocationSyncAll(::rs_allocation a,
872174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          rs_allocation_usage_type source) {
873709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *rsc = RsdCpuReference::getTlsContext();
874174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)source.val);
87587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
876174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
877174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramFragment(::rs_program_fragment pf) {
878174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
879174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramFragment(rsc, (ProgramFragment *)pf.p);
8800b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
881174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
882174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramStore(::rs_program_store ps) {
883174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
884174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramStore(rsc, (ProgramStore *)ps.p);
8850b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
886174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
887174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramVertex(::rs_program_vertex pv) {
888174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
889174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramVertex(rsc, (ProgramVertex *)pv.p);
8900b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
891174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
892174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindProgramRaster(::rs_program_raster pr) {
893174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
894174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindProgramRaster(rsc, (ProgramRaster *)pr.p);
8950b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
896174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
897174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindSampler(::rs_program_fragment pf,
898174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    uint32_t slot, ::rs_sampler s) {
899174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
900174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindSampler(rsc, (ProgramFragment *)pf.p, slot, (Sampler *)s.p);
9010b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
902174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
903174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindTexture(::rs_program_fragment pf,
904174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    uint32_t slot, ::rs_allocation a) {
905174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
906174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindTexture(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
9070b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
908174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
909174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindConstant(::rs_program_fragment pf,
910174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                     uint32_t slot, ::rs_allocation a) {
911174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
912174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindConstant(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
9130b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
914174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
915174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindConstant(::rs_program_vertex pv,
916174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                     uint32_t slot, ::rs_allocation a) {
917174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
918174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindConstant(rsc, (ProgramVertex *)pv.p, slot, (Allocation *)a.p);
9190b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
920174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
921174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadProjectionMatrix(const rs_matrix4x4 *m) {
922174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
923174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadProjectionMatrix(rsc, (const rsc_Matrix *)m);
9240b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
925174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
926174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadModelMatrix(const rs_matrix4x4 *m) {
927174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
928174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadModelMatrix(rsc, (const rsc_Matrix *)m);
9290b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
930174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
931174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *m) {
932174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
933174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpLoadTextureMatrix(rsc, (const rsc_Matrix *)m);
9340b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
935174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
936174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramVertexGetProjectionMatrix(rs_matrix4x4 *m) {
937174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
938174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrVpGetProjectionMatrix(rsc, (rsc_Matrix *)m);
9390b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
940174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
941174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgProgramFragmentConstantColor(::rs_program_fragment pf,
942174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                     float r, float g, float b, float a) {
943174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
944174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPfConstantColor(rsc, (ProgramFragment *)pf.p, r, g, b, a);
9450b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
946174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
947174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsgGetWidth(void) {
948174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
949174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetWidth(rsc);
9500b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
951174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
952174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenuint32_t rsgGetHeight(void) {
953174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
954174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return rsrGetHeight(rsc);
9550b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
956174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
957174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawRect(float x1, float y1, float x2, float y2, float z) {
958174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x1, y2, z,
959174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y2, z,
960174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y1, z,
961174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x1, y1, z);
9620b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
963174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
964174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawQuad(float x1, float y1, float z1,
965174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x2, float y2, float z2,
966174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x3, float y3, float z3,
967174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                 float x4, float y4, float z4) {
968174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuad(x1, y1, z1,
969174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x2, y2, z2,
970174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x3, y3, z3,
971174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                x4, y4, z4);
9720b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
973174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
974174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
975174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x2, float y2, float z2, float u2, float v2,
976174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x3, float y3, float z3, float u3, float v3,
977174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                          float x4, float y4, float z4, float u4, float v4) {
978174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawQuadTexCoords(x1, y1, z1, u1, v1,
979174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x2, y2, z2, u2, v2,
980174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x3, y3, z3, u3, v3,
981174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                         x4, y4, z4, u4, v4);
9820b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
983174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
984174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawSpriteScreenspace(float x, float y, float z, float w, float h) {
985174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    SC_DrawSpriteScreenspace(x, y, z, w, h);
9860b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
987174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
988174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism) {
989174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
990174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMesh(rsc, (Mesh *)ism.p);
9910b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
992174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
993174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism, uint primitiveIndex) {
994174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
995174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMeshPrimitive(rsc, (Mesh *)ism.p, primitiveIndex);
9960b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
997174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
998174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawMesh(::rs_mesh ism, uint primitiveIndex, uint start, uint len) {
999174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1000174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawMeshPrimitiveRange(rsc, (Mesh *)ism.p, primitiveIndex, start, len);
10010b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1002174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1003174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid  rsgMeshComputeBoundingBox(::rs_mesh mesh,
1004174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                float *minX, float *minY, float *minZ,
1005174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                                float *maxX, float *maxY, float *maxZ) {
1006174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1007174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeshComputeBoundingBox(rsc, (Mesh *)mesh.p, minX, minY, minZ, maxX, maxY, maxZ);
10080b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1009174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1010174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearColor(float r, float g, float b, float a) {
1011174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1012174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPrepareClear(rsc);
1013174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLClearColor(rsc, r, g, b, a);
10140b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1015174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1016174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearDepth(float value) {
1017174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1018174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrPrepareClear(rsc);
1019174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLClearDepth(rsc, value);
10200b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1021174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1022174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawText(const char *text, int x, int y) {
1023174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1024174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawText(rsc, text, x, y);
10250b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1026127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1027174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgDrawText(::rs_allocation a, int x, int y) {
1028174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1029174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrDrawTextAlloc(rsc, (Allocation *)a.p, x, y);
1030127d51c1193f4055795da967d47a13bedd3cb951Miao Wang}
1031127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1032174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgMeasureText(const char *text, int *left, int *right,
1033174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    int *top, int *bottom) {
1034174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1035174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeasureText(rsc, text, left, right, top, bottom);
1036127d51c1193f4055795da967d47a13bedd3cb951Miao Wang}
1037127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1038174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgMeasureText(::rs_allocation a, int *left, int *right,
1039174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen                    int *top, int *bottom) {
1040174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1041174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrMeasureTextAlloc(rsc, (Allocation *)a.p, left, right, top, bottom);
1042dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar}
1043dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar
1044174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindFont(::rs_font font) {
1045174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1046174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFont(rsc, (Font *)font.p);
10470b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1048174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1049174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgFontColor(float r, float g, float b, float a) {
1050174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1051174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrFontColor(rsc, r, g, b, a);
10520b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1053174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1054174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindColorTarget(::rs_allocation a, uint slot) {
1055174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1056174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFrameBufferObjectColorTarget(rsc, (Allocation *)a.p, slot);
10570b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1058174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1059174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgBindDepthTarget(::rs_allocation a) {
1060174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1061174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrBindFrameBufferObjectDepthTarget(rsc, (Allocation *)a.p);
10620b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1063174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1064174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearColorTarget(uint slot) {
1065174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1066174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectColorTarget(rsc, slot);
10670b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1068174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1069174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearDepthTarget(void) {
1070174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1071174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectDepthTarget(rsc);
10720b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1073174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1074174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgClearAllRenderTargets(void) {
1075174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1076174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrClearFrameBufferObjectTargets(rsc);
10770b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1078127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1079174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid color(float r, float g, float b, float a) {
1080174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1081174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsrColor(rsc, r, g, b, a);
10820b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10830b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1084174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsgFinish(void) {
1085174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    Context *rsc = RsdCpuReference::getTlsContext();
1086174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    rsdGLFinish(rsc);
1087174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1088174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen#endif
10890b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1090174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
1091174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// Debug routines
1092174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen//////////////////////////////////////////////////////////////////////////////
10930b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f) {
1094174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
10950b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
10960b575de8ed0b628d84d256f5846500b0385979bdTim Murray
10970b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2) {
1098174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, f1, f2);
10990b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11000b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11010b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2, float f3) {
1102174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, f1, f2, f3);
11030b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11040b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11050b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, float f1, float f2, float f3, float f4) {
1106174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
11070b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11080b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1109174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float2 *f2) {
1110174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float2 f = *f2;
1111174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, f.x, f.y);
11120b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11130b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1114174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float3 *f3) {
1115174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float3 f = *f3;
1116174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, f.x, f.y, f.z);
11170b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11180b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1119174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const float4 *f4) {
1120174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float4 f = *f4;
1121174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, f.x, f.y, f.z, f.w);
11220b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11230b575de8ed0b628d84d256f5846500b0385979bdTim Murray
112492185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar// Accept a half value converted to float.  This eliminates the need in the
112592185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar// driver to properly support the half datatype (either by adding compiler flags
112692185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar// for half or link against compiler_rt).
112792185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainarvoid rsDebug(const char *s, float f, ushort us) {
112892185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar    ALOGD("%s {%f} {0x%hx}", s, f, us);
112992185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar}
113092185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar
113192185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainarvoid rsDebug(const char *s, const float2 *f2, const ushort2 *us2) {
113292185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar    float2 f = *f2;
113392185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar    ushort2 us = *us2;
113492185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar    ALOGD("%s {%f %f} {0x%hx 0x%hx}", s, f.x, f.y, us.x, us.y);
113592185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar}
113692185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar
113792185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainarvoid rsDebug(const char *s, const float3 *f3, const ushort3 *us3) {
113892185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar    float3 f = *f3;
113992185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar    ushort3 us = *us3;
114092185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar    ALOGD("%s {%f %f %f} {0x%hx 0x%hx 0x%hx}", s, f.x, f.y, f.z, us.x, us.y,
114192185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar          us.z);
114292185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar}
114392185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar
114492185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainarvoid rsDebug(const char *s, const float4 *f4, const ushort4 *us4) {
114592185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar    float4 f = *f4;
114692185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar    ushort4 us = *us4;
114792185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar    ALOGD("%s {%f %f %f %f} {0x%hx 0x%hx 0x%hx 0x%hx}", s, f.x, f.y, f.z, f.w,
114892185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar          us.x, us.y, us.z, us.w);
114992185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar}
115092185a7b5e7821ce5b584329a2483f224ca12e0fPirama Arumuga Nainar
11510b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, double d) {
1152174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
11530b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11540b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1155174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double2 *d2) {
1156174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double2 d = *d2;
1157174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f}", s, d.x, d.y);
11586ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11596ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1160174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double3 *d3) {
1161174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double3 d = *d3;
1162174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f}", s, d.x, d.y, d.z);
11636ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11646ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1165174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const double4 *d4) {
1166174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    double4 d = *d4;
1167174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f}", s, d.x, d.y, d.z, d.w);
11686ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet}
11696ba05171a84a7444df01b9f81a7233b17e1f120aJean-Luc Brouillet
1170b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix4x4 *m) {
1171174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1172174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
1173174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
1174174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
1175174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
11760b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11770b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1178b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix3x3 *m) {
1179174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1180174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
1181174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
1182174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
11830b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11840b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1185b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const rs_matrix2x2 *m) {
1186174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    float *f = (float *)m;
1187174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%f, %f", s, f[0], f[2]);
1188174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s  %f, %f}",s, f[1], f[3]);
11890b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11900b575de8ed0b628d84d256f5846500b0385979bdTim Murray
11910b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, char c) {
1192174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hhd  0x%hhx", s, c, (unsigned char)c);
11930b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11940b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1195174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char2 *c2) {
1196174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char2 c = *c2;
1197174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hhd, %hhd}  0x%hhx 0x%hhx", s, c.x, c.y, (unsigned char)c.x, (unsigned char)c.y);
11980b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
11990b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1200174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char3 *c3) {
1201174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char3 c = *c3;
1202174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12030b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12040b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1205174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const char4 *c4) {
1206174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    char4 c = *c4;
1207174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12080b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12090b575de8ed0b628d84d256f5846500b0385979bdTim Murray
12100b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, unsigned char c) {
1211174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hhu  0x%hhx", s, c, c);
12120b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12130b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1214174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar2 *c2) {
1215174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar2 c = *c2;
1216174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hhu, %hhu}  0x%hhx 0x%hhx", s, c.x, c.y, c.x, c.y);
12170b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12180b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1219174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar3 *c3) {
1220174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar3 c = *c3;
1221174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12220b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12230b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1224174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uchar4 *c4) {
1225174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uchar4 c = *c4;
1226174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12270b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12280b575de8ed0b628d84d256f5846500b0385979bdTim Murray
12290b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, short c) {
1230174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hd  0x%hx", s, c, c);
12310b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12320b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1233174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short2 *c2) {
1234174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short2 c = *c2;
1235174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hd, %hd}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
12360b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12370b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1238174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short3 *c3) {
1239174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short3 c = *c3;
1240174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12410b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12420b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1243174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const short4 *c4) {
1244174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    short4 c = *c4;
1245174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12460b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12470b575de8ed0b628d84d256f5846500b0385979bdTim Murray
12480b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, unsigned short c) {
1249174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %hu  0x%hx", s, c, c);
1250174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1251174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1252174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort2 *c2) {
1253174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort2 c = *c2;
1254174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%hu, %hu}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
12550b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12560b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1257174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort3 *c3) {
1258174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort3 c = *c3;
1259174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
1260174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen}
1261174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen
1262174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ushort4 *c4) {
1263174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ushort4 c = *c4;
1264174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12650b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12660b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1267174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, int i) {
1268174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %d  0x%x", s, i, i);
12690b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12700b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1271174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int2 *i2) {
1272174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int2 i = *i2;
1273174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%d, %d}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
12740b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12750b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1276174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int3 *i3) {
1277174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int3 i = *i3;
1278174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12790b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12800b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1281174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const int4 *i4) {
1282174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    int4 i = *i4;
1283174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12840b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12850b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1286174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned int i) {
1287174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %u  0x%x", s, i, i);
12880b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12890b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1290174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint2 *i2) {
1291174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint2 i = *i2;
1292174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%u, %u}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
12930b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12940b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1295174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint3 *i3) {
1296174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint3 i = *i3;
1297174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
12980b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
12990b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1300174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const uint4 *i4) {
1301174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    uint4 i = *i4;
1302174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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);
13030b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13040b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1305174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentemplate <typename T>
1306174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic inline long long LL(const T &x) {
1307174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return static_cast<long long>(x);
13080b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13090b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1310174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chentemplate <typename T>
1311174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenstatic inline unsigned long long LLu(const T &x) {
1312174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    return static_cast<unsigned long long>(x);
13130b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13140b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1315174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, long l) {
1316174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %lld  0x%llx", s, LL(l), LL(l));
13170b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13180b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1319174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, long long ll) {
1320174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %lld  0x%llx", s, LL(ll), LL(ll));
13210b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13220b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1323b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long2 *c) {
1324174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long2 ll = *c;
1325174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
13260b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13270b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1328b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long3 *c) {
1329174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long3 ll = *c;
1330174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13310b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13320b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1333b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const long4 *c) {
1334174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long4 ll = *c;
1335174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
13360b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13370b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1338174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned long l) {
1339174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    unsigned long long ll = l;
1340174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %llu  0x%llx", s, ll, ll);
13410b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13420b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1343174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, unsigned long long ll) {
1344174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %llu  0x%llx", s, ll, ll);
13450b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13460b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1347b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong2 *c) {
1348174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong2 ll = *c;
1349174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
13500b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13510b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1352b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong3 *c) {
1353174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong3 ll = *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));
13550b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13560b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1357b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hinesvoid rsDebug(const char *s, const ulong4 *c) {
1358174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong4 ll = *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));
13600b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
13610b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1362a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// FIXME: We need to export these function signatures for the compatibility
1363a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// library. The C++ name mangling that LLVM uses for ext_vector_type requires
1364a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// different versions for "long" vs. "long long". Note that the called
1365a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines// functions are still using the appropriate 64-bit sizes.
1366127d51c1193f4055795da967d47a13bedd3cb951Miao Wang
1367127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#ifndef __LP64__
1368a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l2 __attribute__((ext_vector_type(2)));
1369a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l3 __attribute__((ext_vector_type(3)));
1370a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef long l4 __attribute__((ext_vector_type(4)));
1371a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul2 __attribute__((ext_vector_type(2)));
1372a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul3 __attribute__((ext_vector_type(3)));
1373a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinestypedef unsigned long ul4 __attribute__((ext_vector_type(4)));
1374a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1375a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l2 *c) {
1376174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long2 ll = *(const long2 *)c;
1377174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
1378a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1379a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1380a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l3 *c) {
1381174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long3 ll = *(const long3 *)c;
1382174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1383a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1384a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1385a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const l4 *c) {
1386174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    long4 ll = *(const long4 *)c;
1387174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1388a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1389a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1390a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul2 *c) {
1391174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong2 ll = *(const ulong2 *)c;
1392174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
1393a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1394a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1395a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul3 *c) {
1396174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong3 ll = *(const ulong3 *)c;
1397174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu, %llu}  0x%llx 0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.x), LLu(ll.y), LLu(ll.z));
1398a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1399a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1400a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hinesvoid rsDebug(const char *s, const ul4 *c) {
1401174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ulong4 ll = *(const ulong4 *)c;
1402174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
1403a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines}
1404127d51c1193f4055795da967d47a13bedd3cb951Miao Wang#endif
1405a5d9bef6b53ba394087c7c7b9cc60d3aaa7f121bStephen Hines
1406174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long2 ll) {
1407174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
14089f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
14099f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1410174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long3 ll) {
1411174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
14129f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
14139f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1414174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const long4 ll) {
1415174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
14169f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
14179f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1418174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong2 ll) {
1419174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
14209f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
14219f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1422174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong3 ll) {
1423174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
14249f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
14259f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
1426174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chenvoid rsDebug(const char *s, const ulong4 ll) {
1427174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong 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));
14289f39aaf0145e9607200141e4716b73319055e6d7Tim Murray}
14299f39aaf0145e9607200141e4716b73319055e6d7Tim Murray
14300b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid rsDebug(const char *s, const void *p) {
1431174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen    ALOGD("%s %p", s, p);
14320b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
143387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
1434709a0978ae141198018ca9769f8d96292a8928e6Jason Samsextern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name) {
1435174ebc44658bffa27f97c85ae0265ad3cb48ae85Yong Chen// TODO: remove
143644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    return nullptr;
143787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
1438