175f0d3110b04346b901771f96ce15cdbe907278fYang Ni/*
275f0d3110b04346b901771f96ce15cdbe907278fYang Ni * Copyright (C) 2011-2012 The Android Open Source Project
375f0d3110b04346b901771f96ce15cdbe907278fYang Ni *
475f0d3110b04346b901771f96ce15cdbe907278fYang Ni * Licensed under the Apache License, Version 2.0 (the "License");
575f0d3110b04346b901771f96ce15cdbe907278fYang Ni * you may not use this file except in compliance with the License.
675f0d3110b04346b901771f96ce15cdbe907278fYang Ni * You may obtain a copy of the License at
775f0d3110b04346b901771f96ce15cdbe907278fYang Ni *
875f0d3110b04346b901771f96ce15cdbe907278fYang Ni *      http://www.apache.org/licenses/LICENSE-2.0
975f0d3110b04346b901771f96ce15cdbe907278fYang Ni *
1075f0d3110b04346b901771f96ce15cdbe907278fYang Ni * Unless required by applicable law or agreed to in writing, software
1175f0d3110b04346b901771f96ce15cdbe907278fYang Ni * distributed under the License is distributed on an "AS IS" BASIS,
1275f0d3110b04346b901771f96ce15cdbe907278fYang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1375f0d3110b04346b901771f96ce15cdbe907278fYang Ni * See the License for the specific language governing permissions and
1475f0d3110b04346b901771f96ce15cdbe907278fYang Ni * limitations under the License.
1575f0d3110b04346b901771f96ce15cdbe907278fYang Ni */
1675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
1775f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include <time.h>
1875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
1975f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include "rsContext.h"
2075f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include "rsElement.h"
2175f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include "rsMatrix2x2.h"
2275f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include "rsMatrix3x3.h"
2375f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include "rsMatrix4x4.h"
2475f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include "rsRuntime.h"
2575f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include "rsScriptC.h"
2675f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include "rsType.h"
2775f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include "rsovAllocation.h"
2875f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include "rsovCore.h"
2975f0d3110b04346b901771f96ce15cdbe907278fYang Ni#include "rsovScript.h"
3075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
3175f0d3110b04346b901771f96ce15cdbe907278fYang Niusing namespace android;
3275f0d3110b04346b901771f96ce15cdbe907278fYang Niusing namespace android::renderscript;
3375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
3475f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef __fp16 half;
3575f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef half half2 __attribute__((ext_vector_type(2)));
3675f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef half half3 __attribute__((ext_vector_type(3)));
3775f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef half half4 __attribute__((ext_vector_type(4)));
3875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
3975f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef float float2 __attribute__((ext_vector_type(2)));
4075f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef float float3 __attribute__((ext_vector_type(3)));
4175f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef float float4 __attribute__((ext_vector_type(4)));
4275f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef double double2 __attribute__((ext_vector_type(2)));
4375f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef double double3 __attribute__((ext_vector_type(3)));
4475f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef double double4 __attribute__((ext_vector_type(4)));
4575f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef char char2 __attribute__((ext_vector_type(2)));
4675f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef char char3 __attribute__((ext_vector_type(3)));
4775f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef char char4 __attribute__((ext_vector_type(4)));
4875f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef unsigned char uchar2 __attribute__((ext_vector_type(2)));
4975f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef unsigned char uchar3 __attribute__((ext_vector_type(3)));
5075f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef unsigned char uchar4 __attribute__((ext_vector_type(4)));
5175f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef int16_t short2 __attribute__((ext_vector_type(2)));
5275f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef int16_t short3 __attribute__((ext_vector_type(3)));
5375f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef int16_t short4 __attribute__((ext_vector_type(4)));
5475f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint16_t ushort2 __attribute__((ext_vector_type(2)));
5575f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint16_t ushort3 __attribute__((ext_vector_type(3)));
5675f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint16_t ushort4 __attribute__((ext_vector_type(4)));
5775f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef int32_t int2 __attribute__((ext_vector_type(2)));
5875f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef int32_t int3 __attribute__((ext_vector_type(3)));
5975f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef int32_t int4 __attribute__((ext_vector_type(4)));
6075f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint32_t uint2 __attribute__((ext_vector_type(2)));
6175f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint32_t uint3 __attribute__((ext_vector_type(3)));
6275f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint32_t uint4 __attribute__((ext_vector_type(4)));
6375f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef int64_t long2 __attribute__((ext_vector_type(2)));
6475f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef int64_t long3 __attribute__((ext_vector_type(3)));
6575f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef int64_t long4 __attribute__((ext_vector_type(4)));
6675f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint64_t ulong2 __attribute__((ext_vector_type(2)));
6775f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint64_t ulong3 __attribute__((ext_vector_type(3)));
6875f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint64_t ulong4 __attribute__((ext_vector_type(4)));
6975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
7075f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint8_t uchar;
7175f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint16_t ushort;
7275f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint32_t uint;
7375f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef uint64_t ulong;
7475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
7575f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Add NOLINT to suppress wrong warnings from clang-tidy.
7675f0d3110b04346b901771f96ce15cdbe907278fYang Ni#ifndef __LP64__
7775f0d3110b04346b901771f96ce15cdbe907278fYang Ni#define OPAQUETYPE(t)   \
7875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  typedef struct {      \
7975f0d3110b04346b901771f96ce15cdbe907278fYang Ni    const int *const p; \
8075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  } __attribute__((packed, aligned(4))) t; /*NOLINT*/
8175f0d3110b04346b901771f96ce15cdbe907278fYang Ni#else
82700e68883c4324c15b380ff6724249f39d4f498cI-Jui (Ray) Sung#define OPAQUETYPE(t)     \
83700e68883c4324c15b380ff6724249f39d4f498cI-Jui (Ray) Sung  typedef struct {        \
84700e68883c4324c15b380ff6724249f39d4f498cI-Jui (Ray) Sung    const void *p;        \
85700e68883c4324c15b380ff6724249f39d4f498cI-Jui (Ray) Sung    const void *unused1;  \
86700e68883c4324c15b380ff6724249f39d4f498cI-Jui (Ray) Sung    const void *unused2;  \
87700e68883c4324c15b380ff6724249f39d4f498cI-Jui (Ray) Sung    const void *unused3;  \
8875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  } t; /*NOLINT*/
8975f0d3110b04346b901771f96ce15cdbe907278fYang Ni#endif
9075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
9175f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_element)
9275f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_type)
9375f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_allocation)
9475f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_sampler)
9575f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_script)
9675f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_script_call)
9775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
9875f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_program_fragment);
9975f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_program_store);
10075f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_program_vertex);
10175f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_program_raster);
10275f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_mesh);
10375f0d3110b04346b901771f96ce15cdbe907278fYang NiOPAQUETYPE(rs_font);
10475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
10575f0d3110b04346b901771f96ce15cdbe907278fYang Ni#undef OPAQUETYPE
10675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
10775f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef enum {
10875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // Empty to avoid conflicting definitions with RsAllocationCubemapFace
10975f0d3110b04346b901771f96ce15cdbe907278fYang Ni} rs_allocation_cubemap_face;
11075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
11175f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef enum {
11275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // Empty to avoid conflicting definitions with RsYuvFormat
11375f0d3110b04346b901771f96ce15cdbe907278fYang Ni} rs_yuv_format;
11475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
11575f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef enum {
11675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // Empty to avoid conflicting definitions with RsAllocationMipmapControl
11775f0d3110b04346b901771f96ce15cdbe907278fYang Ni} rs_allocation_mipmap_control;
11875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
11975f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef struct { unsigned int val; } rs_allocation_usage_type;
12075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
12175f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef struct {
12275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int tm_sec;    ///< seconds
12375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int tm_min;    ///< minutes
12475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int tm_hour;   ///< hours
12575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int tm_mday;   ///< day of the month
12675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int tm_mon;    ///< month
12775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int tm_year;   ///< year
12875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int tm_wday;   ///< day of the week
12975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int tm_yday;   ///< day of the year
13075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int tm_isdst;  ///< daylight savings time
13175f0d3110b04346b901771f96ce15cdbe907278fYang Ni} rs_tm;
13275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
13375f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Some RS functions are not threadsafe but can be called from an invoke
13475f0d3110b04346b901771f96ce15cdbe907278fYang Ni// function.  Instead of summarily marking scripts that call these functions as
13575f0d3110b04346b901771f96ce15cdbe907278fYang Ni// not-threadable we detect calls to them in the driver and sends a fatal error
13675f0d3110b04346b901771f96ce15cdbe907278fYang Ni// message.
13775f0d3110b04346b901771f96ce15cdbe907278fYang Nistatic bool failIfInKernel(Context *rsc, const char *funcName) {
13875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  RSoVHal *dc = (RSoVHal *)rsc->mHal.drv;
13975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  RsdCpuReference *impl = (RsdCpuReference *)dc->mCpuRef;
14075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
14175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (impl->getInKernel()) {
14275f0d3110b04346b901771f96ce15cdbe907278fYang Ni    char buf[256];
14375f0d3110b04346b901771f96ce15cdbe907278fYang Ni    snprintf(buf, sizeof(buf),
14475f0d3110b04346b901771f96ce15cdbe907278fYang Ni             "Error: Call to unsupported function %s "
14575f0d3110b04346b901771f96ce15cdbe907278fYang Ni             "in kernel",
14675f0d3110b04346b901771f96ce15cdbe907278fYang Ni             funcName);
14775f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsc->setError(RS_ERROR_FATAL_DRIVER, buf);
14875f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return true;
14975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
15075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return false;
15175f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
15275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
15375f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
15475f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Allocation routines
15575f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
15675f0d3110b04346b901771f96ce15cdbe907278fYang Ni#if defined(__i386__) || (defined(__mips__) && __mips == 32)
15775f0d3110b04346b901771f96ce15cdbe907278fYang Ni// i386 and MIPS32 have different struct return passing to ARM; emulate with a
15875f0d3110b04346b901771f96ce15cdbe907278fYang Ni// pointer
15975f0d3110b04346b901771f96ce15cdbe907278fYang Niconst Allocation *rsGetAllocation(const void *ptr) {
16075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
16175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  const Script *sc = RsdCpuReference::getTlsScript();
16275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Allocation *alloc = rsovScriptGetAllocationForPointer(rsc, sc, ptr);
16375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  android::renderscript::rs_allocation obj = {0};
16475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  alloc->callUpdateCacheObject(rsc, &obj);
16575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return (Allocation *)obj.p;
16675f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
16775f0d3110b04346b901771f96ce15cdbe907278fYang Ni#else
16875f0d3110b04346b901771f96ce15cdbe907278fYang Niconst android::renderscript::rs_allocation rsGetAllocation(const void *ptr) {
16975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
17075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  const Script *sc = RsdCpuReference::getTlsScript();
17175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Allocation *alloc = rsovScriptGetAllocationForPointer(rsc, sc, ptr);
17275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
17375f0d3110b04346b901771f96ce15cdbe907278fYang Ni#ifndef __LP64__  // ARMv7
17475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  android::renderscript::rs_allocation obj = {0};
17575f0d3110b04346b901771f96ce15cdbe907278fYang Ni#else             // AArch64/x86_64/MIPS64
17675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  android::renderscript::rs_allocation obj = {0, 0, 0, 0};
17775f0d3110b04346b901771f96ce15cdbe907278fYang Ni#endif
17875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  alloc->callUpdateCacheObject(rsc, &obj);
17975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return obj;
18075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
18175f0d3110b04346b901771f96ce15cdbe907278fYang Ni#endif
18275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
18375f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid __attribute__((overloadable)) rsAllocationIoSend(::rs_allocation a) {
18475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
18575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (failIfInKernel(rsc, "rsAllocationIoSend")) return;
18675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsrAllocationIoSend(rsc, (Allocation *)a.p);
18775f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
18875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
18975f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid __attribute__((overloadable)) rsAllocationIoReceive(::rs_allocation a) {
19075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
19175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (failIfInKernel(rsc, "rsAllocationIoReceive")) return;
19275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsrAllocationIoReceive(rsc, (Allocation *)a.p);
19375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
19475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
19575f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid __attribute__((overloadable))
19675f0d3110b04346b901771f96ce15cdbe907278fYang NirsAllocationCopy1DRange(::rs_allocation dstAlloc, uint32_t dstOff,
19775f0d3110b04346b901771f96ce15cdbe907278fYang Ni                        uint32_t dstMip, uint32_t count,
19875f0d3110b04346b901771f96ce15cdbe907278fYang Ni                        ::rs_allocation srcAlloc, uint32_t srcOff,
19975f0d3110b04346b901771f96ce15cdbe907278fYang Ni                        uint32_t srcMip) {
20075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
20175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (failIfInKernel(rsc, "rsAllocationCopy1DRange")) return;
20275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsrAllocationCopy1DRange(rsc, (Allocation *)dstAlloc.p, dstOff, dstMip, count,
20375f0d3110b04346b901771f96ce15cdbe907278fYang Ni                           (Allocation *)srcAlloc.p, srcOff, srcMip);
20475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
20575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
20675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid __attribute__((overloadable))
20775f0d3110b04346b901771f96ce15cdbe907278fYang NirsAllocationCopy2DRange(::rs_allocation dstAlloc, uint32_t dstXoff,
20875f0d3110b04346b901771f96ce15cdbe907278fYang Ni                        uint32_t dstYoff, uint32_t dstMip,
20975f0d3110b04346b901771f96ce15cdbe907278fYang Ni                        rs_allocation_cubemap_face dstFace, uint32_t width,
21075f0d3110b04346b901771f96ce15cdbe907278fYang Ni                        uint32_t height, ::rs_allocation srcAlloc,
21175f0d3110b04346b901771f96ce15cdbe907278fYang Ni                        uint32_t srcXoff, uint32_t srcYoff, uint32_t srcMip,
21275f0d3110b04346b901771f96ce15cdbe907278fYang Ni                        rs_allocation_cubemap_face srcFace) {
21375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
21475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (failIfInKernel(rsc, "rsAllocationCopy2DRange")) return;
21575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsrAllocationCopy2DRange(
21675f0d3110b04346b901771f96ce15cdbe907278fYang Ni      rsc, (Allocation *)dstAlloc.p, dstXoff, dstYoff, dstMip, dstFace, width,
21775f0d3110b04346b901771f96ce15cdbe907278fYang Ni      height, (Allocation *)srcAlloc.p, srcXoff, srcYoff, srcMip, srcFace);
21875f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
21975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
22075f0d3110b04346b901771f96ce15cdbe907278fYang Nistatic android::renderscript::rs_element CreateElement(RsDataType dt,
22175f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                                       RsDataKind dk,
22275f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                                       bool isNormalized,
22375f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                                       uint32_t vecSize) {
22475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
22575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
22675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // No need for validation here.  The rsCreateElement overload below is not
22775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // exposed to the Script.  The Element-creation APIs call this function in a
22875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // consistent manner and rsComponent.cpp asserts on any inconsistency.
22975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Element *element =
23075f0d3110b04346b901771f96ce15cdbe907278fYang Ni      (Element *)rsrElementCreate(rsc, dt, dk, isNormalized, vecSize);
23175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  android::renderscript::rs_element obj = {};
23275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (element == nullptr) return obj;
23375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  element->callUpdateCacheObject(rsc, &obj);
23475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
23575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // Any new rsObject created from inside a script should have the usrRefCount
23675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // initialized to 0 and the sysRefCount initialized to 1.
23775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  element->incSysRef();
23875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  element->decUserRef();
23975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
24075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return obj;
24175f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
24275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
24375f0d3110b04346b901771f96ce15cdbe907278fYang Nistatic android::renderscript::rs_type CreateType(RsElement element,
24475f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                                 uint32_t dimX, uint32_t dimY,
24575f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                                 uint32_t dimZ, bool mipmaps,
24675f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                                 bool faces,
24775f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                                 uint32_t yuv_format) {
24875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
24975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  android::renderscript::rs_type obj = {};
25075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
25175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (element == nullptr) {
25275f0d3110b04346b901771f96ce15cdbe907278fYang Ni    ALOGE("rs_type creation error: Invalid element");
25375f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return obj;
25475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
25575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
25675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // validate yuv_format
25775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  RsYuvFormat yuv = (RsYuvFormat)yuv_format;
25875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (yuv != RS_YUV_NONE && yuv != RS_YUV_YV12 && yuv != RS_YUV_NV21 &&
25975f0d3110b04346b901771f96ce15cdbe907278fYang Ni      yuv != RS_YUV_420_888) {
26075f0d3110b04346b901771f96ce15cdbe907278fYang Ni    ALOGE("rs_type creation error: Invalid yuv_format %d\n", yuv_format);
26175f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return obj;
26275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
26375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
26475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // validate consistency of shape parameters
26575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (dimZ > 0) {
26675f0d3110b04346b901771f96ce15cdbe907278fYang Ni    if (dimX < 1 || dimY < 1) {
26775f0d3110b04346b901771f96ce15cdbe907278fYang Ni      ALOGE(
26875f0d3110b04346b901771f96ce15cdbe907278fYang Ni          "rs_type creation error: Both X and Y dimension required "
26975f0d3110b04346b901771f96ce15cdbe907278fYang Ni          "when Z is present.");
27075f0d3110b04346b901771f96ce15cdbe907278fYang Ni      return obj;
27175f0d3110b04346b901771f96ce15cdbe907278fYang Ni    }
27275f0d3110b04346b901771f96ce15cdbe907278fYang Ni    if (mipmaps) {
27375f0d3110b04346b901771f96ce15cdbe907278fYang Ni      ALOGE("rs_type creation error: mipmap control requires 2D types");
27475f0d3110b04346b901771f96ce15cdbe907278fYang Ni      return obj;
27575f0d3110b04346b901771f96ce15cdbe907278fYang Ni    }
27675f0d3110b04346b901771f96ce15cdbe907278fYang Ni    if (faces) {
27775f0d3110b04346b901771f96ce15cdbe907278fYang Ni      ALOGE("rs_type creation error: Cube maps require 2D types");
27875f0d3110b04346b901771f96ce15cdbe907278fYang Ni      return obj;
27975f0d3110b04346b901771f96ce15cdbe907278fYang Ni    }
28075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
28175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (dimY > 0 && dimX < 1) {
28275f0d3110b04346b901771f96ce15cdbe907278fYang Ni    ALOGE(
28375f0d3110b04346b901771f96ce15cdbe907278fYang Ni        "rs_type creation error: X dimension required when Y is "
28475f0d3110b04346b901771f96ce15cdbe907278fYang Ni        "present.");
28575f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return obj;
28675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
28775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (mipmaps && dimY < 1) {
28875f0d3110b04346b901771f96ce15cdbe907278fYang Ni    ALOGE("rs_type creation error: mipmap control require 2D Types.");
28975f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return obj;
29075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
29175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (faces && dimY < 1) {
29275f0d3110b04346b901771f96ce15cdbe907278fYang Ni    ALOGE("rs_type creation error: Cube maps require 2D Types.");
29375f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return obj;
29475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
29575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (yuv_format != RS_YUV_NONE) {
29675f0d3110b04346b901771f96ce15cdbe907278fYang Ni    if (dimZ != 0 || dimY == 0 || faces || mipmaps) {
29775f0d3110b04346b901771f96ce15cdbe907278fYang Ni      ALOGE("rs_type creation error: YUV only supports basic 2D.");
29875f0d3110b04346b901771f96ce15cdbe907278fYang Ni      return obj;
29975f0d3110b04346b901771f96ce15cdbe907278fYang Ni    }
30075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
30175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
30275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Type *type = (Type *)rsrTypeCreate(rsc, element, dimX, dimY, dimZ, mipmaps,
30375f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                     faces, yuv_format);
30475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (type == nullptr) return obj;
30575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  type->callUpdateCacheObject(rsc, &obj);
30675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
30775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // Any new rsObject created from inside a script should have the usrRefCount
30875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // initialized to 0 and the sysRefCount initialized to 1.
30975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  type->incSysRef();
31075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  type->decUserRef();
31175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
31275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return obj;
31375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
31475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
31575f0d3110b04346b901771f96ce15cdbe907278fYang Nistatic android::renderscript::rs_allocation CreateAllocation(
31675f0d3110b04346b901771f96ce15cdbe907278fYang Ni    RsType type, RsAllocationMipmapControl mipmaps, uint32_t usages,
31775f0d3110b04346b901771f96ce15cdbe907278fYang Ni    void *ptr) {
31875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
31975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  android::renderscript::rs_allocation obj = {};
32075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
32175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (type == nullptr) {
32275f0d3110b04346b901771f96ce15cdbe907278fYang Ni    ALOGE("rs_allocation creation error: Invalid type");
32375f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return obj;
32475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
32575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
32675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  uint32_t validUsages =
32775f0d3110b04346b901771f96ce15cdbe907278fYang Ni      RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
32875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (usages & ~validUsages) {
32975f0d3110b04346b901771f96ce15cdbe907278fYang Ni    ALOGE("rs_allocation creation error: Invalid usage flag");
33075f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return obj;
33175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
33275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
33375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Allocation *alloc = (Allocation *)rsrAllocationCreateTyped(
33475f0d3110b04346b901771f96ce15cdbe907278fYang Ni      rsc, type, mipmaps, usages, (uintptr_t)ptr);
33575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (alloc == nullptr) return obj;
33675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  alloc->callUpdateCacheObject(rsc, &obj);
33775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
33875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // Any new rsObject created from inside a script should have the usrRefCount
33975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  // initialized to 0 and the sysRefCount initialized to 1.
34075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  alloc->incSysRef();
34175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  alloc->decUserRef();
34275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
34375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return obj;
34475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
34575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
34675f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Define rsCreateElement, rsCreateType and rsCreateAllocation entry points
34775f0d3110b04346b901771f96ce15cdbe907278fYang Ni// differently for 32-bit x86 and Mips.  The definitions for ARM32 and all
34875f0d3110b04346b901771f96ce15cdbe907278fYang Ni// 64-bit architectures is further below.
34975f0d3110b04346b901771f96ce15cdbe907278fYang Ni#if defined(__i386__) || (defined(__mips__) && __mips == 32)
35075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
35175f0d3110b04346b901771f96ce15cdbe907278fYang Ni// The calling convention for the driver on 32-bit x86 and Mips returns
35275f0d3110b04346b901771f96ce15cdbe907278fYang Ni// rs_element etc. as a stack-return parameter.  The Script uses ARM32 calling
35375f0d3110b04346b901771f96ce15cdbe907278fYang Ni// conventions that return the structs in a register.  To match this convention,
35475f0d3110b04346b901771f96ce15cdbe907278fYang Ni// emulate the return value using a pointer.
35575f0d3110b04346b901771f96ce15cdbe907278fYang NiElement *rsCreateElement(int32_t dt, int32_t dk, bool isNormalized,
35675f0d3110b04346b901771f96ce15cdbe907278fYang Ni                         uint32_t vecSize) {
35775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  android::renderscript::rs_element obj =
35875f0d3110b04346b901771f96ce15cdbe907278fYang Ni      CreateElement((RsDataType)dt, (RsDataKind)dk, isNormalized, vecSize);
35975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return (Element *)obj.p;
36075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
36175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
36275f0d3110b04346b901771f96ce15cdbe907278fYang NiType *rsCreateType(::rs_element element, uint32_t dimX, uint32_t dimY,
36375f0d3110b04346b901771f96ce15cdbe907278fYang Ni                   uint32_t dimZ, bool mipmaps, bool faces,
36475f0d3110b04346b901771f96ce15cdbe907278fYang Ni                   rs_yuv_format yuv_format) {
36575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  android::renderscript::rs_type obj =
36675f0d3110b04346b901771f96ce15cdbe907278fYang Ni      CreateType((RsElement)element.p, dimX, dimY, dimZ, mipmaps, faces,
36775f0d3110b04346b901771f96ce15cdbe907278fYang Ni                 (RsYuvFormat)yuv_format);
36875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return (Type *)obj.p;
36975f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
37075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
37175f0d3110b04346b901771f96ce15cdbe907278fYang NiAllocation *rsCreateAllocation(::rs_type type,
37275f0d3110b04346b901771f96ce15cdbe907278fYang Ni                               rs_allocation_mipmap_control mipmaps,
37375f0d3110b04346b901771f96ce15cdbe907278fYang Ni                               uint32_t usages, void *ptr) {
37475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  android::renderscript::rs_allocation obj;
37575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  obj = CreateAllocation((RsType)type.p, (RsAllocationMipmapControl)mipmaps,
37675f0d3110b04346b901771f96ce15cdbe907278fYang Ni                         usages, ptr);
37775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return (Allocation *)obj.p;
37875f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
37975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
38075f0d3110b04346b901771f96ce15cdbe907278fYang Ni#else
38175f0d3110b04346b901771f96ce15cdbe907278fYang Niandroid::renderscript::rs_element rsCreateElement(int32_t dt, int32_t dk,
38275f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                                  bool isNormalized,
38375f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                                  uint32_t vecSize) {
38475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return CreateElement((RsDataType)dt, (RsDataKind)dk, isNormalized, vecSize);
38575f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
38675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
38775f0d3110b04346b901771f96ce15cdbe907278fYang Niandroid::renderscript::rs_type rsCreateType(::rs_element element, uint32_t dimX,
38875f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                            uint32_t dimY, uint32_t dimZ,
38975f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                            bool mipmaps, bool faces,
39075f0d3110b04346b901771f96ce15cdbe907278fYang Ni                                            rs_yuv_format yuv_format) {
39175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return CreateType((RsElement)element.p, dimX, dimY, dimZ, mipmaps, faces,
39275f0d3110b04346b901771f96ce15cdbe907278fYang Ni                    yuv_format);
39375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
39475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
39575f0d3110b04346b901771f96ce15cdbe907278fYang Niandroid::renderscript::rs_allocation rsCreateAllocation(
39675f0d3110b04346b901771f96ce15cdbe907278fYang Ni    ::rs_type type, rs_allocation_mipmap_control mipmaps, uint32_t usages,
39775f0d3110b04346b901771f96ce15cdbe907278fYang Ni    void *ptr) {
39875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return CreateAllocation((RsType)type.p, (RsAllocationMipmapControl)mipmaps,
39975f0d3110b04346b901771f96ce15cdbe907278fYang Ni                          usages, ptr);
40075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
40175f0d3110b04346b901771f96ce15cdbe907278fYang Ni#endif
40275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
40375f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
40475f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Object routines
40575f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
40675f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Add NOLINT to suppress wrong warnings from clang-tidy.
40775f0d3110b04346b901771f96ce15cdbe907278fYang Ni#define IS_CLEAR_SET_OBJ(t)                                                  \
40875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  bool rsIsObject(t src) { return src.p != nullptr; }                        \
40975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void __attribute__((overloadable)) rsClearObject(t *dst) { /*NOLINT*/      \
41075f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsrClearObject(reinterpret_cast<rs_object_base *>(dst));                 \
41175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }                                                                          \
41275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void __attribute__((overloadable)) rsSetObject(t *dst, t src) { /*NOLINT*/ \
41375f0d3110b04346b901771f96ce15cdbe907278fYang Ni    Context *rsc = RsdCpuReference::getTlsContext();                         \
41475f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsrSetObject(rsc, reinterpret_cast<rs_object_base *>(dst),               \
41575f0d3110b04346b901771f96ce15cdbe907278fYang Ni                 (ObjectBase *)src.p);                                       \
41675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
41775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
41875f0d3110b04346b901771f96ce15cdbe907278fYang NiIS_CLEAR_SET_OBJ(::rs_element)
41975f0d3110b04346b901771f96ce15cdbe907278fYang NiIS_CLEAR_SET_OBJ(::rs_type)
42075f0d3110b04346b901771f96ce15cdbe907278fYang NiIS_CLEAR_SET_OBJ(::rs_allocation)
42175f0d3110b04346b901771f96ce15cdbe907278fYang NiIS_CLEAR_SET_OBJ(::rs_sampler)
42275f0d3110b04346b901771f96ce15cdbe907278fYang NiIS_CLEAR_SET_OBJ(::rs_script)
42375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
42475f0d3110b04346b901771f96ce15cdbe907278fYang NiIS_CLEAR_SET_OBJ(::rs_mesh)
42575f0d3110b04346b901771f96ce15cdbe907278fYang NiIS_CLEAR_SET_OBJ(::rs_program_fragment)
42675f0d3110b04346b901771f96ce15cdbe907278fYang NiIS_CLEAR_SET_OBJ(::rs_program_vertex)
42775f0d3110b04346b901771f96ce15cdbe907278fYang NiIS_CLEAR_SET_OBJ(::rs_program_raster)
42875f0d3110b04346b901771f96ce15cdbe907278fYang NiIS_CLEAR_SET_OBJ(::rs_program_store)
42975f0d3110b04346b901771f96ce15cdbe907278fYang NiIS_CLEAR_SET_OBJ(::rs_font)
43075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
43175f0d3110b04346b901771f96ce15cdbe907278fYang Ni#undef IS_CLEAR_SET_OBJ
43275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
43375f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
43475f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Element routines
43575f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
43675f0d3110b04346b901771f96ce15cdbe907278fYang Nistatic void *ElementAt(Allocation *a, RsDataType dt, uint32_t vecSize,
43775f0d3110b04346b901771f96ce15cdbe907278fYang Ni                       uint32_t x, uint32_t y, uint32_t z) {
43875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
43975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  const Type *t = a->getType();
44075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  const Element *e = t->getElement();
44175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
44275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  char buf[256];
44375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (x && (x >= t->getLODDimX(0))) {
44475f0d3110b04346b901771f96ce15cdbe907278fYang Ni    snprintf(buf, sizeof(buf), "Out range ElementAt X %i of %i", x,
44575f0d3110b04346b901771f96ce15cdbe907278fYang Ni             t->getLODDimX(0));
44675f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
44775f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return nullptr;
44875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
44975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
45075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (y && (y >= t->getLODDimY(0))) {
45175f0d3110b04346b901771f96ce15cdbe907278fYang Ni    snprintf(buf, sizeof(buf), "Out range ElementAt Y %i of %i", y,
45275f0d3110b04346b901771f96ce15cdbe907278fYang Ni             t->getLODDimY(0));
45375f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
45475f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return nullptr;
45575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
45675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
45775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (z && (z >= t->getLODDimZ(0))) {
45875f0d3110b04346b901771f96ce15cdbe907278fYang Ni    snprintf(buf, sizeof(buf), "Out range ElementAt Z %i of %i", z,
45975f0d3110b04346b901771f96ce15cdbe907278fYang Ni             t->getLODDimZ(0));
46075f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
46175f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return nullptr;
46275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
46375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
46475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (vecSize > 0) {
46575f0d3110b04346b901771f96ce15cdbe907278fYang Ni    if (vecSize != e->getVectorSize()) {
46675f0d3110b04346b901771f96ce15cdbe907278fYang Ni      snprintf(buf, sizeof(buf), "Vector size mismatch for ElementAt %i of %i",
46775f0d3110b04346b901771f96ce15cdbe907278fYang Ni               vecSize, e->getVectorSize());
46875f0d3110b04346b901771f96ce15cdbe907278fYang Ni      rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
46975f0d3110b04346b901771f96ce15cdbe907278fYang Ni      return nullptr;
47075f0d3110b04346b901771f96ce15cdbe907278fYang Ni    }
47175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
47275f0d3110b04346b901771f96ce15cdbe907278fYang Ni    if (dt != e->getType()) {
47375f0d3110b04346b901771f96ce15cdbe907278fYang Ni      snprintf(buf, sizeof(buf), "Data type mismatch for ElementAt %i of %i",
47475f0d3110b04346b901771f96ce15cdbe907278fYang Ni               dt, e->getType());
47575f0d3110b04346b901771f96ce15cdbe907278fYang Ni      rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
47675f0d3110b04346b901771f96ce15cdbe907278fYang Ni      return nullptr;
47775f0d3110b04346b901771f96ce15cdbe907278fYang Ni    }
47875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
47975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
48075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
48175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  const uint32_t eSize = e->getSizeBytes();
48275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  const uint32_t stride = a->mHal.drvState.lod[0].stride;
48375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  const uint32_t dimY = a->mHal.drvState.lod[0].dimY;
48475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return &p[(x * eSize) + (y * stride) + (z * stride * dimY)];
48575f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
48675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
48775f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x, uint32_t y,
48875f0d3110b04346b901771f96ce15cdbe907278fYang Ni                    uint32_t z) {
48975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  const Type *t = const_cast<Allocation *>((Allocation *)a.p)->getType();
49075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  const Element *e = t->getElement();
49175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void *tmp = ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
49275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (tmp != nullptr) memcpy(tmp, ptr, e->getSizeBytes());
49375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
49475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
49575f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x,
49675f0d3110b04346b901771f96ce15cdbe907278fYang Ni                    uint32_t y) {
49775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsSetElementAt(a, ptr, x, y, 0);
49875f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
49975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
50075f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsSetElementAt(::rs_allocation a, const void *ptr, uint32_t x) {
50175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsSetElementAt(a, ptr, x, 0, 0);
50275f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
50375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
50475f0d3110b04346b901771f96ce15cdbe907278fYang Niconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y,
50575f0d3110b04346b901771f96ce15cdbe907278fYang Ni                           uint32_t z) {
50675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return ElementAt((Allocation *)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
50775f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
50875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
50975f0d3110b04346b901771f96ce15cdbe907278fYang Niconst void *rsGetElementAt(::rs_allocation a, uint32_t x, uint32_t y) {
51075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return rsGetElementAt(a, x, y, 0);
51175f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
51275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
51375f0d3110b04346b901771f96ce15cdbe907278fYang Niconst void *rsGetElementAt(::rs_allocation a, uint32_t x) {
51475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return rsGetElementAt(a, x, 0, 0);
51575f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
51675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
51775f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Add NOLINT to suppress wrong warnings from clang-tidy.
51875f0d3110b04346b901771f96ce15cdbe907278fYang Ni#define ELEMENT_AT(T, DT, VS)                                                 \
51975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x,        \
52075f0d3110b04346b901771f96ce15cdbe907278fYang Ni                          uint32_t y, uint32_t z) {                           \
52175f0d3110b04346b901771f96ce15cdbe907278fYang Ni    void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z);                  \
52275f0d3110b04346b901771f96ce15cdbe907278fYang Ni    if (r != nullptr)                                                         \
52375f0d3110b04346b901771f96ce15cdbe907278fYang Ni      ((T *)r)[0] = *val;                                                     \
52475f0d3110b04346b901771f96ce15cdbe907278fYang Ni    else                                                                      \
52575f0d3110b04346b901771f96ce15cdbe907278fYang Ni      ALOGE("Error from %s", __PRETTY_FUNCTION__);                            \
52675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }                                                                           \
52775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x,        \
52875f0d3110b04346b901771f96ce15cdbe907278fYang Ni                          uint32_t y) {                                       \
52975f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsSetElementAt_##T(a, val, x, y, 0);                                      \
53075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }                                                                           \
53175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsSetElementAt_##T(::rs_allocation a, const T *val, uint32_t x) {      \
53275f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsSetElementAt_##T(a, val, x, 0, 0);                                      \
53375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }                                                                           \
53475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x, uint32_t y,  \
53575f0d3110b04346b901771f96ce15cdbe907278fYang Ni                          uint32_t z) { /*NOLINT*/                            \
53675f0d3110b04346b901771f96ce15cdbe907278fYang Ni    void *r = ElementAt((Allocation *)a.p, DT, VS, x, y, z);                  \
53775f0d3110b04346b901771f96ce15cdbe907278fYang Ni    if (r != nullptr)                                                         \
53875f0d3110b04346b901771f96ce15cdbe907278fYang Ni      *val = ((T *)r)[0];                                                     \
53975f0d3110b04346b901771f96ce15cdbe907278fYang Ni    else                                                                      \
54075f0d3110b04346b901771f96ce15cdbe907278fYang Ni      ALOGE("Error from %s", __PRETTY_FUNCTION__);                            \
54175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }                                                                           \
54275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x,              \
54375f0d3110b04346b901771f96ce15cdbe907278fYang Ni                          uint32_t y) { /*NOLINT*/                            \
54475f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsGetElementAt_##T(a, val, x, y, 0);                                      \
54575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }                                                                           \
54675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsGetElementAt_##T(::rs_allocation a, T *val, uint32_t x) { /*NOLINT*/ \
54775f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsGetElementAt_##T(a, val, x, 0, 0);                                      \
54875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
54975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
55075f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(char, RS_TYPE_SIGNED_8, 1)
55175f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(char2, RS_TYPE_SIGNED_8, 2)
55275f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(char3, RS_TYPE_SIGNED_8, 3)
55375f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(char4, RS_TYPE_SIGNED_8, 4)
55475f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(uchar, RS_TYPE_UNSIGNED_8, 1)
55575f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(uchar2, RS_TYPE_UNSIGNED_8, 2)
55675f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(uchar3, RS_TYPE_UNSIGNED_8, 3)
55775f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(uchar4, RS_TYPE_UNSIGNED_8, 4)
55875f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(short, RS_TYPE_SIGNED_16, 1)
55975f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(short2, RS_TYPE_SIGNED_16, 2)
56075f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(short3, RS_TYPE_SIGNED_16, 3)
56175f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(short4, RS_TYPE_SIGNED_16, 4)
56275f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(ushort, RS_TYPE_UNSIGNED_16, 1)
56375f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(ushort2, RS_TYPE_UNSIGNED_16, 2)
56475f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(ushort3, RS_TYPE_UNSIGNED_16, 3)
56575f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(ushort4, RS_TYPE_UNSIGNED_16, 4)
56675f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(int, RS_TYPE_SIGNED_32, 1)
56775f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(int2, RS_TYPE_SIGNED_32, 2)
56875f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(int3, RS_TYPE_SIGNED_32, 3)
56975f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(int4, RS_TYPE_SIGNED_32, 4)
57075f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(uint, RS_TYPE_UNSIGNED_32, 1)
57175f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(uint2, RS_TYPE_UNSIGNED_32, 2)
57275f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(uint3, RS_TYPE_UNSIGNED_32, 3)
57375f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(uint4, RS_TYPE_UNSIGNED_32, 4)
57475f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(long, RS_TYPE_SIGNED_64, 1)
57575f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(long2, RS_TYPE_SIGNED_64, 2)
57675f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(long3, RS_TYPE_SIGNED_64, 3)
57775f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(long4, RS_TYPE_SIGNED_64, 4)
57875f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(ulong, RS_TYPE_UNSIGNED_64, 1)
57975f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(ulong2, RS_TYPE_UNSIGNED_64, 2)
58075f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(ulong3, RS_TYPE_UNSIGNED_64, 3)
58175f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(ulong4, RS_TYPE_UNSIGNED_64, 4)
58275f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(half, RS_TYPE_FLOAT_16, 1)
58375f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(half2, RS_TYPE_FLOAT_16, 2)
58475f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(half3, RS_TYPE_FLOAT_16, 3)
58575f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(half4, RS_TYPE_FLOAT_16, 4)
58675f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(float, RS_TYPE_FLOAT_32, 1)
58775f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(float2, RS_TYPE_FLOAT_32, 2)
58875f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(float3, RS_TYPE_FLOAT_32, 3)
58975f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(float4, RS_TYPE_FLOAT_32, 4)
59075f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(double, RS_TYPE_FLOAT_64, 1)
59175f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(double2, RS_TYPE_FLOAT_64, 2)
59275f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(double3, RS_TYPE_FLOAT_64, 3)
59375f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT(double4, RS_TYPE_FLOAT_64, 4)
59475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
59575f0d3110b04346b901771f96ce15cdbe907278fYang Ni#undef ELEMENT_AT
59675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
59775f0d3110b04346b901771f96ce15cdbe907278fYang Ni#ifndef __LP64__
59875f0d3110b04346b901771f96ce15cdbe907278fYang Ni/*
59975f0d3110b04346b901771f96ce15cdbe907278fYang Ni * We miss some symbols for rs{Get,Set}Element_long,ulong variants because 64
60075f0d3110b04346b901771f96ce15cdbe907278fYang Ni * bit integer values are 'long' in RS-land but might be 'long long' in the
60175f0d3110b04346b901771f96ce15cdbe907278fYang Ni * driver.  Define native_long* and native_ulong* types to be vectors of
60275f0d3110b04346b901771f96ce15cdbe907278fYang Ni * 'long' as seen by the driver and define overloaded versions of
60375f0d3110b04346b901771f96ce15cdbe907278fYang Ni * rsSetElementAt_* and rsGetElementAt_*.  This should get us the correct
60475f0d3110b04346b901771f96ce15cdbe907278fYang Ni * mangled names in the driver.
60575f0d3110b04346b901771f96ce15cdbe907278fYang Ni */
60675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
60775f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef long native_long2 __attribute__((ext_vector_type(2)));
60875f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef long native_long3 __attribute__((ext_vector_type(3)));
60975f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef long native_long4 __attribute__((ext_vector_type(4)));
61075f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef unsigned long native_ulong2 __attribute__((ext_vector_type(2)));
61175f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef unsigned long native_ulong3 __attribute__((ext_vector_type(3)));
61275f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef unsigned long native_ulong4 __attribute__((ext_vector_type(4)));
61375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
61475f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Add NOLINT to suppress wrong warnings from clang-tidy.
61575f0d3110b04346b901771f96ce15cdbe907278fYang Ni#define ELEMENT_AT_OVERLOADS(T, U)                                            \
61675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x,        \
61775f0d3110b04346b901771f96ce15cdbe907278fYang Ni                          uint32_t y, uint32_t z) {                           \
61875f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsSetElementAt_##T(a, (T *)val, x, y, z);                                 \
61975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }                                                                           \
62075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x,        \
62175f0d3110b04346b901771f96ce15cdbe907278fYang Ni                          uint32_t y) {                                       \
62275f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsSetElementAt_##T(a, (T *)val, x, y, 0);                                 \
62375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }                                                                           \
62475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsSetElementAt_##T(::rs_allocation a, const U *val, uint32_t x) {      \
62575f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsSetElementAt_##T(a, (T *)val, x, 0, 0);                                 \
62675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }                                                                           \
62775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x, uint32_t y,  \
62875f0d3110b04346b901771f96ce15cdbe907278fYang Ni                          uint32_t z) { /*NOLINT*/                            \
62975f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsGetElementAt_##T(a, (T *)val, x, y, z);                                 \
63075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }                                                                           \
63175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x,              \
63275f0d3110b04346b901771f96ce15cdbe907278fYang Ni                          uint32_t y) { /*NOLINT*/                            \
63375f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsGetElementAt_##T(a, (T *)val, x, y, 0);                                 \
63475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }                                                                           \
63575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  void rsGetElementAt_##T(::rs_allocation a, U *val, uint32_t x) { /*NOLINT*/ \
63675f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsGetElementAt_##T(a, (T *)val, x, 0, 0);                                 \
63775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
63875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
63975f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT_OVERLOADS(long2, native_long2)
64075f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT_OVERLOADS(long3, native_long3)
64175f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT_OVERLOADS(long4, native_long4)
64275f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT_OVERLOADS(ulong, unsigned long)
64375f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT_OVERLOADS(ulong2, native_ulong2)
64475f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT_OVERLOADS(ulong3, native_ulong3)
64575f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT_OVERLOADS(ulong4, native_ulong4)
64675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
64775f0d3110b04346b901771f96ce15cdbe907278fYang Ni// We also need variants of rs{Get,Set}ElementAt_long that take 'long long *' as
64875f0d3110b04346b901771f96ce15cdbe907278fYang Ni// we might have this overloaded variant in old APKs.
64975f0d3110b04346b901771f96ce15cdbe907278fYang NiELEMENT_AT_OVERLOADS(long, long long)
65075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
65175f0d3110b04346b901771f96ce15cdbe907278fYang Ni#undef ELEMENT_AT_OVERLOADS
65275f0d3110b04346b901771f96ce15cdbe907278fYang Ni#endif
65375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
65475f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
65575f0d3110b04346b901771f96ce15cdbe907278fYang Ni// ForEach routines
65675f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
65775f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsForEachInternal(int slot, rs_script_call *options, int hasOutput,
65875f0d3110b04346b901771f96ce15cdbe907278fYang Ni                       int numInputs, ::rs_allocation *allocs) {
65975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
66075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Script *s = const_cast<Script *>(RsdCpuReference::getTlsScript());
66175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  if (numInputs > RS_KERNEL_MAX_ARGUMENTS) {
66275f0d3110b04346b901771f96ce15cdbe907278fYang Ni    rsc->setError(RS_ERROR_BAD_SCRIPT,
66375f0d3110b04346b901771f96ce15cdbe907278fYang Ni                  "rsForEachInternal: too many inputs to a kernel.");
66475f0d3110b04346b901771f96ce15cdbe907278fYang Ni    return;
66575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
66675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Allocation *inputs[RS_KERNEL_MAX_ARGUMENTS];
66775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  for (int i = 0; i < numInputs; i++) {
66875f0d3110b04346b901771f96ce15cdbe907278fYang Ni    inputs[i] = (Allocation *)allocs[i].p;
66975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  }
67075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Allocation *out = hasOutput ? (Allocation *)allocs[numInputs].p : nullptr;
67175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsrForEach(rsc, s, slot, numInputs, numInputs > 0 ? inputs : nullptr, out,
67275f0d3110b04346b901771f96ce15cdbe907278fYang Ni             nullptr, 0, (RsScriptCall *)options);
67375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
67475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
67575f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid __attribute__((overloadable))
67675f0d3110b04346b901771f96ce15cdbe907278fYang NirsForEach(::rs_script script, ::rs_allocation in, ::rs_allocation out,
67775f0d3110b04346b901771f96ce15cdbe907278fYang Ni          const void *usr, const rs_script_call *call) {
67875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
67975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p,
68075f0d3110b04346b901771f96ce15cdbe907278fYang Ni             (Allocation *)out.p, usr, 0, (RsScriptCall *)call);
68175f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
68275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
68375f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid __attribute__((overloadable))
68475f0d3110b04346b901771f96ce15cdbe907278fYang NirsForEach(::rs_script script, ::rs_allocation in, ::rs_allocation out,
68575f0d3110b04346b901771f96ce15cdbe907278fYang Ni          const void *usr) {
68675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
68775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p,
68875f0d3110b04346b901771f96ce15cdbe907278fYang Ni             (Allocation *)out.p, usr, 0, nullptr);
68975f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
69075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
69175f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid __attribute__((overloadable))
69275f0d3110b04346b901771f96ce15cdbe907278fYang NirsForEach(::rs_script script, ::rs_allocation in, ::rs_allocation out) {
69375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
69475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p,
69575f0d3110b04346b901771f96ce15cdbe907278fYang Ni             (Allocation *)out.p, nullptr, 0, nullptr);
69675f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
69775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
69875f0d3110b04346b901771f96ce15cdbe907278fYang Ni// These functions are only supported in 32-bit.
69975f0d3110b04346b901771f96ce15cdbe907278fYang Ni#ifndef __LP64__
70075f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid __attribute__((overloadable))
70175f0d3110b04346b901771f96ce15cdbe907278fYang NirsForEach(::rs_script script, ::rs_allocation in, ::rs_allocation out,
70275f0d3110b04346b901771f96ce15cdbe907278fYang Ni          const void *usr, uint32_t usrLen) {
70375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
70475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p,
70575f0d3110b04346b901771f96ce15cdbe907278fYang Ni             (Allocation *)out.p, usr, usrLen, nullptr);
70675f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
70775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
70875f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid __attribute__((overloadable))
70975f0d3110b04346b901771f96ce15cdbe907278fYang NirsForEach(::rs_script script, ::rs_allocation in, ::rs_allocation out,
71075f0d3110b04346b901771f96ce15cdbe907278fYang Ni          const void *usr, uint32_t usrLen, const rs_script_call *call) {
71175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
71275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  rsrForEach(rsc, (Script *)script.p, 0, 1, (Allocation **)&in.p,
71375f0d3110b04346b901771f96ce15cdbe907278fYang Ni             (Allocation *)out.p, usr, usrLen, (RsScriptCall *)call);
71475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
71575f0d3110b04346b901771f96ce15cdbe907278fYang Ni#endif
71675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
71775f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
71875f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Message routines
71975f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
72075f0d3110b04346b901771f96ce15cdbe907278fYang Niuint32_t rsSendToClient(int cmdID) {
72175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
72275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return rsrToClient(rsc, cmdID, (const void *)nullptr, 0);
72375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
72475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
72575f0d3110b04346b901771f96ce15cdbe907278fYang Niuint32_t rsSendToClient(int cmdID, const void *data, uint32_t len) {
72675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
72775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return rsrToClient(rsc, cmdID, data, len);
72875f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
72975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
73075f0d3110b04346b901771f96ce15cdbe907278fYang Niuint32_t rsSendToClientBlocking(int cmdID) {
73175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
73275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return rsrToClientBlocking(rsc, cmdID, (const void *)nullptr, 0);
73375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
73475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
73575f0d3110b04346b901771f96ce15cdbe907278fYang Niuint32_t rsSendToClientBlocking(int cmdID, const void *data, uint32_t len) {
73675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
73775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return rsrToClientBlocking(rsc, cmdID, data, len);
73875f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
73975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
74075f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
74175f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Time routines
74275f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
74375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
74475f0d3110b04346b901771f96ce15cdbe907278fYang Ni// time_t is int in 32-bit RenderScript.  time_t is long in bionic.  rsTime and
74575f0d3110b04346b901771f96ce15cdbe907278fYang Ni// rsLocaltime are set to explicitly take 'const int *' so we generate the
74675f0d3110b04346b901771f96ce15cdbe907278fYang Ni// correct mangled names.
74775f0d3110b04346b901771f96ce15cdbe907278fYang Ni#ifndef __LP64__
74875f0d3110b04346b901771f96ce15cdbe907278fYang Niint rsTime(int *timer) {
74975f0d3110b04346b901771f96ce15cdbe907278fYang Ni#else
75075f0d3110b04346b901771f96ce15cdbe907278fYang Nitime_t rsTime(time_t *timer) {
75175f0d3110b04346b901771f96ce15cdbe907278fYang Ni#endif
75275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
75375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return rsrTime(rsc, (time_t *)timer);
75475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
75575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
75675f0d3110b04346b901771f96ce15cdbe907278fYang Ni#ifndef __LP64__
75775f0d3110b04346b901771f96ce15cdbe907278fYang Nirs_tm *rsLocaltime(rs_tm *local, const int *timer) {
75875f0d3110b04346b901771f96ce15cdbe907278fYang Ni#else
75975f0d3110b04346b901771f96ce15cdbe907278fYang Nirs_tm *rsLocaltime(rs_tm *local, const time_t *timer) {
76075f0d3110b04346b901771f96ce15cdbe907278fYang Ni#endif
76175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
76275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return (rs_tm *)rsrLocalTime(rsc, (tm *)local, (time_t *)timer);
76375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
76475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
76575f0d3110b04346b901771f96ce15cdbe907278fYang Niint64_t rsUptimeMillis() {
76675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
76775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return rsrUptimeMillis(rsc);
76875f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
76975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
77075f0d3110b04346b901771f96ce15cdbe907278fYang Niint64_t rsUptimeNanos() {
77175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
77275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return rsrUptimeNanos(rsc);
77375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
77475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
77575f0d3110b04346b901771f96ce15cdbe907278fYang Nifloat rsGetDt() {
77675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  Context *rsc = RsdCpuReference::getTlsContext();
77775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  const Script *sc = RsdCpuReference::getTlsScript();
77875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return rsrGetDt(rsc, sc);
77975f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
78075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
78175f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
78275f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Debug routines
78375f0d3110b04346b901771f96ce15cdbe907278fYang Ni//////////////////////////////////////////////////////////////////////////////
78475f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, float f) {
78575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s %f, 0x%08x", s, f, *((int *)(&f)));
78675f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
78775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
78875f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, float f1, float f2) {
78975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f}", s, f1, f2);
79075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
79175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
79275f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, float f1, float f2, float f3) {
79375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f, %f}", s, f1, f2, f3);
79475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
79575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
79675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, float f1, float f2, float f3, float f4) {
79775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
79875f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
79975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
80075f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const float2 *f2) {
80175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  float2 f = *f2;
80275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f}", s, f.x, f.y);
80375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
80475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
80575f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const float3 *f3) {
80675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  float3 f = *f3;
80775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f, %f}", s, f.x, f.y, f.z);
80875f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
80975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
81075f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const float4 *f4) {
81175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  float4 f = *f4;
81275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f, %f, %f}", s, f.x, f.y, f.z, f.w);
81375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
81475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
81575f0d3110b04346b901771f96ce15cdbe907278fYang Ni// Accept a half value converted to float.  This eliminates the need in the
81675f0d3110b04346b901771f96ce15cdbe907278fYang Ni// driver to properly support the half datatype (either by adding compiler flags
81775f0d3110b04346b901771f96ce15cdbe907278fYang Ni// for half or link against compiler_rt).
81875f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, float f, ushort us) {
81975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f} {0x%hx}", s, f, us);
82075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
82175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
82275f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const float2 *f2, const ushort2 *us2) {
82375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  float2 f = *f2;
82475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ushort2 us = *us2;
82575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f %f} {0x%hx 0x%hx}", s, f.x, f.y, us.x, us.y);
82675f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
82775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
82875f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const float3 *f3, const ushort3 *us3) {
82975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  float3 f = *f3;
83075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ushort3 us = *us3;
83175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f %f %f} {0x%hx 0x%hx 0x%hx}", s, f.x, f.y, f.z, us.x, us.y,
83275f0d3110b04346b901771f96ce15cdbe907278fYang Ni        us.z);
83375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
83475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
83575f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const float4 *f4, const ushort4 *us4) {
83675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  float4 f = *f4;
83775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ushort4 us = *us4;
83875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f %f %f %f} {0x%hx 0x%hx 0x%hx 0x%hx}", s, f.x, f.y, f.z, f.w,
83975f0d3110b04346b901771f96ce15cdbe907278fYang Ni        us.x, us.y, us.z, us.w);
84075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
84175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
84275f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, double d) {
84375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s %f, 0x%08llx", s, d, *((long long *)(&d)));
84475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
84575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
84675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const double2 *d2) {
84775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  double2 d = *d2;
84875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f}", s, d.x, d.y);
84975f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
85075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
85175f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const double3 *d3) {
85275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  double3 d = *d3;
85375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f, %f}", s, d.x, d.y, d.z);
85475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
85575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
85675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const double4 *d4) {
85775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  double4 d = *d4;
85875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f, %f, %f}", s, d.x, d.y, d.z, d.w);
85975f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
86075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
86175f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const rs_matrix4x4 *m) {
86275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  float *f = (float *)m;
86375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
86475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
86575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
86675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
86775f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
86875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
86975f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const rs_matrix3x3 *m) {
87075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  float *f = (float *)m;
87175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
87275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
87375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s  %f, %f, %f}", s, f[2], f[5], f[8]);
87475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
87575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
87675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const rs_matrix2x2 *m) {
87775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  float *f = (float *)m;
87875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%f, %f", s, f[0], f[2]);
87975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s  %f, %f}", s, f[1], f[3]);
88075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
88175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
88275f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, char c) {
88375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s %hhd  0x%hhx", s, c, (unsigned char)c);
88475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
88575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
88675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const char2 *c2) {
88775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  char2 c = *c2;
88875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hhd, %hhd}  0x%hhx 0x%hhx", s, c.x, c.y, (unsigned char)c.x,
88975f0d3110b04346b901771f96ce15cdbe907278fYang Ni        (unsigned char)c.y);
89075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
89175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
89275f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const char3 *c3) {
89375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  char3 c = *c3;
89475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hhd, %hhd, %hhd}  0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z,
89575f0d3110b04346b901771f96ce15cdbe907278fYang Ni        (unsigned char)c.x, (unsigned char)c.y, (unsigned char)c.z);
89675f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
89775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
89875f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const char4 *c4) {
89975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  char4 c = *c4;
90075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hhd, %hhd, %hhd, %hhd}  0x%hhx 0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y,
90175f0d3110b04346b901771f96ce15cdbe907278fYang Ni        c.z, c.w, (unsigned char)c.x, (unsigned char)c.y, (unsigned char)c.z,
90275f0d3110b04346b901771f96ce15cdbe907278fYang Ni        (unsigned char)c.w);
90375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
90475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
90575f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, unsigned char c) {
90675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s %hhu  0x%hhx", s, c, c);
90775f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
90875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
90975f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const uchar2 *c2) {
91075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  uchar2 c = *c2;
91175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hhu, %hhu}  0x%hhx 0x%hhx", s, c.x, c.y, c.x, c.y);
91275f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
91375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
91475f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const uchar3 *c3) {
91575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  uchar3 c = *c3;
91675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hhu, %hhu, %hhu}  0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, c.x,
91775f0d3110b04346b901771f96ce15cdbe907278fYang Ni        c.y, c.z);
91875f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
91975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
92075f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const uchar4 *c4) {
92175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  uchar4 c = *c4;
92275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hhu, %hhu, %hhu, %hhu}  0x%hhx 0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y,
92375f0d3110b04346b901771f96ce15cdbe907278fYang Ni        c.z, c.w, c.x, c.y, c.z, c.w);
92475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
92575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
92675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, short c) { ALOGD("%s %hd  0x%hx", s, c, c); }
92775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
92875f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const short2 *c2) {
92975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  short2 c = *c2;
93075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hd, %hd}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
93175f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
93275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
93375f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const short3 *c3) {
93475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  short3 c = *c3;
93575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hd, %hd, %hd}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y,
93675f0d3110b04346b901771f96ce15cdbe907278fYang Ni        c.z);
93775f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
93875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
93975f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const short4 *c4) {
94075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  short4 c = *c4;
94175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hd, %hd, %hd, %hd}  0x%hx 0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z,
94275f0d3110b04346b901771f96ce15cdbe907278fYang Ni        c.w, c.x, c.y, c.z, c.w);
94375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
94475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
94575f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, unsigned short c) {
94675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s %hu  0x%hx", s, c, c);
94775f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
94875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
94975f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ushort2 *c2) {
95075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ushort2 c = *c2;
95175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hu, %hu}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
95275f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
95375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
95475f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ushort3 *c3) {
95575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ushort3 c = *c3;
95675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hu, %hu, %hu}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y,
95775f0d3110b04346b901771f96ce15cdbe907278fYang Ni        c.z);
95875f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
95975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
96075f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ushort4 *c4) {
96175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ushort4 c = *c4;
96275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%hu, %hu, %hu, %hu}  0x%hx 0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z,
96375f0d3110b04346b901771f96ce15cdbe907278fYang Ni        c.w, c.x, c.y, c.z, c.w);
96475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
96575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
96675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, int i) { ALOGD("%s %d  0x%x", s, i, i); }
96775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
96875f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const int2 *i2) {
96975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int2 i = *i2;
97075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%d, %d}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
97175f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
97275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
97375f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const int3 *i3) {
97475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int3 i = *i3;
97575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%d, %d, %d}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
97675f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
97775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
97875f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const int4 *i4) {
97975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  int4 i = *i4;
98075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  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,
98175f0d3110b04346b901771f96ce15cdbe907278fYang Ni        i.y, i.z, i.w);
98275f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
98375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
98475f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, unsigned int i) { ALOGD("%s %u  0x%x", s, i, i); }
98575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
98675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const uint2 *i2) {
98775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  uint2 i = *i2;
98875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%u, %u}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
98975f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
99075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
99175f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const uint3 *i3) {
99275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  uint3 i = *i3;
99375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%u, %u, %u}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
99475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
99575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
99675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const uint4 *i4) {
99775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  uint4 i = *i4;
99875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  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,
99975f0d3110b04346b901771f96ce15cdbe907278fYang Ni        i.y, i.z, i.w);
100075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
100175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
100275f0d3110b04346b901771f96ce15cdbe907278fYang Nitemplate <typename T>
100375f0d3110b04346b901771f96ce15cdbe907278fYang Nistatic inline long long LL(const T &x) {
100475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return static_cast<long long>(x);
100575f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
100675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
100775f0d3110b04346b901771f96ce15cdbe907278fYang Nitemplate <typename T>
100875f0d3110b04346b901771f96ce15cdbe907278fYang Nistatic inline unsigned long long LLu(const T &x) {
100975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  return static_cast<unsigned long long>(x);
101075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
101175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
101275f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, long l) {
101375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s %lld  0x%llx", s, LL(l), LL(l));
101475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
101575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
101675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, long long ll) {
101775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s %lld  0x%llx", s, LL(ll), LL(ll));
101875f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
101975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
102075f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const long2 *c) {
102175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  long2 ll = *c;
102275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x),
102375f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LL(ll.y));
102475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
102575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
102675f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const long3 *c) {
102775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  long3 ll = *c;
102875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%lld, %lld, %lld}  0x%llx 0x%llx 0x%llx", s, LL(ll.x), LL(ll.y),
102975f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LL(ll.z), LL(ll.x), LL(ll.y), LL(ll.z));
103075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
103175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
103275f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const long4 *c) {
103375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  long4 ll = *c;
103475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%lld, %lld, %lld, %lld}  0x%llx 0x%llx 0x%llx 0x%llx", s, LL(ll.x),
103575f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LL(ll.y), LL(ll.z), LL(ll.w), LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.w));
103675f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
103775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
103875f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, unsigned long l) {
103975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  unsigned long long ll = l;
104075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s %llu  0x%llx", s, ll, ll);
104175f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
104275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
104375f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, unsigned long long ll) {
104475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s %llu  0x%llx", s, ll, ll);
104575f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
104675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
104775f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ulong2 *c) {
104875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ulong2 ll = *c;
104975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x),
105075f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.y));
105175f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
105275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
105375f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ulong3 *c) {
105475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ulong3 ll = *c;
105575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%llu, %llu, %llu}  0x%llx 0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y),
105675f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.z), LLu(ll.x), LLu(ll.y), LLu(ll.z));
105775f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
105875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
105975f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ulong4 *c) {
106075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ulong4 ll = *c;
106175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%llu, %llu, %llu, %llu}  0x%llx 0x%llx 0x%llx 0x%llx", s,
106275f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.w), LLu(ll.x), LLu(ll.y),
106375f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.z), LLu(ll.w));
106475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
106575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
106675f0d3110b04346b901771f96ce15cdbe907278fYang Ni// FIXME: We need to export these function signatures for the compatibility
106775f0d3110b04346b901771f96ce15cdbe907278fYang Ni// library. The C++ name mangling that LLVM uses for ext_vector_type requires
106875f0d3110b04346b901771f96ce15cdbe907278fYang Ni// different versions for "long" vs. "long long". Note that the called
106975f0d3110b04346b901771f96ce15cdbe907278fYang Ni// functions are still using the appropriate 64-bit sizes.
107075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
107175f0d3110b04346b901771f96ce15cdbe907278fYang Ni#ifndef __LP64__
107275f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef long l2 __attribute__((ext_vector_type(2)));
107375f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef long l3 __attribute__((ext_vector_type(3)));
107475f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef long l4 __attribute__((ext_vector_type(4)));
107575f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef unsigned long ul2 __attribute__((ext_vector_type(2)));
107675f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef unsigned long ul3 __attribute__((ext_vector_type(3)));
107775f0d3110b04346b901771f96ce15cdbe907278fYang Nitypedef unsigned long ul4 __attribute__((ext_vector_type(4)));
107875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
107975f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const l2 *c) {
108075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  long2 ll = *(const long2 *)c;
108175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x),
108275f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LL(ll.y));
108375f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
108475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
108575f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const l3 *c) {
108675f0d3110b04346b901771f96ce15cdbe907278fYang Ni  long3 ll = *(const long3 *)c;
108775f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%lld, %lld, %lld}  0x%llx 0x%llx 0x%llx", s, LL(ll.x), LL(ll.y),
108875f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LL(ll.z), LL(ll.x), LL(ll.y), LL(ll.z));
108975f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
109075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
109175f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const l4 *c) {
109275f0d3110b04346b901771f96ce15cdbe907278fYang Ni  long4 ll = *(const long4 *)c;
109375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%lld, %lld, %lld, %lld}  0x%llx 0x%llx 0x%llx 0x%llx", s, LL(ll.x),
109475f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LL(ll.y), LL(ll.z), LL(ll.w), LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.w));
109575f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
109675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
109775f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ul2 *c) {
109875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ulong2 ll = *(const ulong2 *)c;
109975f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x),
110075f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.y));
110175f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
110275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
110375f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ul3 *c) {
110475f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ulong3 ll = *(const ulong3 *)c;
110575f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%llu, %llu, %llu}  0x%llx 0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y),
110675f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.z), LLu(ll.x), LLu(ll.y), LLu(ll.z));
110775f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
110875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
110975f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ul4 *c) {
111075f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ulong4 ll = *(const ulong4 *)c;
111175f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%llu, %llu, %llu, %llu}  0x%llx 0x%llx 0x%llx 0x%llx", s,
111275f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.w), LLu(ll.x), LLu(ll.y),
111375f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.z), LLu(ll.w));
111475f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
111575f0d3110b04346b901771f96ce15cdbe907278fYang Ni#endif
111675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
111775f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const long2 ll) {
111875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, LL(ll.x), LL(ll.y), LL(ll.x),
111975f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LL(ll.y));
112075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
112175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
112275f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const long3 ll) {
112375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%lld, %lld, %lld}  0x%llx 0x%llx 0x%llx", s, LL(ll.x), LL(ll.y),
112475f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LL(ll.z), LL(ll.x), LL(ll.y), LL(ll.z));
112575f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
112675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
112775f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const long4 ll) {
112875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%lld, %lld, %lld, %lld}  0x%llx 0x%llx 0x%llx 0x%llx", s, LL(ll.x),
112975f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LL(ll.y), LL(ll.z), LL(ll.w), LL(ll.x), LL(ll.y), LL(ll.z), LL(ll.w));
113075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
113175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
113275f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ulong2 ll) {
113375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y), LLu(ll.x),
113475f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.y));
113575f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
113675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
113775f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ulong3 ll) {
113875f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%llu, %llu, %llu}  0x%llx 0x%llx 0x%llx", s, LLu(ll.x), LLu(ll.y),
113975f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.z), LLu(ll.x), LLu(ll.y), LLu(ll.z));
114075f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
114175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
114275f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const ulong4 ll) {
114375f0d3110b04346b901771f96ce15cdbe907278fYang Ni  ALOGD("%s {%llu, %llu, %llu, %llu}  0x%llx 0x%llx 0x%llx 0x%llx", s,
114475f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.x), LLu(ll.y), LLu(ll.z), LLu(ll.w), LLu(ll.x), LLu(ll.y),
114575f0d3110b04346b901771f96ce15cdbe907278fYang Ni        LLu(ll.z), LLu(ll.w));
114675f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
114775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
114875f0d3110b04346b901771f96ce15cdbe907278fYang Nivoid rsDebug(const char *s, const void *p) { ALOGD("%s %p", s, p); }
1149