xref: /aosp_15_r20/frameworks/rs/toolkit/Utils.h (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RENDERSCRIPT_TOOLKIT_UTILS_H
18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RENDERSCRIPT_TOOLKIT_UTILS_H
19*e1eccf28SAndroid Build Coastguard Worker 
20*e1eccf28SAndroid Build Coastguard Worker #include <android/log.h>
21*e1eccf28SAndroid Build Coastguard Worker 
22*e1eccf28SAndroid Build Coastguard Worker namespace android {
23*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
24*e1eccf28SAndroid Build Coastguard Worker 
25*e1eccf28SAndroid Build Coastguard Worker /* The Toolkit does not support floating point buffers but the original RenderScript Intrinsics
26*e1eccf28SAndroid Build Coastguard Worker  * did for some operations. That code was preserved and protected by
27*e1eccf28SAndroid Build Coastguard Worker  * ANDROID_RENDERSCRIPT_TOOLKIT_SUPPORTS_FLOAT.
28*e1eccf28SAndroid Build Coastguard Worker  */
29*e1eccf28SAndroid Build Coastguard Worker // TODO: On final packaging, decide whether this should be define in the build file, and for which
30*e1eccf28SAndroid Build Coastguard Worker // config. #define ANDROID_RENDERSCRIPT_TOOLKIT_SUPPORTS_FLOAT
31*e1eccf28SAndroid Build Coastguard Worker 
32*e1eccf28SAndroid Build Coastguard Worker /* If we release the Toolkit as a C++ API, we'll want to enable validation at the C++ level
33*e1eccf28SAndroid Build Coastguard Worker  * by uncommenting this define.
34*e1eccf28SAndroid Build Coastguard Worker  *
35*e1eccf28SAndroid Build Coastguard Worker  * If we only have a Java/Kotlin API, the Kotlin layer does validation. We don't need to duplicate
36*e1eccf28SAndroid Build Coastguard Worker  * this effort.
37*e1eccf28SAndroid Build Coastguard Worker  */
38*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RENDERSCRIPT_TOOLKIT_VALIDATE
39*e1eccf28SAndroid Build Coastguard Worker 
40*e1eccf28SAndroid Build Coastguard Worker #define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
41*e1eccf28SAndroid Build Coastguard Worker #define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
42*e1eccf28SAndroid Build Coastguard Worker #define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
43*e1eccf28SAndroid Build Coastguard Worker 
44*e1eccf28SAndroid Build Coastguard Worker using uchar = unsigned char;
45*e1eccf28SAndroid Build Coastguard Worker using uint = unsigned int;
46*e1eccf28SAndroid Build Coastguard Worker using ushort = unsigned short;
47*e1eccf28SAndroid Build Coastguard Worker 
48*e1eccf28SAndroid Build Coastguard Worker using uint8_t = uchar;
49*e1eccf28SAndroid Build Coastguard Worker using uint16_t = ushort;
50*e1eccf28SAndroid Build Coastguard Worker using uint32_t = uint;
51*e1eccf28SAndroid Build Coastguard Worker 
52*e1eccf28SAndroid Build Coastguard Worker typedef float float2 __attribute__((ext_vector_type(2)));
53*e1eccf28SAndroid Build Coastguard Worker typedef float float3 __attribute__((ext_vector_type(3)));
54*e1eccf28SAndroid Build Coastguard Worker typedef float float4 __attribute__((ext_vector_type(4)));
55*e1eccf28SAndroid Build Coastguard Worker typedef uchar uchar2 __attribute__((ext_vector_type(2)));
56*e1eccf28SAndroid Build Coastguard Worker typedef uchar uchar3 __attribute__((ext_vector_type(3)));
57*e1eccf28SAndroid Build Coastguard Worker typedef uchar uchar4 __attribute__((ext_vector_type(4)));
58*e1eccf28SAndroid Build Coastguard Worker typedef ushort ushort2 __attribute__((ext_vector_type(2)));
59*e1eccf28SAndroid Build Coastguard Worker typedef ushort ushort3 __attribute__((ext_vector_type(3)));
60*e1eccf28SAndroid Build Coastguard Worker typedef ushort ushort4 __attribute__((ext_vector_type(4)));
61*e1eccf28SAndroid Build Coastguard Worker typedef uint uint2 __attribute__((ext_vector_type(2)));
62*e1eccf28SAndroid Build Coastguard Worker typedef uint uint3 __attribute__((ext_vector_type(3)));
63*e1eccf28SAndroid Build Coastguard Worker typedef uint uint4 __attribute__((ext_vector_type(4)));
64*e1eccf28SAndroid Build Coastguard Worker typedef short short2 __attribute__((ext_vector_type(2)));
65*e1eccf28SAndroid Build Coastguard Worker typedef short short3 __attribute__((ext_vector_type(3)));
66*e1eccf28SAndroid Build Coastguard Worker typedef short short4 __attribute__((ext_vector_type(4)));
67*e1eccf28SAndroid Build Coastguard Worker typedef int int2 __attribute__((ext_vector_type(2)));
68*e1eccf28SAndroid Build Coastguard Worker typedef int int3 __attribute__((ext_vector_type(3)));
69*e1eccf28SAndroid Build Coastguard Worker typedef int int4 __attribute__((ext_vector_type(4)));
70*e1eccf28SAndroid Build Coastguard Worker 
71*e1eccf28SAndroid Build Coastguard Worker template <typename TO, typename TI>
convert(TI i)72*e1eccf28SAndroid Build Coastguard Worker inline TO convert(TI i) {
73*e1eccf28SAndroid Build Coastguard Worker     // assert(i.x >= 0 && i.y >= 0 && i.z >= 0 && i.w >= 0);
74*e1eccf28SAndroid Build Coastguard Worker     // assert(i.x <= 255 && i.y <= 255 && i.z <= 255 && i.w <= 255);
75*e1eccf28SAndroid Build Coastguard Worker     return __builtin_convertvector(i, TO);
76*e1eccf28SAndroid Build Coastguard Worker }
77*e1eccf28SAndroid Build Coastguard Worker 
78*e1eccf28SAndroid Build Coastguard Worker template <>
convert(float i)79*e1eccf28SAndroid Build Coastguard Worker inline uchar convert(float i) {
80*e1eccf28SAndroid Build Coastguard Worker     // assert(i.x >= 0 && i.y >= 0 && i.z >= 0 && i.w >= 0);
81*e1eccf28SAndroid Build Coastguard Worker     // assert(i.x <= 255 && i.y <= 255 && i.z <= 255 && i.w <= 255);
82*e1eccf28SAndroid Build Coastguard Worker     return (uchar)i;
83*e1eccf28SAndroid Build Coastguard Worker }
84*e1eccf28SAndroid Build Coastguard Worker 
85*e1eccf28SAndroid Build Coastguard Worker template <>
convert(uchar i)86*e1eccf28SAndroid Build Coastguard Worker inline float convert(uchar i) {
87*e1eccf28SAndroid Build Coastguard Worker     // assert(i.x >= 0 && i.y >= 0 && i.z >= 0 && i.w >= 0);
88*e1eccf28SAndroid Build Coastguard Worker     // assert(i.x <= 255 && i.y <= 255 && i.z <= 255 && i.w <= 255);
89*e1eccf28SAndroid Build Coastguard Worker     return (float)i;
90*e1eccf28SAndroid Build Coastguard Worker }
91*e1eccf28SAndroid Build Coastguard Worker 
clamp(int4 amount,int low,int high)92*e1eccf28SAndroid Build Coastguard Worker inline int4 clamp(int4 amount, int low, int high) {
93*e1eccf28SAndroid Build Coastguard Worker     int4 r;
94*e1eccf28SAndroid Build Coastguard Worker     r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
95*e1eccf28SAndroid Build Coastguard Worker     r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
96*e1eccf28SAndroid Build Coastguard Worker     r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
97*e1eccf28SAndroid Build Coastguard Worker     r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);
98*e1eccf28SAndroid Build Coastguard Worker     return r;
99*e1eccf28SAndroid Build Coastguard Worker }
100*e1eccf28SAndroid Build Coastguard Worker 
clamp(float4 amount,float low,float high)101*e1eccf28SAndroid Build Coastguard Worker inline float4 clamp(float4 amount, float low, float high) {
102*e1eccf28SAndroid Build Coastguard Worker     float4 r;
103*e1eccf28SAndroid Build Coastguard Worker     r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
104*e1eccf28SAndroid Build Coastguard Worker     r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
105*e1eccf28SAndroid Build Coastguard Worker     r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
106*e1eccf28SAndroid Build Coastguard Worker     r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);
107*e1eccf28SAndroid Build Coastguard Worker     return r;
108*e1eccf28SAndroid Build Coastguard Worker }
109*e1eccf28SAndroid Build Coastguard Worker 
clamp(int2 amount,int low,int high)110*e1eccf28SAndroid Build Coastguard Worker inline int2 clamp(int2 amount, int low, int high) {
111*e1eccf28SAndroid Build Coastguard Worker     int2 r;
112*e1eccf28SAndroid Build Coastguard Worker     r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
113*e1eccf28SAndroid Build Coastguard Worker     r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
114*e1eccf28SAndroid Build Coastguard Worker     return r;
115*e1eccf28SAndroid Build Coastguard Worker }
116*e1eccf28SAndroid Build Coastguard Worker 
clamp(float2 amount,float low,float high)117*e1eccf28SAndroid Build Coastguard Worker inline float2 clamp(float2 amount, float low, float high) {
118*e1eccf28SAndroid Build Coastguard Worker     float2 r;
119*e1eccf28SAndroid Build Coastguard Worker     r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
120*e1eccf28SAndroid Build Coastguard Worker     r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
121*e1eccf28SAndroid Build Coastguard Worker     return r;
122*e1eccf28SAndroid Build Coastguard Worker }
123*e1eccf28SAndroid Build Coastguard Worker 
clamp(int amount,int low,int high)124*e1eccf28SAndroid Build Coastguard Worker inline int clamp(int amount, int low, int high) {
125*e1eccf28SAndroid Build Coastguard Worker     return amount < low ? low : (amount > high ? high : amount);
126*e1eccf28SAndroid Build Coastguard Worker }
127*e1eccf28SAndroid Build Coastguard Worker 
clamp(float amount,float low,float high)128*e1eccf28SAndroid Build Coastguard Worker inline float clamp(float amount, float low, float high) {
129*e1eccf28SAndroid Build Coastguard Worker     return amount < low ? low : (amount > high ? high : amount);
130*e1eccf28SAndroid Build Coastguard Worker }
131*e1eccf28SAndroid Build Coastguard Worker 
132*e1eccf28SAndroid Build Coastguard Worker #ifdef ANDROID_RENDERSCRIPT_TOOLKIT_VALIDATE
133*e1eccf28SAndroid Build Coastguard Worker struct Restriction;
134*e1eccf28SAndroid Build Coastguard Worker 
135*e1eccf28SAndroid Build Coastguard Worker bool validRestriction(const char* tag, size_t sizeX, size_t sizeY, const Restriction* restriction);
136*e1eccf28SAndroid Build Coastguard Worker #endif
137*e1eccf28SAndroid Build Coastguard Worker 
138*e1eccf28SAndroid Build Coastguard Worker /**
139*e1eccf28SAndroid Build Coastguard Worker  * Returns true if the processor we're running on supports the SIMD instructions that are
140*e1eccf28SAndroid Build Coastguard Worker  * used in our assembly code.
141*e1eccf28SAndroid Build Coastguard Worker  */
142*e1eccf28SAndroid Build Coastguard Worker bool cpuSupportsSimd();
143*e1eccf28SAndroid Build Coastguard Worker 
divideRoundingUp(size_t a,size_t b)144*e1eccf28SAndroid Build Coastguard Worker inline size_t divideRoundingUp(size_t a, size_t b) {
145*e1eccf28SAndroid Build Coastguard Worker     return a / b + (a % b == 0 ? 0 : 1);
146*e1eccf28SAndroid Build Coastguard Worker }
147*e1eccf28SAndroid Build Coastguard Worker 
paddedSize(size_t size)148*e1eccf28SAndroid Build Coastguard Worker inline size_t paddedSize(size_t size) {
149*e1eccf28SAndroid Build Coastguard Worker     return size == 3 ? 4 : size;
150*e1eccf28SAndroid Build Coastguard Worker }
151*e1eccf28SAndroid Build Coastguard Worker 
152*e1eccf28SAndroid Build Coastguard Worker }  // namespace renderscript
153*e1eccf28SAndroid Build Coastguard Worker }  // namespace android
154*e1eccf28SAndroid Build Coastguard Worker 
155*e1eccf28SAndroid Build Coastguard Worker #endif  // ANDROID_RENDERSCRIPT_TOOLKIT_UTILS_H
156