xref: /aosp_15_r20/frameworks/rs/driver/rsdRuntimeStubs.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2011-2012 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #include "rsContext.h"
18*e1eccf28SAndroid Build Coastguard Worker #include "rsElement.h"
19*e1eccf28SAndroid Build Coastguard Worker #include "rsScriptC.h"
20*e1eccf28SAndroid Build Coastguard Worker #include "rsMatrix4x4.h"
21*e1eccf28SAndroid Build Coastguard Worker #include "rsMatrix3x3.h"
22*e1eccf28SAndroid Build Coastguard Worker #include "rsMatrix2x2.h"
23*e1eccf28SAndroid Build Coastguard Worker #include "rsRuntime.h"
24*e1eccf28SAndroid Build Coastguard Worker #include "rsType.h"
25*e1eccf28SAndroid Build Coastguard Worker 
26*e1eccf28SAndroid Build Coastguard Worker #include "rsdCore.h"
27*e1eccf28SAndroid Build Coastguard Worker #include "rsdBcc.h"
28*e1eccf28SAndroid Build Coastguard Worker 
29*e1eccf28SAndroid Build Coastguard Worker #include "rsdAllocation.h"
30*e1eccf28SAndroid Build Coastguard Worker #include "rsdShaderCache.h"
31*e1eccf28SAndroid Build Coastguard Worker #include "rsdVertexArray.h"
32*e1eccf28SAndroid Build Coastguard Worker 
33*e1eccf28SAndroid Build Coastguard Worker #include <time.h>
34*e1eccf28SAndroid Build Coastguard Worker 
35*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
36*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Font;
37*e1eccf28SAndroid Build Coastguard Worker #endif
38*e1eccf28SAndroid Build Coastguard Worker 
39*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Allocation;
40*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Context;
41*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Element;
42*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::RsdCpuReference;
43*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Mesh;
44*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::ObjectBase;
45*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::ObjectBaseRef;
46*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::ProgramFragment;
47*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::ProgramRaster;
48*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::ProgramStore;
49*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::ProgramVertex;
50*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Sampler;
51*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Script;
52*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Type;
53*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::rs_object_base;
54*e1eccf28SAndroid Build Coastguard Worker 
55*e1eccf28SAndroid Build Coastguard Worker typedef __fp16 half;
56*e1eccf28SAndroid Build Coastguard Worker typedef half half2 __attribute__((ext_vector_type(2)));
57*e1eccf28SAndroid Build Coastguard Worker typedef half half3 __attribute__((ext_vector_type(3)));
58*e1eccf28SAndroid Build Coastguard Worker typedef half half4 __attribute__((ext_vector_type(4)));
59*e1eccf28SAndroid Build Coastguard Worker 
60*e1eccf28SAndroid Build Coastguard Worker typedef float float2 __attribute__((ext_vector_type(2)));
61*e1eccf28SAndroid Build Coastguard Worker typedef float float3 __attribute__((ext_vector_type(3)));
62*e1eccf28SAndroid Build Coastguard Worker typedef float float4 __attribute__((ext_vector_type(4)));
63*e1eccf28SAndroid Build Coastguard Worker typedef double double2 __attribute__((ext_vector_type(2)));
64*e1eccf28SAndroid Build Coastguard Worker typedef double double3 __attribute__((ext_vector_type(3)));
65*e1eccf28SAndroid Build Coastguard Worker typedef double double4 __attribute__((ext_vector_type(4)));
66*e1eccf28SAndroid Build Coastguard Worker typedef char char2 __attribute__((ext_vector_type(2)));
67*e1eccf28SAndroid Build Coastguard Worker typedef char char3 __attribute__((ext_vector_type(3)));
68*e1eccf28SAndroid Build Coastguard Worker typedef char char4 __attribute__((ext_vector_type(4)));
69*e1eccf28SAndroid Build Coastguard Worker typedef unsigned char uchar2 __attribute__((ext_vector_type(2)));
70*e1eccf28SAndroid Build Coastguard Worker typedef unsigned char uchar3 __attribute__((ext_vector_type(3)));
71*e1eccf28SAndroid Build Coastguard Worker typedef unsigned char uchar4 __attribute__((ext_vector_type(4)));
72*e1eccf28SAndroid Build Coastguard Worker typedef int16_t short2 __attribute__((ext_vector_type(2)));
73*e1eccf28SAndroid Build Coastguard Worker typedef int16_t short3 __attribute__((ext_vector_type(3)));
74*e1eccf28SAndroid Build Coastguard Worker typedef int16_t short4 __attribute__((ext_vector_type(4)));
75*e1eccf28SAndroid Build Coastguard Worker typedef uint16_t ushort2 __attribute__((ext_vector_type(2)));
76*e1eccf28SAndroid Build Coastguard Worker typedef uint16_t ushort3 __attribute__((ext_vector_type(3)));
77*e1eccf28SAndroid Build Coastguard Worker typedef uint16_t ushort4 __attribute__((ext_vector_type(4)));
78*e1eccf28SAndroid Build Coastguard Worker typedef int32_t int2 __attribute__((ext_vector_type(2)));
79*e1eccf28SAndroid Build Coastguard Worker typedef int32_t int3 __attribute__((ext_vector_type(3)));
80*e1eccf28SAndroid Build Coastguard Worker typedef int32_t int4 __attribute__((ext_vector_type(4)));
81*e1eccf28SAndroid Build Coastguard Worker typedef uint32_t uint2 __attribute__((ext_vector_type(2)));
82*e1eccf28SAndroid Build Coastguard Worker typedef uint32_t uint3 __attribute__((ext_vector_type(3)));
83*e1eccf28SAndroid Build Coastguard Worker typedef uint32_t uint4 __attribute__((ext_vector_type(4)));
84*e1eccf28SAndroid Build Coastguard Worker typedef int64_t long2 __attribute__((ext_vector_type(2)));
85*e1eccf28SAndroid Build Coastguard Worker typedef int64_t long3 __attribute__((ext_vector_type(3)));
86*e1eccf28SAndroid Build Coastguard Worker typedef int64_t long4 __attribute__((ext_vector_type(4)));
87*e1eccf28SAndroid Build Coastguard Worker typedef uint64_t ulong2 __attribute__((ext_vector_type(2)));
88*e1eccf28SAndroid Build Coastguard Worker typedef uint64_t ulong3 __attribute__((ext_vector_type(3)));
89*e1eccf28SAndroid Build Coastguard Worker typedef uint64_t ulong4 __attribute__((ext_vector_type(4)));
90*e1eccf28SAndroid Build Coastguard Worker 
91*e1eccf28SAndroid Build Coastguard Worker typedef uint8_t uchar;
92*e1eccf28SAndroid Build Coastguard Worker typedef uint16_t ushort;
93*e1eccf28SAndroid Build Coastguard Worker typedef uint32_t uint;
94*e1eccf28SAndroid Build Coastguard Worker typedef uint64_t ulong;
95*e1eccf28SAndroid Build Coastguard Worker 
96*e1eccf28SAndroid Build Coastguard Worker // Add NOLINT to suppress wrong warnings from clang-tidy.
97*e1eccf28SAndroid Build Coastguard Worker #ifndef __LP64__
98*e1eccf28SAndroid Build Coastguard Worker #define OPAQUETYPE(t) \
99*e1eccf28SAndroid Build Coastguard Worker     typedef struct { const int* const p; } __attribute__((packed, aligned(4))) t; /*NOLINT*/
100*e1eccf28SAndroid Build Coastguard Worker #else
101*e1eccf28SAndroid Build Coastguard Worker #define OPAQUETYPE(t) \
102*e1eccf28SAndroid Build Coastguard Worker     typedef struct { const void* p; const void* unused1; const void* unused2; const void* unused3; } t; /*NOLINT*/
103*e1eccf28SAndroid Build Coastguard Worker #endif
104*e1eccf28SAndroid Build Coastguard Worker 
105*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_element)
106*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_type)
107*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_allocation)
108*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_sampler)
109*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_script)
110*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_script_call)
111*e1eccf28SAndroid Build Coastguard Worker 
112*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_program_fragment);
113*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_program_store);
114*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_program_vertex);
115*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_program_raster);
116*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_mesh);
117*e1eccf28SAndroid Build Coastguard Worker OPAQUETYPE(rs_font);
118*e1eccf28SAndroid Build Coastguard Worker 
119*e1eccf28SAndroid Build Coastguard Worker #undef OPAQUETYPE
120*e1eccf28SAndroid Build Coastguard Worker 
121*e1eccf28SAndroid Build Coastguard Worker typedef enum {
122*e1eccf28SAndroid Build Coastguard Worker     // Empty to avoid conflicting definitions with RsAllocationCubemapFace
123*e1eccf28SAndroid Build Coastguard Worker } rs_allocation_cubemap_face;
124*e1eccf28SAndroid Build Coastguard Worker 
125*e1eccf28SAndroid Build Coastguard Worker typedef enum {
126*e1eccf28SAndroid Build Coastguard Worker     // Empty to avoid conflicting definitions with RsYuvFormat
127*e1eccf28SAndroid Build Coastguard Worker } rs_yuv_format;
128*e1eccf28SAndroid Build Coastguard Worker 
129*e1eccf28SAndroid Build Coastguard Worker typedef enum {
130*e1eccf28SAndroid Build Coastguard Worker     // Empty to avoid conflicting definitions with RsAllocationMipmapControl
131*e1eccf28SAndroid Build Coastguard Worker } rs_allocation_mipmap_control;
132*e1eccf28SAndroid Build Coastguard Worker 
133*e1eccf28SAndroid Build Coastguard Worker typedef struct { unsigned int val; } rs_allocation_usage_type;
134*e1eccf28SAndroid Build Coastguard Worker 
135*e1eccf28SAndroid Build Coastguard Worker typedef struct {
136*e1eccf28SAndroid Build Coastguard Worker     int tm_sec;     ///< seconds
137*e1eccf28SAndroid Build Coastguard Worker     int tm_min;     ///< minutes
138*e1eccf28SAndroid Build Coastguard Worker     int tm_hour;    ///< hours
139*e1eccf28SAndroid Build Coastguard Worker     int tm_mday;    ///< day of the month
140*e1eccf28SAndroid Build Coastguard Worker     int tm_mon;     ///< month
141*e1eccf28SAndroid Build Coastguard Worker     int tm_year;    ///< year
142*e1eccf28SAndroid Build Coastguard Worker     int tm_wday;    ///< day of the week
143*e1eccf28SAndroid Build Coastguard Worker     int tm_yday;    ///< day of the year
144*e1eccf28SAndroid Build Coastguard Worker     int tm_isdst;   ///< daylight savings time
145*e1eccf28SAndroid Build Coastguard Worker } rs_tm;
146*e1eccf28SAndroid Build Coastguard Worker 
147*e1eccf28SAndroid Build Coastguard Worker // Some RS functions are not threadsafe but can be called from an invoke
148*e1eccf28SAndroid Build Coastguard Worker // function.  Instead of summarily marking scripts that call these functions as
149*e1eccf28SAndroid Build Coastguard Worker // not-threadable we detect calls to them in the driver and sends a fatal error
150*e1eccf28SAndroid Build Coastguard Worker // message.
failIfInKernel(Context * rsc,const char * funcName)151*e1eccf28SAndroid Build Coastguard Worker static bool failIfInKernel(Context *rsc, const char *funcName) {
152*e1eccf28SAndroid Build Coastguard Worker     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
153*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference *impl = (RsdCpuReference *) dc->mCpuRef;
154*e1eccf28SAndroid Build Coastguard Worker 
155*e1eccf28SAndroid Build Coastguard Worker     if (impl->getInKernel()) {
156*e1eccf28SAndroid Build Coastguard Worker         char buf[256];
157*e1eccf28SAndroid Build Coastguard Worker         snprintf(buf, sizeof(buf), "Error: Call to unsupported function %s "
158*e1eccf28SAndroid Build Coastguard Worker                          "in kernel", funcName);
159*e1eccf28SAndroid Build Coastguard Worker         rsc->setError(RS_ERROR_FATAL_DRIVER, buf);
160*e1eccf28SAndroid Build Coastguard Worker         return true;
161*e1eccf28SAndroid Build Coastguard Worker     }
162*e1eccf28SAndroid Build Coastguard Worker     return false;
163*e1eccf28SAndroid Build Coastguard Worker }
164*e1eccf28SAndroid Build Coastguard Worker 
165*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
166*e1eccf28SAndroid Build Coastguard Worker // Allocation routines
167*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
168*e1eccf28SAndroid Build Coastguard Worker #if defined(__i386__) || (defined(__mips__) && __mips==32)
169*e1eccf28SAndroid Build Coastguard Worker // i386 and MIPS32 have different struct return passing to ARM; emulate with a pointer
rsGetAllocation(const void * ptr)170*e1eccf28SAndroid Build Coastguard Worker const Allocation * rsGetAllocation(const void *ptr) {
171*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
172*e1eccf28SAndroid Build Coastguard Worker     const Script *sc = RsdCpuReference::getTlsScript();
173*e1eccf28SAndroid Build Coastguard Worker     Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
174*e1eccf28SAndroid Build Coastguard Worker     android::renderscript::rs_allocation obj = {0};
175*e1eccf28SAndroid Build Coastguard Worker     alloc->callUpdateCacheObject(rsc, &obj);
176*e1eccf28SAndroid Build Coastguard Worker     return (Allocation *)obj.p;
177*e1eccf28SAndroid Build Coastguard Worker }
178*e1eccf28SAndroid Build Coastguard Worker #else
rsGetAllocation(const void * ptr)179*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::rs_allocation rsGetAllocation(const void *ptr) {
180*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
181*e1eccf28SAndroid Build Coastguard Worker     const Script *sc = RsdCpuReference::getTlsScript();
182*e1eccf28SAndroid Build Coastguard Worker     Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
183*e1eccf28SAndroid Build Coastguard Worker 
184*e1eccf28SAndroid Build Coastguard Worker #ifndef __LP64__ // ARMv7
185*e1eccf28SAndroid Build Coastguard Worker     android::renderscript::rs_allocation obj = {0};
186*e1eccf28SAndroid Build Coastguard Worker #else // AArch64/x86_64/MIPS64
187*e1eccf28SAndroid Build Coastguard Worker     android::renderscript::rs_allocation obj = {0, 0, 0, 0};
188*e1eccf28SAndroid Build Coastguard Worker #endif
189*e1eccf28SAndroid Build Coastguard Worker     alloc->callUpdateCacheObject(rsc, &obj);
190*e1eccf28SAndroid Build Coastguard Worker     return obj;
191*e1eccf28SAndroid Build Coastguard Worker }
192*e1eccf28SAndroid Build Coastguard Worker #endif
193*e1eccf28SAndroid Build Coastguard Worker 
rsAllocationIoSend(::rs_allocation a)194*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsAllocationIoSend(::rs_allocation a) {
195*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
196*e1eccf28SAndroid Build Coastguard Worker     if (failIfInKernel(rsc, "rsAllocationIoSend"))
197*e1eccf28SAndroid Build Coastguard Worker         return;
198*e1eccf28SAndroid Build Coastguard Worker     rsrAllocationIoSend(rsc, (Allocation *)a.p);
199*e1eccf28SAndroid Build Coastguard Worker }
200*e1eccf28SAndroid Build Coastguard Worker 
rsAllocationIoReceive(::rs_allocation a)201*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsAllocationIoReceive(::rs_allocation a) {
202*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
203*e1eccf28SAndroid Build Coastguard Worker     if (failIfInKernel(rsc, "rsAllocationIoReceive"))
204*e1eccf28SAndroid Build Coastguard Worker         return;
205*e1eccf28SAndroid Build Coastguard Worker     rsrAllocationIoReceive(rsc, (Allocation *)a.p);
206*e1eccf28SAndroid Build Coastguard Worker }
207*e1eccf28SAndroid Build Coastguard Worker 
rsAllocationCopy1DRange(::rs_allocation dstAlloc,uint32_t dstOff,uint32_t dstMip,uint32_t count,::rs_allocation srcAlloc,uint32_t srcOff,uint32_t srcMip)208*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsAllocationCopy1DRange(
209*e1eccf28SAndroid Build Coastguard Worker         ::rs_allocation dstAlloc,
210*e1eccf28SAndroid Build Coastguard Worker         uint32_t dstOff, uint32_t dstMip, uint32_t count,
211*e1eccf28SAndroid Build Coastguard Worker         ::rs_allocation srcAlloc,
212*e1eccf28SAndroid Build Coastguard Worker         uint32_t srcOff, uint32_t srcMip) {
213*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
214*e1eccf28SAndroid Build Coastguard Worker     if (failIfInKernel(rsc, "rsAllocationCopy1DRange"))
215*e1eccf28SAndroid Build Coastguard Worker         return;
216*e1eccf28SAndroid Build Coastguard Worker     rsrAllocationCopy1DRange(rsc, (Allocation *)dstAlloc.p, dstOff, dstMip,
217*e1eccf28SAndroid Build Coastguard Worker                              count, (Allocation *)srcAlloc.p, srcOff, srcMip);
218*e1eccf28SAndroid Build Coastguard Worker }
219*e1eccf28SAndroid Build Coastguard Worker 
rsAllocationCopy2DRange(::rs_allocation dstAlloc,uint32_t dstXoff,uint32_t dstYoff,uint32_t dstMip,rs_allocation_cubemap_face dstFace,uint32_t width,uint32_t height,::rs_allocation srcAlloc,uint32_t srcXoff,uint32_t srcYoff,uint32_t srcMip,rs_allocation_cubemap_face srcFace)220*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsAllocationCopy2DRange(
221*e1eccf28SAndroid Build Coastguard Worker         ::rs_allocation dstAlloc,
222*e1eccf28SAndroid Build Coastguard Worker         uint32_t dstXoff, uint32_t dstYoff,
223*e1eccf28SAndroid Build Coastguard Worker         uint32_t dstMip, rs_allocation_cubemap_face dstFace,
224*e1eccf28SAndroid Build Coastguard Worker         uint32_t width, uint32_t height,
225*e1eccf28SAndroid Build Coastguard Worker         ::rs_allocation srcAlloc,
226*e1eccf28SAndroid Build Coastguard Worker         uint32_t srcXoff, uint32_t srcYoff,
227*e1eccf28SAndroid Build Coastguard Worker         uint32_t srcMip, rs_allocation_cubemap_face srcFace) {
228*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
229*e1eccf28SAndroid Build Coastguard Worker     if (failIfInKernel(rsc, "rsAllocationCopy2DRange"))
230*e1eccf28SAndroid Build Coastguard Worker         return;
231*e1eccf28SAndroid Build Coastguard Worker     rsrAllocationCopy2DRange(rsc, (Allocation *)dstAlloc.p,
232*e1eccf28SAndroid Build Coastguard Worker                              dstXoff, dstYoff, dstMip, dstFace,
233*e1eccf28SAndroid Build Coastguard Worker                              width, height, (Allocation *)srcAlloc.p,
234*e1eccf28SAndroid Build Coastguard Worker                              srcXoff, srcYoff, srcMip, srcFace);
235*e1eccf28SAndroid Build Coastguard Worker }
236*e1eccf28SAndroid Build Coastguard Worker 
CreateElement(RsDataType dt,RsDataKind dk,bool isNormalized,uint32_t vecSize)237*e1eccf28SAndroid Build Coastguard Worker static android::renderscript::rs_element CreateElement(RsDataType dt,
238*e1eccf28SAndroid Build Coastguard Worker                                                        RsDataKind dk,
239*e1eccf28SAndroid Build Coastguard Worker                                                        bool isNormalized,
240*e1eccf28SAndroid Build Coastguard Worker                                                        uint32_t vecSize) {
241*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
242*e1eccf28SAndroid Build Coastguard Worker 
243*e1eccf28SAndroid Build Coastguard Worker     // No need for validation here.  The rsCreateElement overload below is not
244*e1eccf28SAndroid Build Coastguard Worker     // exposed to the Script.  The Element-creation APIs call this function in a
245*e1eccf28SAndroid Build Coastguard Worker     // consistent manner and rsComponent.cpp asserts on any inconsistency.
246*e1eccf28SAndroid Build Coastguard Worker     Element *element = (Element *) rsrElementCreate(rsc, dt, dk, isNormalized,
247*e1eccf28SAndroid Build Coastguard Worker                                                     vecSize);
248*e1eccf28SAndroid Build Coastguard Worker     android::renderscript::rs_element obj = {};
249*e1eccf28SAndroid Build Coastguard Worker     if (element == nullptr)
250*e1eccf28SAndroid Build Coastguard Worker         return obj;
251*e1eccf28SAndroid Build Coastguard Worker     element->callUpdateCacheObject(rsc, &obj);
252*e1eccf28SAndroid Build Coastguard Worker 
253*e1eccf28SAndroid Build Coastguard Worker     // Any new rsObject created from inside a script should have the usrRefCount
254*e1eccf28SAndroid Build Coastguard Worker     // initialized to 0 and the sysRefCount initialized to 1.
255*e1eccf28SAndroid Build Coastguard Worker     element->incSysRef();
256*e1eccf28SAndroid Build Coastguard Worker     element->decUserRef();
257*e1eccf28SAndroid Build Coastguard Worker 
258*e1eccf28SAndroid Build Coastguard Worker     return obj;
259*e1eccf28SAndroid Build Coastguard Worker }
260*e1eccf28SAndroid Build Coastguard Worker 
CreateType(RsElement element,uint32_t dimX,uint32_t dimY,uint32_t dimZ,bool mipmaps,bool faces,uint32_t yuv_format)261*e1eccf28SAndroid Build Coastguard Worker static android::renderscript::rs_type CreateType(RsElement element,
262*e1eccf28SAndroid Build Coastguard Worker                                                  uint32_t dimX, uint32_t dimY,
263*e1eccf28SAndroid Build Coastguard Worker                                                  uint32_t dimZ, bool mipmaps,
264*e1eccf28SAndroid Build Coastguard Worker                                                  bool faces,
265*e1eccf28SAndroid Build Coastguard Worker                                                  uint32_t yuv_format) {
266*e1eccf28SAndroid Build Coastguard Worker 
267*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
268*e1eccf28SAndroid Build Coastguard Worker     android::renderscript::rs_type obj = {};
269*e1eccf28SAndroid Build Coastguard Worker 
270*e1eccf28SAndroid Build Coastguard Worker     if (element == nullptr) {
271*e1eccf28SAndroid Build Coastguard Worker         ALOGE("rs_type creation error: Invalid element");
272*e1eccf28SAndroid Build Coastguard Worker         return obj;
273*e1eccf28SAndroid Build Coastguard Worker     }
274*e1eccf28SAndroid Build Coastguard Worker 
275*e1eccf28SAndroid Build Coastguard Worker     // validate yuv_format
276*e1eccf28SAndroid Build Coastguard Worker     RsYuvFormat yuv = (RsYuvFormat) yuv_format;
277*e1eccf28SAndroid Build Coastguard Worker     if (yuv != RS_YUV_NONE &&
278*e1eccf28SAndroid Build Coastguard Worker         yuv != RS_YUV_YV12 &&
279*e1eccf28SAndroid Build Coastguard Worker         yuv != RS_YUV_NV21 &&
280*e1eccf28SAndroid Build Coastguard Worker         yuv != RS_YUV_420_888) {
281*e1eccf28SAndroid Build Coastguard Worker 
282*e1eccf28SAndroid Build Coastguard Worker         ALOGE("rs_type creation error: Invalid yuv_format %d\n", yuv_format);
283*e1eccf28SAndroid Build Coastguard Worker         return obj;
284*e1eccf28SAndroid Build Coastguard Worker     }
285*e1eccf28SAndroid Build Coastguard Worker 
286*e1eccf28SAndroid Build Coastguard Worker     // validate consistency of shape parameters
287*e1eccf28SAndroid Build Coastguard Worker     if (dimZ > 0) {
288*e1eccf28SAndroid Build Coastguard Worker         if (dimX < 1 || dimY < 1) {
289*e1eccf28SAndroid Build Coastguard Worker             ALOGE("rs_type creation error: Both X and Y dimension required "
290*e1eccf28SAndroid Build Coastguard Worker                   "when Z is present.");
291*e1eccf28SAndroid Build Coastguard Worker             return obj;
292*e1eccf28SAndroid Build Coastguard Worker         }
293*e1eccf28SAndroid Build Coastguard Worker         if (mipmaps) {
294*e1eccf28SAndroid Build Coastguard Worker             ALOGE("rs_type creation error: mipmap control requires 2D types");
295*e1eccf28SAndroid Build Coastguard Worker             return obj;
296*e1eccf28SAndroid Build Coastguard Worker         }
297*e1eccf28SAndroid Build Coastguard Worker         if (faces) {
298*e1eccf28SAndroid Build Coastguard Worker             ALOGE("rs_type creation error: Cube maps require 2D types");
299*e1eccf28SAndroid Build Coastguard Worker             return obj;
300*e1eccf28SAndroid Build Coastguard Worker         }
301*e1eccf28SAndroid Build Coastguard Worker     }
302*e1eccf28SAndroid Build Coastguard Worker     if (dimY > 0 && dimX < 1) {
303*e1eccf28SAndroid Build Coastguard Worker         ALOGE("rs_type creation error: X dimension required when Y is "
304*e1eccf28SAndroid Build Coastguard Worker               "present.");
305*e1eccf28SAndroid Build Coastguard Worker         return obj;
306*e1eccf28SAndroid Build Coastguard Worker     }
307*e1eccf28SAndroid Build Coastguard Worker     if (mipmaps && dimY < 1) {
308*e1eccf28SAndroid Build Coastguard Worker         ALOGE("rs_type creation error: mipmap control require 2D Types.");
309*e1eccf28SAndroid Build Coastguard Worker         return obj;
310*e1eccf28SAndroid Build Coastguard Worker     }
311*e1eccf28SAndroid Build Coastguard Worker     if (faces && dimY < 1) {
312*e1eccf28SAndroid Build Coastguard Worker         ALOGE("rs_type creation error: Cube maps require 2D Types.");
313*e1eccf28SAndroid Build Coastguard Worker         return obj;
314*e1eccf28SAndroid Build Coastguard Worker     }
315*e1eccf28SAndroid Build Coastguard Worker     if (yuv_format != RS_YUV_NONE) {
316*e1eccf28SAndroid Build Coastguard Worker         if (dimZ != 0 || dimY == 0 || faces || mipmaps) {
317*e1eccf28SAndroid Build Coastguard Worker             ALOGE("rs_type creation error: YUV only supports basic 2D.");
318*e1eccf28SAndroid Build Coastguard Worker             return obj;
319*e1eccf28SAndroid Build Coastguard Worker         }
320*e1eccf28SAndroid Build Coastguard Worker     }
321*e1eccf28SAndroid Build Coastguard Worker 
322*e1eccf28SAndroid Build Coastguard Worker     Type *type = (Type *) rsrTypeCreate(rsc, element, dimX, dimY, dimZ, mipmaps,
323*e1eccf28SAndroid Build Coastguard Worker                                         faces, yuv_format);
324*e1eccf28SAndroid Build Coastguard Worker     if (type == nullptr)
325*e1eccf28SAndroid Build Coastguard Worker         return obj;
326*e1eccf28SAndroid Build Coastguard Worker     type->callUpdateCacheObject(rsc, &obj);
327*e1eccf28SAndroid Build Coastguard Worker 
328*e1eccf28SAndroid Build Coastguard Worker     // Any new rsObject created from inside a script should have the usrRefCount
329*e1eccf28SAndroid Build Coastguard Worker     // initialized to 0 and the sysRefCount initialized to 1.
330*e1eccf28SAndroid Build Coastguard Worker     type->incSysRef();
331*e1eccf28SAndroid Build Coastguard Worker     type->decUserRef();
332*e1eccf28SAndroid Build Coastguard Worker 
333*e1eccf28SAndroid Build Coastguard Worker     return obj;
334*e1eccf28SAndroid Build Coastguard Worker }
335*e1eccf28SAndroid Build Coastguard Worker 
CreateAllocation(RsType type,RsAllocationMipmapControl mipmaps,uint32_t usages,void * ptr)336*e1eccf28SAndroid Build Coastguard Worker static android::renderscript::rs_allocation CreateAllocation(
337*e1eccf28SAndroid Build Coastguard Worker         RsType type, RsAllocationMipmapControl mipmaps, uint32_t usages,
338*e1eccf28SAndroid Build Coastguard Worker         void *ptr) {
339*e1eccf28SAndroid Build Coastguard Worker 
340*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
341*e1eccf28SAndroid Build Coastguard Worker     android::renderscript::rs_allocation obj = {};
342*e1eccf28SAndroid Build Coastguard Worker 
343*e1eccf28SAndroid Build Coastguard Worker     if (type == nullptr) {
344*e1eccf28SAndroid Build Coastguard Worker         ALOGE("rs_allocation creation error: Invalid type");
345*e1eccf28SAndroid Build Coastguard Worker         return obj;
346*e1eccf28SAndroid Build Coastguard Worker     }
347*e1eccf28SAndroid Build Coastguard Worker 
348*e1eccf28SAndroid Build Coastguard Worker     uint32_t validUsages = RS_ALLOCATION_USAGE_SCRIPT | \
349*e1eccf28SAndroid Build Coastguard Worker                            RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
350*e1eccf28SAndroid Build Coastguard Worker     if (usages & ~validUsages) {
351*e1eccf28SAndroid Build Coastguard Worker         ALOGE("rs_allocation creation error: Invalid usage flag");
352*e1eccf28SAndroid Build Coastguard Worker         return obj;
353*e1eccf28SAndroid Build Coastguard Worker     }
354*e1eccf28SAndroid Build Coastguard Worker 
355*e1eccf28SAndroid Build Coastguard Worker     Allocation *alloc = (Allocation *) rsrAllocationCreateTyped(rsc, type,
356*e1eccf28SAndroid Build Coastguard Worker                                                                 mipmaps, usages,
357*e1eccf28SAndroid Build Coastguard Worker                                                                 (uintptr_t) ptr);
358*e1eccf28SAndroid Build Coastguard Worker     if (alloc == nullptr)
359*e1eccf28SAndroid Build Coastguard Worker         return obj;
360*e1eccf28SAndroid Build Coastguard Worker     alloc->callUpdateCacheObject(rsc, &obj);
361*e1eccf28SAndroid Build Coastguard Worker 
362*e1eccf28SAndroid Build Coastguard Worker     // Any new rsObject created from inside a script should have the usrRefCount
363*e1eccf28SAndroid Build Coastguard Worker     // initialized to 0 and the sysRefCount initialized to 1.
364*e1eccf28SAndroid Build Coastguard Worker     alloc->incSysRef();
365*e1eccf28SAndroid Build Coastguard Worker     alloc->decUserRef();
366*e1eccf28SAndroid Build Coastguard Worker 
367*e1eccf28SAndroid Build Coastguard Worker     return obj;
368*e1eccf28SAndroid Build Coastguard Worker }
369*e1eccf28SAndroid Build Coastguard Worker 
370*e1eccf28SAndroid Build Coastguard Worker // Define rsCreateElement, rsCreateType and rsCreateAllocation entry points
371*e1eccf28SAndroid Build Coastguard Worker // differently for 32-bit x86 and Mips.  The definitions for ARM32 and all
372*e1eccf28SAndroid Build Coastguard Worker // 64-bit architectures is further below.
373*e1eccf28SAndroid Build Coastguard Worker #if defined(__i386__) || (defined(__mips__) && __mips==32)
374*e1eccf28SAndroid Build Coastguard Worker 
375*e1eccf28SAndroid Build Coastguard Worker // The calling convention for the driver on 32-bit x86 and Mips returns
376*e1eccf28SAndroid Build Coastguard Worker // rs_element etc. as a stack-return parameter.  The Script uses ARM32 calling
377*e1eccf28SAndroid Build Coastguard Worker // conventions that return the structs in a register.  To match this convention,
378*e1eccf28SAndroid Build Coastguard Worker // emulate the return value using a pointer.
rsCreateElement(int32_t dt,int32_t dk,bool isNormalized,uint32_t vecSize)379*e1eccf28SAndroid Build Coastguard Worker Element *rsCreateElement(int32_t dt, int32_t dk, bool isNormalized,
380*e1eccf28SAndroid Build Coastguard Worker                          uint32_t vecSize) {
381*e1eccf28SAndroid Build Coastguard Worker 
382*e1eccf28SAndroid Build Coastguard Worker     android::renderscript::rs_element obj = CreateElement((RsDataType) dt,
383*e1eccf28SAndroid Build Coastguard Worker                                                           (RsDataKind) dk,
384*e1eccf28SAndroid Build Coastguard Worker                                                           isNormalized,
385*e1eccf28SAndroid Build Coastguard Worker                                                           vecSize);
386*e1eccf28SAndroid Build Coastguard Worker     return (Element *) obj.p;
387*e1eccf28SAndroid Build Coastguard Worker }
388*e1eccf28SAndroid Build Coastguard Worker 
rsCreateType(::rs_element element,uint32_t dimX,uint32_t dimY,uint32_t dimZ,bool mipmaps,bool faces,rs_yuv_format yuv_format)389*e1eccf28SAndroid Build Coastguard Worker Type *rsCreateType(::rs_element element, uint32_t dimX, uint32_t dimY,
390*e1eccf28SAndroid Build Coastguard Worker                    uint32_t dimZ, bool mipmaps, bool faces,
391*e1eccf28SAndroid Build Coastguard Worker                    rs_yuv_format yuv_format) {
392*e1eccf28SAndroid Build Coastguard Worker     android::renderscript::rs_type obj = CreateType((RsElement) element.p, dimX,
393*e1eccf28SAndroid Build Coastguard Worker                                                     dimY, dimZ, mipmaps, faces,
394*e1eccf28SAndroid Build Coastguard Worker                                                     (RsYuvFormat) yuv_format);
395*e1eccf28SAndroid Build Coastguard Worker     return (Type *) obj.p;
396*e1eccf28SAndroid Build Coastguard Worker }
397*e1eccf28SAndroid Build Coastguard Worker 
rsCreateAllocation(::rs_type type,rs_allocation_mipmap_control mipmaps,uint32_t usages,void * ptr)398*e1eccf28SAndroid Build Coastguard Worker Allocation *rsCreateAllocation(::rs_type type,
399*e1eccf28SAndroid Build Coastguard Worker                                rs_allocation_mipmap_control mipmaps,
400*e1eccf28SAndroid Build Coastguard Worker                                uint32_t usages, void *ptr) {
401*e1eccf28SAndroid Build Coastguard Worker 
402*e1eccf28SAndroid Build Coastguard Worker     android::renderscript::rs_allocation obj;
403*e1eccf28SAndroid Build Coastguard Worker     obj = CreateAllocation((RsType) type.p, (RsAllocationMipmapControl) mipmaps,
404*e1eccf28SAndroid Build Coastguard Worker                            usages, ptr);
405*e1eccf28SAndroid Build Coastguard Worker     return (Allocation *) obj.p;
406*e1eccf28SAndroid Build Coastguard Worker }
407*e1eccf28SAndroid Build Coastguard Worker 
408*e1eccf28SAndroid Build Coastguard Worker #else
rsCreateElement(int32_t dt,int32_t dk,bool isNormalized,uint32_t vecSize)409*e1eccf28SAndroid Build Coastguard Worker android::renderscript::rs_element rsCreateElement(int32_t dt, int32_t dk,
410*e1eccf28SAndroid Build Coastguard Worker                                                   bool isNormalized,
411*e1eccf28SAndroid Build Coastguard Worker                                                   uint32_t vecSize) {
412*e1eccf28SAndroid Build Coastguard Worker 
413*e1eccf28SAndroid Build Coastguard Worker     return CreateElement((RsDataType) dt, (RsDataKind) dk, isNormalized,
414*e1eccf28SAndroid Build Coastguard Worker                          vecSize);
415*e1eccf28SAndroid Build Coastguard Worker }
416*e1eccf28SAndroid Build Coastguard Worker 
rsCreateType(::rs_element element,uint32_t dimX,uint32_t dimY,uint32_t dimZ,bool mipmaps,bool faces,rs_yuv_format yuv_format)417*e1eccf28SAndroid Build Coastguard Worker android::renderscript::rs_type rsCreateType(::rs_element element, uint32_t dimX,
418*e1eccf28SAndroid Build Coastguard Worker                                             uint32_t dimY, uint32_t dimZ,
419*e1eccf28SAndroid Build Coastguard Worker                                             bool mipmaps, bool faces,
420*e1eccf28SAndroid Build Coastguard Worker                                             rs_yuv_format yuv_format) {
421*e1eccf28SAndroid Build Coastguard Worker     return CreateType((RsElement) element.p, dimX, dimY, dimZ, mipmaps, faces,
422*e1eccf28SAndroid Build Coastguard Worker                       yuv_format);
423*e1eccf28SAndroid Build Coastguard Worker }
424*e1eccf28SAndroid Build Coastguard Worker 
rsCreateAllocation(::rs_type type,rs_allocation_mipmap_control mipmaps,uint32_t usages,void * ptr)425*e1eccf28SAndroid Build Coastguard Worker android::renderscript::rs_allocation rsCreateAllocation(
426*e1eccf28SAndroid Build Coastguard Worker         ::rs_type type, rs_allocation_mipmap_control mipmaps, uint32_t usages,
427*e1eccf28SAndroid Build Coastguard Worker         void *ptr) {
428*e1eccf28SAndroid Build Coastguard Worker 
429*e1eccf28SAndroid Build Coastguard Worker     return CreateAllocation((RsType) type.p,
430*e1eccf28SAndroid Build Coastguard Worker                             (RsAllocationMipmapControl) mipmaps,
431*e1eccf28SAndroid Build Coastguard Worker                             usages, ptr);
432*e1eccf28SAndroid Build Coastguard Worker }
433*e1eccf28SAndroid Build Coastguard Worker #endif
434*e1eccf28SAndroid Build Coastguard Worker 
435*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
436*e1eccf28SAndroid Build Coastguard Worker // Object routines
437*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
438*e1eccf28SAndroid Build Coastguard Worker // Add NOLINT to suppress wrong warnings from clang-tidy.
439*e1eccf28SAndroid Build Coastguard Worker #define IS_CLEAR_SET_OBJ(t) \
440*e1eccf28SAndroid Build Coastguard Worker     bool rsIsObject(t src) { \
441*e1eccf28SAndroid Build Coastguard Worker         return src.p != nullptr; \
442*e1eccf28SAndroid Build Coastguard Worker     } \
443*e1eccf28SAndroid Build Coastguard Worker     void __attribute__((overloadable)) rsClearObject(t *dst) { /*NOLINT*/ \
444*e1eccf28SAndroid Build Coastguard Worker         rsrClearObject(reinterpret_cast<rs_object_base *>(dst)); \
445*e1eccf28SAndroid Build Coastguard Worker     } \
446*e1eccf28SAndroid Build Coastguard Worker     void __attribute__((overloadable)) rsSetObject(t *dst, t src) { /*NOLINT*/ \
447*e1eccf28SAndroid Build Coastguard Worker         Context *rsc = RsdCpuReference::getTlsContext(); \
448*e1eccf28SAndroid Build Coastguard Worker         rsrSetObject(rsc, reinterpret_cast<rs_object_base *>(dst), (ObjectBase*)src.p); \
449*e1eccf28SAndroid Build Coastguard Worker     }
450*e1eccf28SAndroid Build Coastguard Worker 
451*e1eccf28SAndroid Build Coastguard Worker IS_CLEAR_SET_OBJ(::rs_element)
IS_CLEAR_SET_OBJ(::rs_type)452*e1eccf28SAndroid Build Coastguard Worker IS_CLEAR_SET_OBJ(::rs_type)
453*e1eccf28SAndroid Build Coastguard Worker IS_CLEAR_SET_OBJ(::rs_allocation)
454*e1eccf28SAndroid Build Coastguard Worker IS_CLEAR_SET_OBJ(::rs_sampler)
455*e1eccf28SAndroid Build Coastguard Worker IS_CLEAR_SET_OBJ(::rs_script)
456*e1eccf28SAndroid Build Coastguard Worker 
457*e1eccf28SAndroid Build Coastguard Worker IS_CLEAR_SET_OBJ(::rs_mesh)
458*e1eccf28SAndroid Build Coastguard Worker IS_CLEAR_SET_OBJ(::rs_program_fragment)
459*e1eccf28SAndroid Build Coastguard Worker IS_CLEAR_SET_OBJ(::rs_program_vertex)
460*e1eccf28SAndroid Build Coastguard Worker IS_CLEAR_SET_OBJ(::rs_program_raster)
461*e1eccf28SAndroid Build Coastguard Worker IS_CLEAR_SET_OBJ(::rs_program_store)
462*e1eccf28SAndroid Build Coastguard Worker IS_CLEAR_SET_OBJ(::rs_font)
463*e1eccf28SAndroid Build Coastguard Worker 
464*e1eccf28SAndroid Build Coastguard Worker #undef IS_CLEAR_SET_OBJ
465*e1eccf28SAndroid Build Coastguard Worker 
466*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
467*e1eccf28SAndroid Build Coastguard Worker // Element routines
468*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
469*e1eccf28SAndroid Build Coastguard Worker static void * ElementAt(Allocation *a, RsDataType dt, uint32_t vecSize,
470*e1eccf28SAndroid Build Coastguard Worker                         uint32_t x, uint32_t y, uint32_t z) {
471*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
472*e1eccf28SAndroid Build Coastguard Worker     const Type *t = a->getType();
473*e1eccf28SAndroid Build Coastguard Worker     const Element *e = t->getElement();
474*e1eccf28SAndroid Build Coastguard Worker 
475*e1eccf28SAndroid Build Coastguard Worker     char buf[256];
476*e1eccf28SAndroid Build Coastguard Worker     if (x && (x >= t->getLODDimX(0))) {
477*e1eccf28SAndroid Build Coastguard Worker         snprintf(buf, sizeof(buf), "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
478*e1eccf28SAndroid Build Coastguard Worker         rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
479*e1eccf28SAndroid Build Coastguard Worker         return nullptr;
480*e1eccf28SAndroid Build Coastguard Worker     }
481*e1eccf28SAndroid Build Coastguard Worker 
482*e1eccf28SAndroid Build Coastguard Worker     if (y && (y >= t->getLODDimY(0))) {
483*e1eccf28SAndroid Build Coastguard Worker         snprintf(buf, sizeof(buf), "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
484*e1eccf28SAndroid Build Coastguard Worker         rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
485*e1eccf28SAndroid Build Coastguard Worker         return nullptr;
486*e1eccf28SAndroid Build Coastguard Worker     }
487*e1eccf28SAndroid Build Coastguard Worker 
488*e1eccf28SAndroid Build Coastguard Worker     if (z && (z >= t->getLODDimZ(0))) {
489*e1eccf28SAndroid Build Coastguard Worker         snprintf(buf, sizeof(buf), "Out range ElementAt Z %i of %i", z, t->getLODDimZ(0));
490*e1eccf28SAndroid Build Coastguard Worker         rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
491*e1eccf28SAndroid Build Coastguard Worker         return nullptr;
492*e1eccf28SAndroid Build Coastguard Worker     }
493*e1eccf28SAndroid Build Coastguard Worker 
494*e1eccf28SAndroid Build Coastguard Worker     if (vecSize > 0) {
495*e1eccf28SAndroid Build Coastguard Worker         if (vecSize != e->getVectorSize()) {
496*e1eccf28SAndroid Build Coastguard Worker             snprintf(buf, sizeof(buf), "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
497*e1eccf28SAndroid Build Coastguard Worker             rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
498*e1eccf28SAndroid Build Coastguard Worker             return nullptr;
499*e1eccf28SAndroid Build Coastguard Worker         }
500*e1eccf28SAndroid Build Coastguard Worker 
501*e1eccf28SAndroid Build Coastguard Worker         if (dt != e->getType()) {
502*e1eccf28SAndroid Build Coastguard Worker             snprintf(buf, sizeof(buf), "Data type mismatch for ElementAt %i of %i", dt, e->getType());
503*e1eccf28SAndroid Build Coastguard Worker             rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
504*e1eccf28SAndroid Build Coastguard Worker             return nullptr;
505*e1eccf28SAndroid Build Coastguard Worker         }
506*e1eccf28SAndroid Build Coastguard Worker     }
507*e1eccf28SAndroid Build Coastguard Worker 
508*e1eccf28SAndroid Build Coastguard Worker     uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
509*e1eccf28SAndroid Build Coastguard Worker     const uint32_t eSize = e->getSizeBytes();
510*e1eccf28SAndroid Build Coastguard Worker     const uint32_t stride = a->mHal.drvState.lod[0].stride;
511*e1eccf28SAndroid Build Coastguard Worker     const uint32_t dimY = a->mHal.drvState.lod[0].dimY;
512*e1eccf28SAndroid Build Coastguard Worker     return &p[(x * eSize) + (y * stride) + (z * stride * dimY)];
513*e1eccf28SAndroid Build Coastguard Worker }
514*e1eccf28SAndroid Build Coastguard Worker 
rsSetElementAt(::rs_allocation a,const void * ptr,uint32_t x,uint32_t y,uint32_t z)515*e1eccf28SAndroid Build Coastguard Worker void rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y, uint32_t z) {
516*e1eccf28SAndroid Build Coastguard Worker     const Type *t = const_cast<Allocation*>((Allocation*)a.p)->getType();
517*e1eccf28SAndroid Build Coastguard Worker     const Element *e = t->getElement();
518*e1eccf28SAndroid Build Coastguard Worker     void *tmp = ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
519*e1eccf28SAndroid Build Coastguard Worker     if (tmp != nullptr)
520*e1eccf28SAndroid Build Coastguard Worker         memcpy(tmp, ptr, e->getSizeBytes());
521*e1eccf28SAndroid Build Coastguard Worker }
522*e1eccf28SAndroid Build Coastguard Worker 
rsSetElementAt(::rs_allocation a,const void * ptr,uint32_t x,uint32_t y)523*e1eccf28SAndroid Build Coastguard Worker void rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y) {
524*e1eccf28SAndroid Build Coastguard Worker     rsSetElementAt(a, ptr, x, y, 0);
525*e1eccf28SAndroid Build Coastguard Worker }
526*e1eccf28SAndroid Build Coastguard Worker 
rsSetElementAt(::rs_allocation a,const void * ptr,uint32_t x)527*e1eccf28SAndroid Build Coastguard Worker void rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x) {
528*e1eccf28SAndroid Build Coastguard Worker     rsSetElementAt(a, ptr, x, 0, 0);
529*e1eccf28SAndroid Build Coastguard Worker }
530*e1eccf28SAndroid Build Coastguard Worker 
rsGetElementAt(::rs_allocation a,uint32_t x,uint32_t y,uint32_t z)531*e1eccf28SAndroid Build Coastguard Worker const void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
532*e1eccf28SAndroid Build Coastguard Worker     return ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
533*e1eccf28SAndroid Build Coastguard Worker }
534*e1eccf28SAndroid Build Coastguard Worker 
rsGetElementAt(::rs_allocation a,uint32_t x,uint32_t y)535*e1eccf28SAndroid Build Coastguard Worker const void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y) {
536*e1eccf28SAndroid Build Coastguard Worker     return rsGetElementAt(a, x, y ,0);
537*e1eccf28SAndroid Build Coastguard Worker }
538*e1eccf28SAndroid Build Coastguard Worker 
rsGetElementAt(::rs_allocation a,uint32_t x)539*e1eccf28SAndroid Build Coastguard Worker const void *rsGetElementAt(::rs_allocation a, uint32_t x) {
540*e1eccf28SAndroid Build Coastguard Worker     return rsGetElementAt(a, x, 0, 0);
541*e1eccf28SAndroid Build Coastguard Worker }
542*e1eccf28SAndroid Build Coastguard Worker 
543*e1eccf28SAndroid Build Coastguard Worker // Add NOLINT to suppress wrong warnings from clang-tidy.
544*e1eccf28SAndroid Build Coastguard Worker #define ELEMENT_AT(T, DT, VS) \
545*e1eccf28SAndroid Build Coastguard Worker     void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z) { \
546*e1eccf28SAndroid Build Coastguard Worker         void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
547*e1eccf28SAndroid Build Coastguard Worker         if (r != nullptr) ((T *)r)[0] = *val; \
548*e1eccf28SAndroid Build Coastguard Worker         else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
549*e1eccf28SAndroid Build Coastguard Worker     } \
550*e1eccf28SAndroid Build Coastguard Worker     void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x, uint32_t y) { \
551*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt_##T(a, val, x, y, 0); \
552*e1eccf28SAndroid Build Coastguard Worker     } \
553*e1eccf28SAndroid Build Coastguard Worker     void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x) { \
554*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt_##T(a, val, x, 0, 0); \
555*e1eccf28SAndroid Build Coastguard Worker     } \
556*e1eccf28SAndroid Build Coastguard Worker     void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z) { /*NOLINT*/ \
557*e1eccf28SAndroid Build Coastguard Worker         void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z); \
558*e1eccf28SAndroid Build Coastguard Worker         if (r != nullptr) *val = ((T *)r)[0]; \
559*e1eccf28SAndroid Build Coastguard Worker         else ALOGE("Error from %s", __PRETTY_FUNCTION__); \
560*e1eccf28SAndroid Build Coastguard Worker     } \
561*e1eccf28SAndroid Build Coastguard Worker     void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y) { /*NOLINT*/ \
562*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt_##T(a, val, x, y, 0); \
563*e1eccf28SAndroid Build Coastguard Worker     } \
564*e1eccf28SAndroid Build Coastguard Worker     void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x) { /*NOLINT*/ \
565*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt_##T(a, val, x, 0, 0); \
566*e1eccf28SAndroid Build Coastguard Worker     }
567*e1eccf28SAndroid Build Coastguard Worker 
568*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(char, RS_TYPE_SIGNED_8, 1)
569*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(char2, RS_TYPE_SIGNED_8, 2)
570*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(char3, RS_TYPE_SIGNED_8, 3)
571*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(char4, RS_TYPE_SIGNED_8, 4)
572*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uchar, RS_TYPE_UNSIGNED_8, 1)
573*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uchar2, RS_TYPE_UNSIGNED_8, 2)
574*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uchar3, RS_TYPE_UNSIGNED_8, 3)
575*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uchar4, RS_TYPE_UNSIGNED_8, 4)
576*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(short, RS_TYPE_SIGNED_16, 1)
577*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(short2, RS_TYPE_SIGNED_16, 2)
578*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(short3, RS_TYPE_SIGNED_16, 3)
579*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(short4, RS_TYPE_SIGNED_16, 4)
580*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ushort, RS_TYPE_UNSIGNED_16, 1)
581*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ushort2, RS_TYPE_UNSIGNED_16, 2)
582*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ushort3, RS_TYPE_UNSIGNED_16, 3)
583*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ushort4, RS_TYPE_UNSIGNED_16, 4)
584*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(int, RS_TYPE_SIGNED_32, 1)
585*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(int2, RS_TYPE_SIGNED_32, 2)
586*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(int3, RS_TYPE_SIGNED_32, 3)
587*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(int4, RS_TYPE_SIGNED_32, 4)
588*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uint, RS_TYPE_UNSIGNED_32, 1)
589*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uint2, RS_TYPE_UNSIGNED_32, 2)
590*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uint3, RS_TYPE_UNSIGNED_32, 3)
591*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uint4, RS_TYPE_UNSIGNED_32, 4)
592*e1eccf28SAndroid Build Coastguard Worker #ifdef __LP64__
593*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(long, RS_TYPE_SIGNED_64, 1)
594*e1eccf28SAndroid Build Coastguard Worker #else
595*e1eccf28SAndroid Build Coastguard Worker /* the long versions need special treatment; the long * argument has to be
596*e1eccf28SAndroid Build Coastguard Worker  * kept so the signatures match, but the actual accesses have to be done in
597*e1eccf28SAndroid Build Coastguard Worker  * int64_t * to be consistent with the script ABI.
598*e1eccf28SAndroid Build Coastguard Worker  */
599*e1eccf28SAndroid Build Coastguard Worker void rsSetElementAt_long(::rs_allocation a, const long *val, uint32_t x, uint32_t y, uint32_t z) {
600*e1eccf28SAndroid Build Coastguard Worker     void *r = ElementAt((Allocation *)a.p, RS_TYPE_SIGNED_64, 1, x, y, z);
601*e1eccf28SAndroid Build Coastguard Worker     if (r != nullptr) ((int64_t *)r)[0] = *((int64_t *)val);
602*e1eccf28SAndroid Build Coastguard Worker     else ALOGE("Error from %s", __PRETTY_FUNCTION__);
603*e1eccf28SAndroid Build Coastguard Worker }
604*e1eccf28SAndroid Build Coastguard Worker void rsSetElementAt_long(::rs_allocation a, const long *val, uint32_t x, uint32_t y) {
605*e1eccf28SAndroid Build Coastguard Worker     rsSetElementAt_long(a, val, x, y, 0);
606*e1eccf28SAndroid Build Coastguard Worker }
607*e1eccf28SAndroid Build Coastguard Worker void rsSetElementAt_long(::rs_allocation a, const long *val, uint32_t x) {
608*e1eccf28SAndroid Build Coastguard Worker     rsSetElementAt_long(a, val, x, 0, 0);
609*e1eccf28SAndroid Build Coastguard Worker }
610*e1eccf28SAndroid Build Coastguard Worker void rsGetElementAt_long(::rs_allocation a, long *val, uint32_t x, uint32_t y, uint32_t z) { /*NOLINT*/
611*e1eccf28SAndroid Build Coastguard Worker     void *r = ElementAt((Allocation *)a.p, RS_TYPE_SIGNED_64, 1, x, y, z);
612*e1eccf28SAndroid Build Coastguard Worker     if (r != nullptr) *((int64_t*)val) = ((int64_t *)r)[0];
613*e1eccf28SAndroid Build Coastguard Worker     else ALOGE("Error from %s", __PRETTY_FUNCTION__);
614*e1eccf28SAndroid Build Coastguard Worker }
615*e1eccf28SAndroid Build Coastguard Worker void rsGetElementAt_long(::rs_allocation a, long *val, uint32_t x, uint32_t y) { /*NOLINT*/
616*e1eccf28SAndroid Build Coastguard Worker     rsGetElementAt_long(a, val, x, y, 0);
617*e1eccf28SAndroid Build Coastguard Worker }
618*e1eccf28SAndroid Build Coastguard Worker void rsGetElementAt_long(::rs_allocation a, long *val, uint32_t x) { /*NOLINT*/
619*e1eccf28SAndroid Build Coastguard Worker     rsGetElementAt_long(a, val, x, 0, 0);
620*e1eccf28SAndroid Build Coastguard Worker }
621*e1eccf28SAndroid Build Coastguard Worker #endif
622*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(long2, RS_TYPE_SIGNED_64, 2)
623*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(long3, RS_TYPE_SIGNED_64, 3)
624*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(long4, RS_TYPE_SIGNED_64, 4)
625*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ulong, RS_TYPE_UNSIGNED_64, 1)
626*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ulong2, RS_TYPE_UNSIGNED_64, 2)
627*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ulong3, RS_TYPE_UNSIGNED_64, 3)
628*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ulong4, RS_TYPE_UNSIGNED_64, 4)
629*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(half, RS_TYPE_FLOAT_16, 1)
630*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(half2, RS_TYPE_FLOAT_16, 2)
631*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(half3, RS_TYPE_FLOAT_16, 3)
632*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(half4, RS_TYPE_FLOAT_16, 4)
633*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(float, RS_TYPE_FLOAT_32, 1)
634*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(float2, RS_TYPE_FLOAT_32, 2)
635*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(float3, RS_TYPE_FLOAT_32, 3)
636*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(float4, RS_TYPE_FLOAT_32, 4)
637*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(double, RS_TYPE_FLOAT_64, 1)
638*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(double2, RS_TYPE_FLOAT_64, 2)
639*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(double3, RS_TYPE_FLOAT_64, 3)
640*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(double4, RS_TYPE_FLOAT_64, 4)
641*e1eccf28SAndroid Build Coastguard Worker 
642*e1eccf28SAndroid Build Coastguard Worker #undef ELEMENT_AT
643*e1eccf28SAndroid Build Coastguard Worker 
644*e1eccf28SAndroid Build Coastguard Worker #ifndef __LP64__
645*e1eccf28SAndroid Build Coastguard Worker /*
646*e1eccf28SAndroid Build Coastguard Worker  * We miss some symbols for rs{Get,Set}Element_long,ulong variants because 64
647*e1eccf28SAndroid Build Coastguard Worker  * bit integer values are 'long' in RS-land but might be 'long long' in the
648*e1eccf28SAndroid Build Coastguard Worker  * driver.  Define native_long* and native_ulong* types to be vectors of
649*e1eccf28SAndroid Build Coastguard Worker  * 'long' as seen by the driver and define overloaded versions of
650*e1eccf28SAndroid Build Coastguard Worker  * rsSetElementAt_* and rsGetElementAt_*.  This should get us the correct
651*e1eccf28SAndroid Build Coastguard Worker  * mangled names in the driver.
652*e1eccf28SAndroid Build Coastguard Worker  */
653*e1eccf28SAndroid Build Coastguard Worker 
654*e1eccf28SAndroid Build Coastguard Worker typedef long native_long2 __attribute__((ext_vector_type(2)));
655*e1eccf28SAndroid Build Coastguard Worker typedef long native_long3 __attribute__((ext_vector_type(3)));
656*e1eccf28SAndroid Build Coastguard Worker typedef long native_long4 __attribute__((ext_vector_type(4)));
657*e1eccf28SAndroid Build Coastguard Worker typedef unsigned long native_ulong2 __attribute__((ext_vector_type(2)));
658*e1eccf28SAndroid Build Coastguard Worker typedef unsigned long native_ulong3 __attribute__((ext_vector_type(3)));
659*e1eccf28SAndroid Build Coastguard Worker typedef unsigned long native_ulong4 __attribute__((ext_vector_type(4)));
660*e1eccf28SAndroid Build Coastguard Worker 
661*e1eccf28SAndroid Build Coastguard Worker // Add NOLINT to suppress wrong warnings from clang-tidy.
662*e1eccf28SAndroid Build Coastguard Worker #define ELEMENT_AT_OVERLOADS(T, U) \
663*e1eccf28SAndroid Build Coastguard Worker     void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y, uint32_t z) { \
664*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt_##T(a, (T *) val, x, y, z); \
665*e1eccf28SAndroid Build Coastguard Worker     } \
666*e1eccf28SAndroid Build Coastguard Worker     void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x, uint32_t y) { \
667*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt_##T(a, (T *) val, x, y, 0); \
668*e1eccf28SAndroid Build Coastguard Worker     } \
669*e1eccf28SAndroid Build Coastguard Worker     void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x) { \
670*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt_##T(a, (T *) val, x, 0, 0); \
671*e1eccf28SAndroid Build Coastguard Worker     } \
672*e1eccf28SAndroid Build Coastguard Worker     void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y, uint32_t z) { /*NOLINT*/ \
673*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt_##T(a, (T *) val, x, y, z); \
674*e1eccf28SAndroid Build Coastguard Worker     } \
675*e1eccf28SAndroid Build Coastguard Worker     void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y) { /*NOLINT*/ \
676*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt_##T(a, (T *) val, x, y, 0); \
677*e1eccf28SAndroid Build Coastguard Worker     } \
678*e1eccf28SAndroid Build Coastguard Worker     void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x) { /*NOLINT*/ \
679*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt_##T(a, (T *) val, x, 0, 0); \
680*e1eccf28SAndroid Build Coastguard Worker     } \
681*e1eccf28SAndroid Build Coastguard Worker 
ELEMENT_AT_OVERLOADS(long2,native_long2)682*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT_OVERLOADS(long2, native_long2)
683*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT_OVERLOADS(long3, native_long3)
684*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT_OVERLOADS(long4, native_long4)
685*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT_OVERLOADS(ulong, unsigned long)
686*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT_OVERLOADS(ulong2, native_ulong2)
687*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT_OVERLOADS(ulong3, native_ulong3)
688*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT_OVERLOADS(ulong4, native_ulong4)
689*e1eccf28SAndroid Build Coastguard Worker 
690*e1eccf28SAndroid Build Coastguard Worker // We also need variants of rs{Get,Set}ElementAt_long that take 'long long *' as
691*e1eccf28SAndroid Build Coastguard Worker // we might have this overloaded variant in old APKs.
692*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT_OVERLOADS(long, long long)
693*e1eccf28SAndroid Build Coastguard Worker 
694*e1eccf28SAndroid Build Coastguard Worker #undef ELEMENT_AT_OVERLOADS
695*e1eccf28SAndroid Build Coastguard Worker #endif
696*e1eccf28SAndroid Build Coastguard Worker 
697*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
698*e1eccf28SAndroid Build Coastguard Worker // ForEach routines
699*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
700*e1eccf28SAndroid Build Coastguard Worker void rsForEachInternal(int slot,
701*e1eccf28SAndroid Build Coastguard Worker                        rs_script_call *options,
702*e1eccf28SAndroid Build Coastguard Worker                        int hasOutput,
703*e1eccf28SAndroid Build Coastguard Worker                        int numInputs,
704*e1eccf28SAndroid Build Coastguard Worker                        ::rs_allocation* allocs) {
705*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
706*e1eccf28SAndroid Build Coastguard Worker     Script *s = const_cast<Script*>(RsdCpuReference::getTlsScript());
707*e1eccf28SAndroid Build Coastguard Worker     if (numInputs > RS_KERNEL_MAX_ARGUMENTS) {
708*e1eccf28SAndroid Build Coastguard Worker         rsc->setError(RS_ERROR_BAD_SCRIPT,
709*e1eccf28SAndroid Build Coastguard Worker                       "rsForEachInternal: too many inputs to a kernel.");
710*e1eccf28SAndroid Build Coastguard Worker         return;
711*e1eccf28SAndroid Build Coastguard Worker     }
712*e1eccf28SAndroid Build Coastguard Worker     Allocation* inputs[RS_KERNEL_MAX_ARGUMENTS];
713*e1eccf28SAndroid Build Coastguard Worker     for (int i = 0; i < numInputs; i++) {
714*e1eccf28SAndroid Build Coastguard Worker         inputs[i] = (Allocation*)allocs[i].p;
715*e1eccf28SAndroid Build Coastguard Worker         CHECK_OBJ(inputs[i]);
716*e1eccf28SAndroid Build Coastguard Worker         inputs[i]->incSysRef();
717*e1eccf28SAndroid Build Coastguard Worker     }
718*e1eccf28SAndroid Build Coastguard Worker     Allocation* out = nullptr;
719*e1eccf28SAndroid Build Coastguard Worker     if (hasOutput) {
720*e1eccf28SAndroid Build Coastguard Worker         out = (Allocation*)allocs[numInputs].p;
721*e1eccf28SAndroid Build Coastguard Worker         CHECK_OBJ(out);
722*e1eccf28SAndroid Build Coastguard Worker         out->incSysRef();
723*e1eccf28SAndroid Build Coastguard Worker     }
724*e1eccf28SAndroid Build Coastguard Worker     rsrForEach(rsc, s, slot, numInputs, numInputs > 0 ? inputs : nullptr, out,
725*e1eccf28SAndroid Build Coastguard Worker                nullptr, 0, (RsScriptCall*)options);
726*e1eccf28SAndroid Build Coastguard Worker     for (int i = 0; i < numInputs; i++) {
727*e1eccf28SAndroid Build Coastguard Worker         inputs[i]->decSysRef();
728*e1eccf28SAndroid Build Coastguard Worker     }
729*e1eccf28SAndroid Build Coastguard Worker     if (hasOutput) {
730*e1eccf28SAndroid Build Coastguard Worker         out->decSysRef();
731*e1eccf28SAndroid Build Coastguard Worker     }
732*e1eccf28SAndroid Build Coastguard Worker }
733*e1eccf28SAndroid Build Coastguard Worker 
rsForEach(::rs_script script,::rs_allocation in,::rs_allocation out,const void * usr,const rs_script_call * call)734*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsForEach(::rs_script script,
735*e1eccf28SAndroid Build Coastguard Worker                                              ::rs_allocation in,
736*e1eccf28SAndroid Build Coastguard Worker                                              ::rs_allocation out,
737*e1eccf28SAndroid Build Coastguard Worker                                              const void *usr,
738*e1eccf28SAndroid Build Coastguard Worker                                              const rs_script_call *call) {
739*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
740*e1eccf28SAndroid Build Coastguard Worker     rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p,
741*e1eccf28SAndroid Build Coastguard Worker                (Allocation *)out.p, usr, 0, (RsScriptCall *)call);
742*e1eccf28SAndroid Build Coastguard Worker }
743*e1eccf28SAndroid Build Coastguard Worker 
rsForEach(::rs_script script,::rs_allocation in,::rs_allocation out,const void * usr)744*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsForEach(::rs_script script,
745*e1eccf28SAndroid Build Coastguard Worker                                              ::rs_allocation in,
746*e1eccf28SAndroid Build Coastguard Worker                                              ::rs_allocation out,
747*e1eccf28SAndroid Build Coastguard Worker                                              const void *usr) {
748*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
749*e1eccf28SAndroid Build Coastguard Worker     rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
750*e1eccf28SAndroid Build Coastguard Worker                usr, 0, nullptr);
751*e1eccf28SAndroid Build Coastguard Worker }
752*e1eccf28SAndroid Build Coastguard Worker 
rsForEach(::rs_script script,::rs_allocation in,::rs_allocation out)753*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsForEach(::rs_script script,
754*e1eccf28SAndroid Build Coastguard Worker                                              ::rs_allocation in,
755*e1eccf28SAndroid Build Coastguard Worker                                              ::rs_allocation out) {
756*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
757*e1eccf28SAndroid Build Coastguard Worker     rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
758*e1eccf28SAndroid Build Coastguard Worker                nullptr, 0, nullptr);
759*e1eccf28SAndroid Build Coastguard Worker }
760*e1eccf28SAndroid Build Coastguard Worker 
761*e1eccf28SAndroid Build Coastguard Worker // These functions are only supported in 32-bit.
762*e1eccf28SAndroid Build Coastguard Worker #ifndef __LP64__
rsForEach(::rs_script script,::rs_allocation in,::rs_allocation out,const void * usr,uint32_t usrLen)763*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsForEach(::rs_script script,
764*e1eccf28SAndroid Build Coastguard Worker                                              ::rs_allocation in,
765*e1eccf28SAndroid Build Coastguard Worker                                              ::rs_allocation out,
766*e1eccf28SAndroid Build Coastguard Worker                                              const void *usr,
767*e1eccf28SAndroid Build Coastguard Worker                                              uint32_t usrLen) {
768*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
769*e1eccf28SAndroid Build Coastguard Worker     rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
770*e1eccf28SAndroid Build Coastguard Worker                usr, usrLen, nullptr);
771*e1eccf28SAndroid Build Coastguard Worker }
772*e1eccf28SAndroid Build Coastguard Worker 
rsForEach(::rs_script script,::rs_allocation in,::rs_allocation out,const void * usr,uint32_t usrLen,const rs_script_call * call)773*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsForEach(::rs_script script,
774*e1eccf28SAndroid Build Coastguard Worker                                              ::rs_allocation in,
775*e1eccf28SAndroid Build Coastguard Worker                                              ::rs_allocation out,
776*e1eccf28SAndroid Build Coastguard Worker                                              const void *usr,
777*e1eccf28SAndroid Build Coastguard Worker                                              uint32_t usrLen,
778*e1eccf28SAndroid Build Coastguard Worker                                              const rs_script_call *call) {
779*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
780*e1eccf28SAndroid Build Coastguard Worker     rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p, (Allocation *)out.p,
781*e1eccf28SAndroid Build Coastguard Worker                usr, usrLen, (RsScriptCall *)call);
782*e1eccf28SAndroid Build Coastguard Worker }
783*e1eccf28SAndroid Build Coastguard Worker #endif
784*e1eccf28SAndroid Build Coastguard Worker 
785*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
786*e1eccf28SAndroid Build Coastguard Worker // Message routines
787*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
rsSendToClient(int cmdID)788*e1eccf28SAndroid Build Coastguard Worker uint32_t rsSendToClient(int cmdID) {
789*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
790*e1eccf28SAndroid Build Coastguard Worker     return rsrToClient(rsc, cmdID, (const void *)nullptr, 0);
791*e1eccf28SAndroid Build Coastguard Worker }
792*e1eccf28SAndroid Build Coastguard Worker 
rsSendToClient(int cmdID,const void * data,uint32_t len)793*e1eccf28SAndroid Build Coastguard Worker uint32_t rsSendToClient(int cmdID, const void *data, uint32_t len) {
794*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
795*e1eccf28SAndroid Build Coastguard Worker     return rsrToClient(rsc, cmdID, data, len);
796*e1eccf28SAndroid Build Coastguard Worker }
797*e1eccf28SAndroid Build Coastguard Worker 
rsSendToClientBlocking(int cmdID)798*e1eccf28SAndroid Build Coastguard Worker uint32_t rsSendToClientBlocking(int cmdID) {
799*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
800*e1eccf28SAndroid Build Coastguard Worker     return rsrToClientBlocking(rsc, cmdID, (const void *)nullptr, 0);
801*e1eccf28SAndroid Build Coastguard Worker }
802*e1eccf28SAndroid Build Coastguard Worker 
rsSendToClientBlocking(int cmdID,const void * data,uint32_t len)803*e1eccf28SAndroid Build Coastguard Worker uint32_t rsSendToClientBlocking(int cmdID, const void *data, uint32_t len) {
804*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
805*e1eccf28SAndroid Build Coastguard Worker     return rsrToClientBlocking(rsc, cmdID, data, len);
806*e1eccf28SAndroid Build Coastguard Worker }
807*e1eccf28SAndroid Build Coastguard Worker 
808*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
809*e1eccf28SAndroid Build Coastguard Worker // Time routines
810*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
811*e1eccf28SAndroid Build Coastguard Worker 
812*e1eccf28SAndroid Build Coastguard Worker // time_t is int in 32-bit RenderScript.  time_t is long in bionic.  rsTime and
813*e1eccf28SAndroid Build Coastguard Worker // rsLocaltime are set to explicitly take 'const int *' so we generate the
814*e1eccf28SAndroid Build Coastguard Worker // correct mangled names.
815*e1eccf28SAndroid Build Coastguard Worker #ifndef __LP64__
rsTime(int * timer)816*e1eccf28SAndroid Build Coastguard Worker int rsTime(int *timer) {
817*e1eccf28SAndroid Build Coastguard Worker #else
818*e1eccf28SAndroid Build Coastguard Worker time_t rsTime(time_t * timer) {
819*e1eccf28SAndroid Build Coastguard Worker #endif
820*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
821*e1eccf28SAndroid Build Coastguard Worker     return rsrTime(rsc, (time_t *)timer);
822*e1eccf28SAndroid Build Coastguard Worker }
823*e1eccf28SAndroid Build Coastguard Worker 
824*e1eccf28SAndroid Build Coastguard Worker #ifndef __LP64__
825*e1eccf28SAndroid Build Coastguard Worker rs_tm* rsLocaltime(rs_tm* local, const int *timer) {
826*e1eccf28SAndroid Build Coastguard Worker #else
827*e1eccf28SAndroid Build Coastguard Worker rs_tm* rsLocaltime(rs_tm* local, const time_t *timer) {
828*e1eccf28SAndroid Build Coastguard Worker #endif
829*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
830*e1eccf28SAndroid Build Coastguard Worker     return (rs_tm*)rsrLocalTime(rsc, (tm*)local, (time_t *)timer);
831*e1eccf28SAndroid Build Coastguard Worker }
832*e1eccf28SAndroid Build Coastguard Worker 
833*e1eccf28SAndroid Build Coastguard Worker int64_t rsUptimeMillis() {
834*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
835*e1eccf28SAndroid Build Coastguard Worker     return rsrUptimeMillis(rsc);
836*e1eccf28SAndroid Build Coastguard Worker }
837*e1eccf28SAndroid Build Coastguard Worker 
838*e1eccf28SAndroid Build Coastguard Worker int64_t rsUptimeNanos() {
839*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
840*e1eccf28SAndroid Build Coastguard Worker     return rsrUptimeNanos(rsc);
841*e1eccf28SAndroid Build Coastguard Worker }
842*e1eccf28SAndroid Build Coastguard Worker 
843*e1eccf28SAndroid Build Coastguard Worker float rsGetDt() {
844*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
845*e1eccf28SAndroid Build Coastguard Worker     const Script *sc = RsdCpuReference::getTlsScript();
846*e1eccf28SAndroid Build Coastguard Worker     return rsrGetDt(rsc, sc);
847*e1eccf28SAndroid Build Coastguard Worker }
848*e1eccf28SAndroid Build Coastguard Worker 
849*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
850*e1eccf28SAndroid Build Coastguard Worker // Graphics routines
851*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
852*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
853*e1eccf28SAndroid Build Coastguard Worker static void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
854*e1eccf28SAndroid Build Coastguard Worker                                  float x2, float y2, float z2, float u2, float v2,
855*e1eccf28SAndroid Build Coastguard Worker                                  float x3, float y3, float z3, float u3, float v3,
856*e1eccf28SAndroid Build Coastguard Worker                                  float x4, float y4, float z4, float u4, float v4) {
857*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
858*e1eccf28SAndroid Build Coastguard Worker 
859*e1eccf28SAndroid Build Coastguard Worker     if (!rsc->setupCheck()) {
860*e1eccf28SAndroid Build Coastguard Worker         return;
861*e1eccf28SAndroid Build Coastguard Worker     }
862*e1eccf28SAndroid Build Coastguard Worker 
863*e1eccf28SAndroid Build Coastguard Worker     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
864*e1eccf28SAndroid Build Coastguard Worker     if (!dc->gl.shaderCache->setup(rsc)) {
865*e1eccf28SAndroid Build Coastguard Worker         return;
866*e1eccf28SAndroid Build Coastguard Worker     }
867*e1eccf28SAndroid Build Coastguard Worker 
868*e1eccf28SAndroid Build Coastguard Worker     //ALOGE("Quad");
869*e1eccf28SAndroid Build Coastguard Worker     //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
870*e1eccf28SAndroid Build Coastguard Worker     //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
871*e1eccf28SAndroid Build Coastguard Worker     //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
872*e1eccf28SAndroid Build Coastguard Worker     //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
873*e1eccf28SAndroid Build Coastguard Worker 
874*e1eccf28SAndroid Build Coastguard Worker     float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
875*e1eccf28SAndroid Build Coastguard Worker     const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
876*e1eccf28SAndroid Build Coastguard Worker 
877*e1eccf28SAndroid Build Coastguard Worker     RsdVertexArray::Attrib attribs[2];
878*e1eccf28SAndroid Build Coastguard Worker     attribs[0].set(GL_FLOAT, 3, 12, false, (size_t)vtx, "ATTRIB_position");
879*e1eccf28SAndroid Build Coastguard Worker     attribs[1].set(GL_FLOAT, 2, 8, false, (size_t)tex, "ATTRIB_texture0");
880*e1eccf28SAndroid Build Coastguard Worker 
881*e1eccf28SAndroid Build Coastguard Worker     RsdVertexArray va(attribs, 2);
882*e1eccf28SAndroid Build Coastguard Worker     va.setup(rsc);
883*e1eccf28SAndroid Build Coastguard Worker 
884*e1eccf28SAndroid Build Coastguard Worker     RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
885*e1eccf28SAndroid Build Coastguard Worker }
886*e1eccf28SAndroid Build Coastguard Worker 
887*e1eccf28SAndroid Build Coastguard Worker static void SC_DrawQuad(float x1, float y1, float z1,
888*e1eccf28SAndroid Build Coastguard Worker                         float x2, float y2, float z2,
889*e1eccf28SAndroid Build Coastguard Worker                         float x3, float y3, float z3,
890*e1eccf28SAndroid Build Coastguard Worker                         float x4, float y4, float z4) {
891*e1eccf28SAndroid Build Coastguard Worker     SC_DrawQuadTexCoords(x1, y1, z1, 0, 1,
892*e1eccf28SAndroid Build Coastguard Worker                          x2, y2, z2, 1, 1,
893*e1eccf28SAndroid Build Coastguard Worker                          x3, y3, z3, 1, 0,
894*e1eccf28SAndroid Build Coastguard Worker                          x4, y4, z4, 0, 0);
895*e1eccf28SAndroid Build Coastguard Worker }
896*e1eccf28SAndroid Build Coastguard Worker 
897*e1eccf28SAndroid Build Coastguard Worker static void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) {
898*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
899*e1eccf28SAndroid Build Coastguard Worker 
900*e1eccf28SAndroid Build Coastguard Worker     ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
901*e1eccf28SAndroid Build Coastguard Worker     rsc->setProgramVertex(rsc->getDefaultProgramVertex());
902*e1eccf28SAndroid Build Coastguard Worker     //rsc->setupCheck();
903*e1eccf28SAndroid Build Coastguard Worker 
904*e1eccf28SAndroid Build Coastguard Worker     //GLint crop[4] = {0, h, w, -h};
905*e1eccf28SAndroid Build Coastguard Worker 
906*e1eccf28SAndroid Build Coastguard Worker     float sh = rsc->getHeight();
907*e1eccf28SAndroid Build Coastguard Worker 
908*e1eccf28SAndroid Build Coastguard Worker     SC_DrawQuad(x,   sh - y,     z,
909*e1eccf28SAndroid Build Coastguard Worker                 x+w, sh - y,     z,
910*e1eccf28SAndroid Build Coastguard Worker                 x+w, sh - (y+h), z,
911*e1eccf28SAndroid Build Coastguard Worker                 x,   sh - (y+h), z);
912*e1eccf28SAndroid Build Coastguard Worker     rsc->setProgramVertex((ProgramVertex *)tmp.get());
913*e1eccf28SAndroid Build Coastguard Worker }
914*e1eccf28SAndroid Build Coastguard Worker 
915*e1eccf28SAndroid Build Coastguard Worker void rsAllocationMarkDirty(::rs_allocation a) {
916*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
917*e1eccf28SAndroid Build Coastguard Worker     rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
918*e1eccf28SAndroid Build Coastguard Worker }
919*e1eccf28SAndroid Build Coastguard Worker 
920*e1eccf28SAndroid Build Coastguard Worker void rsgAllocationSyncAll(::rs_allocation a) {
921*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
922*e1eccf28SAndroid Build Coastguard Worker     rsrAllocationSyncAll(rsc, (Allocation *)a.p, RS_ALLOCATION_USAGE_SCRIPT);
923*e1eccf28SAndroid Build Coastguard Worker }
924*e1eccf28SAndroid Build Coastguard Worker 
925*e1eccf28SAndroid Build Coastguard Worker void rsgAllocationSyncAll(::rs_allocation a,
926*e1eccf28SAndroid Build Coastguard Worker                           unsigned int usage) {
927*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
928*e1eccf28SAndroid Build Coastguard Worker     rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)usage);
929*e1eccf28SAndroid Build Coastguard Worker }
930*e1eccf28SAndroid Build Coastguard Worker 
931*e1eccf28SAndroid Build Coastguard Worker 
932*e1eccf28SAndroid Build Coastguard Worker void rsgAllocationSyncAll(::rs_allocation a,
933*e1eccf28SAndroid Build Coastguard Worker                           rs_allocation_usage_type source) {
934*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
935*e1eccf28SAndroid Build Coastguard Worker     rsrAllocationSyncAll(rsc, (Allocation *)a.p, (RsAllocationUsageType)source.val);
936*e1eccf28SAndroid Build Coastguard Worker }
937*e1eccf28SAndroid Build Coastguard Worker 
938*e1eccf28SAndroid Build Coastguard Worker void rsgBindProgramFragment(::rs_program_fragment pf) {
939*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
940*e1eccf28SAndroid Build Coastguard Worker     rsrBindProgramFragment(rsc, (ProgramFragment *)pf.p);
941*e1eccf28SAndroid Build Coastguard Worker }
942*e1eccf28SAndroid Build Coastguard Worker 
943*e1eccf28SAndroid Build Coastguard Worker void rsgBindProgramStore(::rs_program_store ps) {
944*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
945*e1eccf28SAndroid Build Coastguard Worker     rsrBindProgramStore(rsc, (ProgramStore *)ps.p);
946*e1eccf28SAndroid Build Coastguard Worker }
947*e1eccf28SAndroid Build Coastguard Worker 
948*e1eccf28SAndroid Build Coastguard Worker void rsgBindProgramVertex(::rs_program_vertex pv) {
949*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
950*e1eccf28SAndroid Build Coastguard Worker     rsrBindProgramVertex(rsc, (ProgramVertex *)pv.p);
951*e1eccf28SAndroid Build Coastguard Worker }
952*e1eccf28SAndroid Build Coastguard Worker 
953*e1eccf28SAndroid Build Coastguard Worker void rsgBindProgramRaster(::rs_program_raster pr) {
954*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
955*e1eccf28SAndroid Build Coastguard Worker     rsrBindProgramRaster(rsc, (ProgramRaster *)pr.p);
956*e1eccf28SAndroid Build Coastguard Worker }
957*e1eccf28SAndroid Build Coastguard Worker 
958*e1eccf28SAndroid Build Coastguard Worker void rsgBindSampler(::rs_program_fragment pf,
959*e1eccf28SAndroid Build Coastguard Worker                     uint32_t slot, ::rs_sampler s) {
960*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
961*e1eccf28SAndroid Build Coastguard Worker     rsrBindSampler(rsc, (ProgramFragment *)pf.p, slot, (Sampler *)s.p);
962*e1eccf28SAndroid Build Coastguard Worker }
963*e1eccf28SAndroid Build Coastguard Worker 
964*e1eccf28SAndroid Build Coastguard Worker void rsgBindTexture(::rs_program_fragment pf,
965*e1eccf28SAndroid Build Coastguard Worker                     uint32_t slot, ::rs_allocation a) {
966*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
967*e1eccf28SAndroid Build Coastguard Worker     rsrBindTexture(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
968*e1eccf28SAndroid Build Coastguard Worker }
969*e1eccf28SAndroid Build Coastguard Worker 
970*e1eccf28SAndroid Build Coastguard Worker void rsgBindConstant(::rs_program_fragment pf,
971*e1eccf28SAndroid Build Coastguard Worker                      uint32_t slot, ::rs_allocation a) {
972*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
973*e1eccf28SAndroid Build Coastguard Worker     rsrBindConstant(rsc, (ProgramFragment *)pf.p, slot, (Allocation *)a.p);
974*e1eccf28SAndroid Build Coastguard Worker }
975*e1eccf28SAndroid Build Coastguard Worker 
976*e1eccf28SAndroid Build Coastguard Worker void rsgBindConstant(::rs_program_vertex pv,
977*e1eccf28SAndroid Build Coastguard Worker                      uint32_t slot, ::rs_allocation a) {
978*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
979*e1eccf28SAndroid Build Coastguard Worker     rsrBindConstant(rsc, (ProgramVertex *)pv.p, slot, (Allocation *)a.p);
980*e1eccf28SAndroid Build Coastguard Worker }
981*e1eccf28SAndroid Build Coastguard Worker 
982*e1eccf28SAndroid Build Coastguard Worker void rsgProgramVertexLoadProjectionMatrix(const rs_matrix4x4 *m) {
983*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
984*e1eccf28SAndroid Build Coastguard Worker     rsrVpLoadProjectionMatrix(rsc, (const rsc_Matrix *)m);
985*e1eccf28SAndroid Build Coastguard Worker }
986*e1eccf28SAndroid Build Coastguard Worker 
987*e1eccf28SAndroid Build Coastguard Worker void rsgProgramVertexLoadModelMatrix(const rs_matrix4x4 *m) {
988*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
989*e1eccf28SAndroid Build Coastguard Worker     rsrVpLoadModelMatrix(rsc, (const rsc_Matrix *)m);
990*e1eccf28SAndroid Build Coastguard Worker }
991*e1eccf28SAndroid Build Coastguard Worker 
992*e1eccf28SAndroid Build Coastguard Worker void rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *m) {
993*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
994*e1eccf28SAndroid Build Coastguard Worker     rsrVpLoadTextureMatrix(rsc, (const rsc_Matrix *)m);
995*e1eccf28SAndroid Build Coastguard Worker }
996*e1eccf28SAndroid Build Coastguard Worker 
997*e1eccf28SAndroid Build Coastguard Worker void rsgProgramVertexGetProjectionMatrix(rs_matrix4x4 *m) {
998*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
999*e1eccf28SAndroid Build Coastguard Worker     rsrVpGetProjectionMatrix(rsc, (rsc_Matrix *)m);
1000*e1eccf28SAndroid Build Coastguard Worker }
1001*e1eccf28SAndroid Build Coastguard Worker 
1002*e1eccf28SAndroid Build Coastguard Worker void rsgProgramFragmentConstantColor(::rs_program_fragment pf,
1003*e1eccf28SAndroid Build Coastguard Worker                                      float r, float g, float b, float a) {
1004*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1005*e1eccf28SAndroid Build Coastguard Worker     rsrPfConstantColor(rsc, (ProgramFragment *)pf.p, r, g, b, a);
1006*e1eccf28SAndroid Build Coastguard Worker }
1007*e1eccf28SAndroid Build Coastguard Worker 
1008*e1eccf28SAndroid Build Coastguard Worker uint32_t rsgGetWidth(void) {
1009*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1010*e1eccf28SAndroid Build Coastguard Worker     return rsrGetWidth(rsc);
1011*e1eccf28SAndroid Build Coastguard Worker }
1012*e1eccf28SAndroid Build Coastguard Worker 
1013*e1eccf28SAndroid Build Coastguard Worker uint32_t rsgGetHeight(void) {
1014*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1015*e1eccf28SAndroid Build Coastguard Worker     return rsrGetHeight(rsc);
1016*e1eccf28SAndroid Build Coastguard Worker }
1017*e1eccf28SAndroid Build Coastguard Worker 
1018*e1eccf28SAndroid Build Coastguard Worker void rsgDrawRect(float x1, float y1, float x2, float y2, float z) {
1019*e1eccf28SAndroid Build Coastguard Worker     SC_DrawQuad(x1, y2, z,
1020*e1eccf28SAndroid Build Coastguard Worker                 x2, y2, z,
1021*e1eccf28SAndroid Build Coastguard Worker                 x2, y1, z,
1022*e1eccf28SAndroid Build Coastguard Worker                 x1, y1, z);
1023*e1eccf28SAndroid Build Coastguard Worker }
1024*e1eccf28SAndroid Build Coastguard Worker 
1025*e1eccf28SAndroid Build Coastguard Worker void rsgDrawQuad(float x1, float y1, float z1,
1026*e1eccf28SAndroid Build Coastguard Worker                  float x2, float y2, float z2,
1027*e1eccf28SAndroid Build Coastguard Worker                  float x3, float y3, float z3,
1028*e1eccf28SAndroid Build Coastguard Worker                  float x4, float y4, float z4) {
1029*e1eccf28SAndroid Build Coastguard Worker     SC_DrawQuad(x1, y1, z1,
1030*e1eccf28SAndroid Build Coastguard Worker                 x2, y2, z2,
1031*e1eccf28SAndroid Build Coastguard Worker                 x3, y3, z3,
1032*e1eccf28SAndroid Build Coastguard Worker                 x4, y4, z4);
1033*e1eccf28SAndroid Build Coastguard Worker }
1034*e1eccf28SAndroid Build Coastguard Worker 
1035*e1eccf28SAndroid Build Coastguard Worker void rsgDrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
1036*e1eccf28SAndroid Build Coastguard Worker                           float x2, float y2, float z2, float u2, float v2,
1037*e1eccf28SAndroid Build Coastguard Worker                           float x3, float y3, float z3, float u3, float v3,
1038*e1eccf28SAndroid Build Coastguard Worker                           float x4, float y4, float z4, float u4, float v4) {
1039*e1eccf28SAndroid Build Coastguard Worker     SC_DrawQuadTexCoords(x1, y1, z1, u1, v1,
1040*e1eccf28SAndroid Build Coastguard Worker                          x2, y2, z2, u2, v2,
1041*e1eccf28SAndroid Build Coastguard Worker                          x3, y3, z3, u3, v3,
1042*e1eccf28SAndroid Build Coastguard Worker                          x4, y4, z4, u4, v4);
1043*e1eccf28SAndroid Build Coastguard Worker }
1044*e1eccf28SAndroid Build Coastguard Worker 
1045*e1eccf28SAndroid Build Coastguard Worker void rsgDrawSpriteScreenspace(float x, float y, float z, float w, float h) {
1046*e1eccf28SAndroid Build Coastguard Worker     SC_DrawSpriteScreenspace(x, y, z, w, h);
1047*e1eccf28SAndroid Build Coastguard Worker }
1048*e1eccf28SAndroid Build Coastguard Worker 
1049*e1eccf28SAndroid Build Coastguard Worker void rsgDrawMesh(::rs_mesh ism) {
1050*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1051*e1eccf28SAndroid Build Coastguard Worker     rsrDrawMesh(rsc, (Mesh *)ism.p);
1052*e1eccf28SAndroid Build Coastguard Worker }
1053*e1eccf28SAndroid Build Coastguard Worker 
1054*e1eccf28SAndroid Build Coastguard Worker void rsgDrawMesh(::rs_mesh ism, uint primitiveIndex) {
1055*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1056*e1eccf28SAndroid Build Coastguard Worker     rsrDrawMeshPrimitive(rsc, (Mesh *)ism.p, primitiveIndex);
1057*e1eccf28SAndroid Build Coastguard Worker }
1058*e1eccf28SAndroid Build Coastguard Worker 
1059*e1eccf28SAndroid Build Coastguard Worker void rsgDrawMesh(::rs_mesh ism, uint primitiveIndex, uint start, uint len) {
1060*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1061*e1eccf28SAndroid Build Coastguard Worker     rsrDrawMeshPrimitiveRange(rsc, (Mesh *)ism.p, primitiveIndex, start, len);
1062*e1eccf28SAndroid Build Coastguard Worker }
1063*e1eccf28SAndroid Build Coastguard Worker 
1064*e1eccf28SAndroid Build Coastguard Worker void  rsgMeshComputeBoundingBox(::rs_mesh mesh,
1065*e1eccf28SAndroid Build Coastguard Worker                                 float *minX, float *minY, float *minZ,
1066*e1eccf28SAndroid Build Coastguard Worker                                 float *maxX, float *maxY, float *maxZ) {
1067*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1068*e1eccf28SAndroid Build Coastguard Worker     rsrMeshComputeBoundingBox(rsc, (Mesh *)mesh.p, minX, minY, minZ, maxX, maxY, maxZ);
1069*e1eccf28SAndroid Build Coastguard Worker }
1070*e1eccf28SAndroid Build Coastguard Worker 
1071*e1eccf28SAndroid Build Coastguard Worker void rsgClearColor(float r, float g, float b, float a) {
1072*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1073*e1eccf28SAndroid Build Coastguard Worker     rsrPrepareClear(rsc);
1074*e1eccf28SAndroid Build Coastguard Worker     rsdGLClearColor(rsc, r, g, b, a);
1075*e1eccf28SAndroid Build Coastguard Worker }
1076*e1eccf28SAndroid Build Coastguard Worker 
1077*e1eccf28SAndroid Build Coastguard Worker void rsgClearDepth(float value) {
1078*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1079*e1eccf28SAndroid Build Coastguard Worker     rsrPrepareClear(rsc);
1080*e1eccf28SAndroid Build Coastguard Worker     rsdGLClearDepth(rsc, value);
1081*e1eccf28SAndroid Build Coastguard Worker }
1082*e1eccf28SAndroid Build Coastguard Worker 
1083*e1eccf28SAndroid Build Coastguard Worker void rsgDrawText(const char *text, int x, int y) {
1084*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1085*e1eccf28SAndroid Build Coastguard Worker     rsrDrawText(rsc, text, x, y);
1086*e1eccf28SAndroid Build Coastguard Worker }
1087*e1eccf28SAndroid Build Coastguard Worker 
1088*e1eccf28SAndroid Build Coastguard Worker void rsgDrawText(::rs_allocation a, int x, int y) {
1089*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1090*e1eccf28SAndroid Build Coastguard Worker     rsrDrawTextAlloc(rsc, (Allocation *)a.p, x, y);
1091*e1eccf28SAndroid Build Coastguard Worker }
1092*e1eccf28SAndroid Build Coastguard Worker 
1093*e1eccf28SAndroid Build Coastguard Worker void rsgMeasureText(const char *text, int *left, int *right,
1094*e1eccf28SAndroid Build Coastguard Worker                     int *top, int *bottom) {
1095*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1096*e1eccf28SAndroid Build Coastguard Worker     rsrMeasureText(rsc, text, left, right, top, bottom);
1097*e1eccf28SAndroid Build Coastguard Worker }
1098*e1eccf28SAndroid Build Coastguard Worker 
1099*e1eccf28SAndroid Build Coastguard Worker void rsgMeasureText(::rs_allocation a, int *left, int *right,
1100*e1eccf28SAndroid Build Coastguard Worker                     int *top, int *bottom) {
1101*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1102*e1eccf28SAndroid Build Coastguard Worker     rsrMeasureTextAlloc(rsc, (Allocation *)a.p, left, right, top, bottom);
1103*e1eccf28SAndroid Build Coastguard Worker }
1104*e1eccf28SAndroid Build Coastguard Worker 
1105*e1eccf28SAndroid Build Coastguard Worker void rsgBindFont(::rs_font font) {
1106*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1107*e1eccf28SAndroid Build Coastguard Worker     rsrBindFont(rsc, (Font *)font.p);
1108*e1eccf28SAndroid Build Coastguard Worker }
1109*e1eccf28SAndroid Build Coastguard Worker 
1110*e1eccf28SAndroid Build Coastguard Worker void rsgFontColor(float r, float g, float b, float a) {
1111*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1112*e1eccf28SAndroid Build Coastguard Worker     rsrFontColor(rsc, r, g, b, a);
1113*e1eccf28SAndroid Build Coastguard Worker }
1114*e1eccf28SAndroid Build Coastguard Worker 
1115*e1eccf28SAndroid Build Coastguard Worker void rsgBindColorTarget(::rs_allocation a, uint slot) {
1116*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1117*e1eccf28SAndroid Build Coastguard Worker     rsrBindFrameBufferObjectColorTarget(rsc, (Allocation *)a.p, slot);
1118*e1eccf28SAndroid Build Coastguard Worker }
1119*e1eccf28SAndroid Build Coastguard Worker 
1120*e1eccf28SAndroid Build Coastguard Worker void rsgBindDepthTarget(::rs_allocation a) {
1121*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1122*e1eccf28SAndroid Build Coastguard Worker     rsrBindFrameBufferObjectDepthTarget(rsc, (Allocation *)a.p);
1123*e1eccf28SAndroid Build Coastguard Worker }
1124*e1eccf28SAndroid Build Coastguard Worker 
1125*e1eccf28SAndroid Build Coastguard Worker void rsgClearColorTarget(uint slot) {
1126*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1127*e1eccf28SAndroid Build Coastguard Worker     rsrClearFrameBufferObjectColorTarget(rsc, slot);
1128*e1eccf28SAndroid Build Coastguard Worker }
1129*e1eccf28SAndroid Build Coastguard Worker 
1130*e1eccf28SAndroid Build Coastguard Worker void rsgClearDepthTarget(void) {
1131*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1132*e1eccf28SAndroid Build Coastguard Worker     rsrClearFrameBufferObjectDepthTarget(rsc);
1133*e1eccf28SAndroid Build Coastguard Worker }
1134*e1eccf28SAndroid Build Coastguard Worker 
1135*e1eccf28SAndroid Build Coastguard Worker void rsgClearAllRenderTargets(void) {
1136*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1137*e1eccf28SAndroid Build Coastguard Worker     rsrClearFrameBufferObjectTargets(rsc);
1138*e1eccf28SAndroid Build Coastguard Worker }
1139*e1eccf28SAndroid Build Coastguard Worker 
1140*e1eccf28SAndroid Build Coastguard Worker void color(float r, float g, float b, float a) {
1141*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1142*e1eccf28SAndroid Build Coastguard Worker     rsrColor(rsc, r, g, b, a);
1143*e1eccf28SAndroid Build Coastguard Worker }
1144*e1eccf28SAndroid Build Coastguard Worker 
1145*e1eccf28SAndroid Build Coastguard Worker void rsgFinish(void) {
1146*e1eccf28SAndroid Build Coastguard Worker     Context *rsc = RsdCpuReference::getTlsContext();
1147*e1eccf28SAndroid Build Coastguard Worker     rsdGLFinish(rsc);
1148*e1eccf28SAndroid Build Coastguard Worker }
1149*e1eccf28SAndroid Build Coastguard Worker #endif
1150*e1eccf28SAndroid Build Coastguard Worker 
1151*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
1152*e1eccf28SAndroid Build Coastguard Worker // Debug routines
1153*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
1154*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, float f) {
1155*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
1156*e1eccf28SAndroid Build Coastguard Worker }
1157*e1eccf28SAndroid Build Coastguard Worker 
1158*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, float f1, float f2) {
1159*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f}", s, f1, f2);
1160*e1eccf28SAndroid Build Coastguard Worker }
1161*e1eccf28SAndroid Build Coastguard Worker 
1162*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, float f1, float f2, float f3) {
1163*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f, %f}", s, f1, f2, f3);
1164*e1eccf28SAndroid Build Coastguard Worker }
1165*e1eccf28SAndroid Build Coastguard Worker 
1166*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, float f1, float f2, float f3, float f4) {
1167*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
1168*e1eccf28SAndroid Build Coastguard Worker }
1169*e1eccf28SAndroid Build Coastguard Worker 
1170*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const float2 *f2) {
1171*e1eccf28SAndroid Build Coastguard Worker     float2 f = *f2;
1172*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f}", s, f.x, f.y);
1173*e1eccf28SAndroid Build Coastguard Worker }
1174*e1eccf28SAndroid Build Coastguard Worker 
1175*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const float3 *f3) {
1176*e1eccf28SAndroid Build Coastguard Worker     float3 f = *f3;
1177*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f, %f}", s, f.x, f.y, f.z);
1178*e1eccf28SAndroid Build Coastguard Worker }
1179*e1eccf28SAndroid Build Coastguard Worker 
1180*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const float4 *f4) {
1181*e1eccf28SAndroid Build Coastguard Worker     float4 f = *f4;
1182*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f, %f, %f}", s, f.x, f.y, f.z, f.w);
1183*e1eccf28SAndroid Build Coastguard Worker }
1184*e1eccf28SAndroid Build Coastguard Worker 
1185*e1eccf28SAndroid Build Coastguard Worker // Accept a half value converted to float.  This eliminates the need in the
1186*e1eccf28SAndroid Build Coastguard Worker // driver to properly support the half datatype (either by adding compiler flags
1187*e1eccf28SAndroid Build Coastguard Worker // for half or link against compiler_rt).
1188*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, float f, ushort us) {
1189*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f} {0x%hx}", s, f, us);
1190*e1eccf28SAndroid Build Coastguard Worker }
1191*e1eccf28SAndroid Build Coastguard Worker 
1192*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const float2 *f2, const ushort2 *us2) {
1193*e1eccf28SAndroid Build Coastguard Worker     float2 f = *f2;
1194*e1eccf28SAndroid Build Coastguard Worker     ushort2 us = *us2;
1195*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f %f} {0x%hx 0x%hx}", s, f.x, f.y, us.x, us.y);
1196*e1eccf28SAndroid Build Coastguard Worker }
1197*e1eccf28SAndroid Build Coastguard Worker 
1198*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const float3 *f3, const ushort3 *us3) {
1199*e1eccf28SAndroid Build Coastguard Worker     float3 f = *f3;
1200*e1eccf28SAndroid Build Coastguard Worker     ushort3 us = *us3;
1201*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f %f %f} {0x%hx 0x%hx 0x%hx}", s, f.x, f.y, f.z, us.x, us.y,
1202*e1eccf28SAndroid Build Coastguard Worker           us.z);
1203*e1eccf28SAndroid Build Coastguard Worker }
1204*e1eccf28SAndroid Build Coastguard Worker 
1205*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const float4 *f4, const ushort4 *us4) {
1206*e1eccf28SAndroid Build Coastguard Worker     float4 f = *f4;
1207*e1eccf28SAndroid Build Coastguard Worker     ushort4 us = *us4;
1208*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f %f %f %f} {0x%hx 0x%hx 0x%hx 0x%hx}", s, f.x, f.y, f.z, f.w,
1209*e1eccf28SAndroid Build Coastguard Worker           us.x, us.y, us.z, us.w);
1210*e1eccf28SAndroid Build Coastguard Worker }
1211*e1eccf28SAndroid Build Coastguard Worker 
1212*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, double d) {
1213*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
1214*e1eccf28SAndroid Build Coastguard Worker }
1215*e1eccf28SAndroid Build Coastguard Worker 
1216*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const double2 *d2) {
1217*e1eccf28SAndroid Build Coastguard Worker     double2 d = *d2;
1218*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f}", s, d.x, d.y);
1219*e1eccf28SAndroid Build Coastguard Worker }
1220*e1eccf28SAndroid Build Coastguard Worker 
1221*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const double3 *d3) {
1222*e1eccf28SAndroid Build Coastguard Worker     double3 d = *d3;
1223*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f, %f}", s, d.x, d.y, d.z);
1224*e1eccf28SAndroid Build Coastguard Worker }
1225*e1eccf28SAndroid Build Coastguard Worker 
1226*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const double4 *d4) {
1227*e1eccf28SAndroid Build Coastguard Worker     double4 d = *d4;
1228*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f, %f, %f}", s, d.x, d.y, d.z, d.w);
1229*e1eccf28SAndroid Build Coastguard Worker }
1230*e1eccf28SAndroid Build Coastguard Worker 
1231*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const rs_matrix4x4 *m) {
1232*e1eccf28SAndroid Build Coastguard Worker     float *f = (float *)m;
1233*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
1234*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
1235*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
1236*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
1237*e1eccf28SAndroid Build Coastguard Worker }
1238*e1eccf28SAndroid Build Coastguard Worker 
1239*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const rs_matrix3x3 *m) {
1240*e1eccf28SAndroid Build Coastguard Worker     float *f = (float *)m;
1241*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
1242*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
1243*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
1244*e1eccf28SAndroid Build Coastguard Worker }
1245*e1eccf28SAndroid Build Coastguard Worker 
1246*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const rs_matrix2x2 *m) {
1247*e1eccf28SAndroid Build Coastguard Worker     float *f = (float *)m;
1248*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%f, %f", s, f[0], f[2]);
1249*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s  %f, %f}",s, f[1], f[3]);
1250*e1eccf28SAndroid Build Coastguard Worker }
1251*e1eccf28SAndroid Build Coastguard Worker 
1252*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, char c) {
1253*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %hhd  0x%hhx", s, c, (unsigned char)c);
1254*e1eccf28SAndroid Build Coastguard Worker }
1255*e1eccf28SAndroid Build Coastguard Worker 
1256*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const char2 *c2) {
1257*e1eccf28SAndroid Build Coastguard Worker     char2 c = *c2;
1258*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%hhd, %hhd}  0x%hhx 0x%hhx", s, c.x, c.y, (unsigned char)c.x, (unsigned char)c.y);
1259*e1eccf28SAndroid Build Coastguard Worker }
1260*e1eccf28SAndroid Build Coastguard Worker 
1261*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const char3 *c3) {
1262*e1eccf28SAndroid Build Coastguard Worker     char3 c = *c3;
1263*e1eccf28SAndroid Build Coastguard Worker     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);
1264*e1eccf28SAndroid Build Coastguard Worker }
1265*e1eccf28SAndroid Build Coastguard Worker 
1266*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const char4 *c4) {
1267*e1eccf28SAndroid Build Coastguard Worker     char4 c = *c4;
1268*e1eccf28SAndroid Build Coastguard Worker     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);
1269*e1eccf28SAndroid Build Coastguard Worker }
1270*e1eccf28SAndroid Build Coastguard Worker 
1271*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, unsigned char c) {
1272*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %hhu  0x%hhx", s, c, c);
1273*e1eccf28SAndroid Build Coastguard Worker }
1274*e1eccf28SAndroid Build Coastguard Worker 
1275*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const uchar2 *c2) {
1276*e1eccf28SAndroid Build Coastguard Worker     uchar2 c = *c2;
1277*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%hhu, %hhu}  0x%hhx 0x%hhx", s, c.x, c.y, c.x, c.y);
1278*e1eccf28SAndroid Build Coastguard Worker }
1279*e1eccf28SAndroid Build Coastguard Worker 
1280*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const uchar3 *c3) {
1281*e1eccf28SAndroid Build Coastguard Worker     uchar3 c = *c3;
1282*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%hhu, %hhu, %hhu}  0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, c.x, c.y, c.z);
1283*e1eccf28SAndroid Build Coastguard Worker }
1284*e1eccf28SAndroid Build Coastguard Worker 
1285*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const uchar4 *c4) {
1286*e1eccf28SAndroid Build Coastguard Worker     uchar4 c = *c4;
1287*e1eccf28SAndroid Build Coastguard Worker     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);
1288*e1eccf28SAndroid Build Coastguard Worker }
1289*e1eccf28SAndroid Build Coastguard Worker 
1290*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, int16_t c) {
1291*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %hd  0x%hx", s, c, c);
1292*e1eccf28SAndroid Build Coastguard Worker }
1293*e1eccf28SAndroid Build Coastguard Worker 
1294*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const short2 *c2) {
1295*e1eccf28SAndroid Build Coastguard Worker     short2 c = *c2;
1296*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%hd, %hd}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
1297*e1eccf28SAndroid Build Coastguard Worker }
1298*e1eccf28SAndroid Build Coastguard Worker 
1299*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const short3 *c3) {
1300*e1eccf28SAndroid Build Coastguard Worker     short3 c = *c3;
1301*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%hd, %hd, %hd}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z);
1302*e1eccf28SAndroid Build Coastguard Worker }
1303*e1eccf28SAndroid Build Coastguard Worker 
1304*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const short4 *c4) {
1305*e1eccf28SAndroid Build Coastguard Worker     short4 c = *c4;
1306*e1eccf28SAndroid Build Coastguard Worker     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);
1307*e1eccf28SAndroid Build Coastguard Worker }
1308*e1eccf28SAndroid Build Coastguard Worker 
1309*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, uint16_t c) {
1310*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %hu  0x%hx", s, c, c);
1311*e1eccf28SAndroid Build Coastguard Worker }
1312*e1eccf28SAndroid Build Coastguard Worker 
1313*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ushort2 *c2) {
1314*e1eccf28SAndroid Build Coastguard Worker     ushort2 c = *c2;
1315*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%hu, %hu}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
1316*e1eccf28SAndroid Build Coastguard Worker }
1317*e1eccf28SAndroid Build Coastguard Worker 
1318*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ushort3 *c3) {
1319*e1eccf28SAndroid Build Coastguard Worker     ushort3 c = *c3;
1320*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%hu, %hu, %hu}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z);
1321*e1eccf28SAndroid Build Coastguard Worker }
1322*e1eccf28SAndroid Build Coastguard Worker 
1323*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ushort4 *c4) {
1324*e1eccf28SAndroid Build Coastguard Worker     ushort4 c = *c4;
1325*e1eccf28SAndroid Build Coastguard Worker     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);
1326*e1eccf28SAndroid Build Coastguard Worker }
1327*e1eccf28SAndroid Build Coastguard Worker 
1328*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, int i) {
1329*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %d  0x%x", s, i, i);
1330*e1eccf28SAndroid Build Coastguard Worker }
1331*e1eccf28SAndroid Build Coastguard Worker 
1332*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const int2 *i2) {
1333*e1eccf28SAndroid Build Coastguard Worker     int2 i = *i2;
1334*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%d, %d}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
1335*e1eccf28SAndroid Build Coastguard Worker }
1336*e1eccf28SAndroid Build Coastguard Worker 
1337*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const int3 *i3) {
1338*e1eccf28SAndroid Build Coastguard Worker     int3 i = *i3;
1339*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%d, %d, %d}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
1340*e1eccf28SAndroid Build Coastguard Worker }
1341*e1eccf28SAndroid Build Coastguard Worker 
1342*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const int4 *i4) {
1343*e1eccf28SAndroid Build Coastguard Worker     int4 i = *i4;
1344*e1eccf28SAndroid Build Coastguard Worker     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);
1345*e1eccf28SAndroid Build Coastguard Worker }
1346*e1eccf28SAndroid Build Coastguard Worker 
1347*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, unsigned int i) {
1348*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %u  0x%x", s, i, i);
1349*e1eccf28SAndroid Build Coastguard Worker }
1350*e1eccf28SAndroid Build Coastguard Worker 
1351*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const uint2 *i2) {
1352*e1eccf28SAndroid Build Coastguard Worker     uint2 i = *i2;
1353*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%u, %u}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
1354*e1eccf28SAndroid Build Coastguard Worker }
1355*e1eccf28SAndroid Build Coastguard Worker 
1356*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const uint3 *i3) {
1357*e1eccf28SAndroid Build Coastguard Worker     uint3 i = *i3;
1358*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%u, %u, %u}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
1359*e1eccf28SAndroid Build Coastguard Worker }
1360*e1eccf28SAndroid Build Coastguard Worker 
1361*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const uint4 *i4) {
1362*e1eccf28SAndroid Build Coastguard Worker     uint4 i = *i4;
1363*e1eccf28SAndroid Build Coastguard Worker     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);
1364*e1eccf28SAndroid Build Coastguard Worker }
1365*e1eccf28SAndroid Build Coastguard Worker 
1366*e1eccf28SAndroid Build Coastguard Worker template <typename T>
1367*e1eccf28SAndroid Build Coastguard Worker static inline long long LL(const T &x) {
1368*e1eccf28SAndroid Build Coastguard Worker     return static_cast<long long>(x);
1369*e1eccf28SAndroid Build Coastguard Worker }
1370*e1eccf28SAndroid Build Coastguard Worker 
1371*e1eccf28SAndroid Build Coastguard Worker template <typename T>
1372*e1eccf28SAndroid Build Coastguard Worker static inline unsigned long long LLu(const T &x) {
1373*e1eccf28SAndroid Build Coastguard Worker     return static_cast<unsigned long long>(x);
1374*e1eccf28SAndroid Build Coastguard Worker }
1375*e1eccf28SAndroid Build Coastguard Worker 
1376*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, long l) {
1377*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %lld  0x%llx", s, LL(l), LL(l));
1378*e1eccf28SAndroid Build Coastguard Worker }
1379*e1eccf28SAndroid Build Coastguard Worker 
1380*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, long long ll) {
1381*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %lld  0x%llx", s, LL(ll), LL(ll));
1382*e1eccf28SAndroid Build Coastguard Worker }
1383*e1eccf28SAndroid Build Coastguard Worker 
1384*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const long2 *c) {
1385*e1eccf28SAndroid Build Coastguard Worker     long2 ll = *c;
1386*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
1387*e1eccf28SAndroid Build Coastguard Worker }
1388*e1eccf28SAndroid Build Coastguard Worker 
1389*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const long3 *c) {
1390*e1eccf28SAndroid Build Coastguard Worker     long3 ll = *c;
1391*e1eccf28SAndroid Build Coastguard Worker     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));
1392*e1eccf28SAndroid Build Coastguard Worker }
1393*e1eccf28SAndroid Build Coastguard Worker 
1394*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const long4 *c) {
1395*e1eccf28SAndroid Build Coastguard Worker     long4 ll = *c;
1396*e1eccf28SAndroid Build Coastguard Worker     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));
1397*e1eccf28SAndroid Build Coastguard Worker }
1398*e1eccf28SAndroid Build Coastguard Worker 
1399*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, unsigned long l) {
1400*e1eccf28SAndroid Build Coastguard Worker     unsigned long long ll = l;
1401*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %llu  0x%llx", s, ll, ll);
1402*e1eccf28SAndroid Build Coastguard Worker }
1403*e1eccf28SAndroid Build Coastguard Worker 
1404*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, unsigned long long ll) {
1405*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %llu  0x%llx", s, ll, ll);
1406*e1eccf28SAndroid Build Coastguard Worker }
1407*e1eccf28SAndroid Build Coastguard Worker 
1408*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ulong2 *c) {
1409*e1eccf28SAndroid Build Coastguard Worker     ulong2 ll = *c;
1410*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
1411*e1eccf28SAndroid Build Coastguard Worker }
1412*e1eccf28SAndroid Build Coastguard Worker 
1413*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ulong3 *c) {
1414*e1eccf28SAndroid Build Coastguard Worker     ulong3 ll = *c;
1415*e1eccf28SAndroid Build Coastguard Worker     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));
1416*e1eccf28SAndroid Build Coastguard Worker }
1417*e1eccf28SAndroid Build Coastguard Worker 
1418*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ulong4 *c) {
1419*e1eccf28SAndroid Build Coastguard Worker     ulong4 ll = *c;
1420*e1eccf28SAndroid Build Coastguard Worker     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));
1421*e1eccf28SAndroid Build Coastguard Worker }
1422*e1eccf28SAndroid Build Coastguard Worker 
1423*e1eccf28SAndroid Build Coastguard Worker // FIXME: We need to export these function signatures for the compatibility
1424*e1eccf28SAndroid Build Coastguard Worker // library. The C++ name mangling that LLVM uses for ext_vector_type requires
1425*e1eccf28SAndroid Build Coastguard Worker // different versions for "long" vs. "long long". Note that the called
1426*e1eccf28SAndroid Build Coastguard Worker // functions are still using the appropriate 64-bit sizes.
1427*e1eccf28SAndroid Build Coastguard Worker 
1428*e1eccf28SAndroid Build Coastguard Worker #ifndef __LP64__
1429*e1eccf28SAndroid Build Coastguard Worker typedef long l2 __attribute__((ext_vector_type(2)));
1430*e1eccf28SAndroid Build Coastguard Worker typedef long l3 __attribute__((ext_vector_type(3)));
1431*e1eccf28SAndroid Build Coastguard Worker typedef long l4 __attribute__((ext_vector_type(4)));
1432*e1eccf28SAndroid Build Coastguard Worker typedef unsigned long ul2 __attribute__((ext_vector_type(2)));
1433*e1eccf28SAndroid Build Coastguard Worker typedef unsigned long ul3 __attribute__((ext_vector_type(3)));
1434*e1eccf28SAndroid Build Coastguard Worker typedef unsigned long ul4 __attribute__((ext_vector_type(4)));
1435*e1eccf28SAndroid Build Coastguard Worker 
1436*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const l2 *c) {
1437*e1eccf28SAndroid Build Coastguard Worker     long2 ll = *(const long2 *)c;
1438*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
1439*e1eccf28SAndroid Build Coastguard Worker }
1440*e1eccf28SAndroid Build Coastguard Worker 
1441*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const l3 *c) {
1442*e1eccf28SAndroid Build Coastguard Worker     long3 ll = *(const long3 *)c;
1443*e1eccf28SAndroid Build Coastguard Worker     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));
1444*e1eccf28SAndroid Build Coastguard Worker }
1445*e1eccf28SAndroid Build Coastguard Worker 
1446*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const l4 *c) {
1447*e1eccf28SAndroid Build Coastguard Worker     long4 ll = *(const long4 *)c;
1448*e1eccf28SAndroid Build Coastguard Worker     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));
1449*e1eccf28SAndroid Build Coastguard Worker }
1450*e1eccf28SAndroid Build Coastguard Worker 
1451*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ul2 *c) {
1452*e1eccf28SAndroid Build Coastguard Worker     ulong2 ll = *(const ulong2 *)c;
1453*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
1454*e1eccf28SAndroid Build Coastguard Worker }
1455*e1eccf28SAndroid Build Coastguard Worker 
1456*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ul3 *c) {
1457*e1eccf28SAndroid Build Coastguard Worker     ulong3 ll = *(const ulong3 *)c;
1458*e1eccf28SAndroid Build Coastguard Worker     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));
1459*e1eccf28SAndroid Build Coastguard Worker }
1460*e1eccf28SAndroid Build Coastguard Worker 
1461*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ul4 *c) {
1462*e1eccf28SAndroid Build Coastguard Worker     ulong4 ll = *(const ulong4 *)c;
1463*e1eccf28SAndroid Build Coastguard Worker     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));
1464*e1eccf28SAndroid Build Coastguard Worker }
1465*e1eccf28SAndroid Build Coastguard Worker #endif
1466*e1eccf28SAndroid Build Coastguard Worker 
1467*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const long2 ll) {
1468*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x), LL(ll.y));
1469*e1eccf28SAndroid Build Coastguard Worker }
1470*e1eccf28SAndroid Build Coastguard Worker 
1471*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const long3 ll) {
1472*e1eccf28SAndroid Build Coastguard Worker     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));
1473*e1eccf28SAndroid Build Coastguard Worker }
1474*e1eccf28SAndroid Build Coastguard Worker 
1475*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const long4 ll) {
1476*e1eccf28SAndroid Build Coastguard Worker     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));
1477*e1eccf28SAndroid Build Coastguard Worker }
1478*e1eccf28SAndroid Build Coastguard Worker 
1479*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ulong2 ll) {
1480*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x), LLu(ll.y));
1481*e1eccf28SAndroid Build Coastguard Worker }
1482*e1eccf28SAndroid Build Coastguard Worker 
1483*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ulong3 ll) {
1484*e1eccf28SAndroid Build Coastguard Worker     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));
1485*e1eccf28SAndroid Build Coastguard Worker }
1486*e1eccf28SAndroid Build Coastguard Worker 
1487*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const ulong4 ll) {
1488*e1eccf28SAndroid Build Coastguard Worker     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));
1489*e1eccf28SAndroid Build Coastguard Worker }
1490*e1eccf28SAndroid Build Coastguard Worker 
1491*e1eccf28SAndroid Build Coastguard Worker void rsDebug(const char *s, const void *p) {
1492*e1eccf28SAndroid Build Coastguard Worker     ALOGD("%s %p", s, p);
1493*e1eccf28SAndroid Build Coastguard Worker }
1494*e1eccf28SAndroid Build Coastguard Worker 
1495*e1eccf28SAndroid Build Coastguard Worker extern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name) {
1496*e1eccf28SAndroid Build Coastguard Worker // TODO: remove
1497*e1eccf28SAndroid Build Coastguard Worker     return nullptr;
1498*e1eccf28SAndroid Build Coastguard Worker }
1499