xref: /aosp_15_r20/frameworks/rs/rsCppUtils.h (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2013 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_RS_CPP_UTILS_H
18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RS_CPP_UTILS_H
19*e1eccf28SAndroid Build Coastguard Worker 
20*e1eccf28SAndroid Build Coastguard Worker #include <stdint.h>
21*e1eccf28SAndroid Build Coastguard Worker #include <stdlib.h>
22*e1eccf28SAndroid Build Coastguard Worker #include <pthread.h>
23*e1eccf28SAndroid Build Coastguard Worker #include <time.h>
24*e1eccf28SAndroid Build Coastguard Worker #include <math.h>
25*e1eccf28SAndroid Build Coastguard Worker 
26*e1eccf28SAndroid Build Coastguard Worker #include <string>
27*e1eccf28SAndroid Build Coastguard Worker #include <vector>
28*e1eccf28SAndroid Build Coastguard Worker #include <algorithm>
29*e1eccf28SAndroid Build Coastguard Worker 
30*e1eccf28SAndroid Build Coastguard Worker #include <android/log.h>
31*e1eccf28SAndroid Build Coastguard Worker #include <sys/system_properties.h>
32*e1eccf28SAndroid Build Coastguard Worker 
33*e1eccf28SAndroid Build Coastguard Worker #ifndef ALOGE
34*e1eccf28SAndroid Build Coastguard Worker #define ALOGE(...) \
35*e1eccf28SAndroid Build Coastguard Worker     __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__);
36*e1eccf28SAndroid Build Coastguard Worker #endif
37*e1eccf28SAndroid Build Coastguard Worker #ifndef ALOGW
38*e1eccf28SAndroid Build Coastguard Worker #define ALOGW(...) \
39*e1eccf28SAndroid Build Coastguard Worker     __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__);
40*e1eccf28SAndroid Build Coastguard Worker #endif
41*e1eccf28SAndroid Build Coastguard Worker #ifndef ALOGD
42*e1eccf28SAndroid Build Coastguard Worker #define ALOGD(...) \
43*e1eccf28SAndroid Build Coastguard Worker     __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__);
44*e1eccf28SAndroid Build Coastguard Worker #endif
45*e1eccf28SAndroid Build Coastguard Worker #ifndef ALOGV
46*e1eccf28SAndroid Build Coastguard Worker #define ALOGV(...) \
47*e1eccf28SAndroid Build Coastguard Worker     __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__);
48*e1eccf28SAndroid Build Coastguard Worker #endif
49*e1eccf28SAndroid Build Coastguard Worker 
50*e1eccf28SAndroid Build Coastguard Worker #if defined(_WIN32)
51*e1eccf28SAndroid Build Coastguard Worker #define OS_PATH_SEPARATOR '\\'
52*e1eccf28SAndroid Build Coastguard Worker #else
53*e1eccf28SAndroid Build Coastguard Worker #define OS_PATH_SEPARATOR '/'
54*e1eccf28SAndroid Build Coastguard Worker #endif
55*e1eccf28SAndroid Build Coastguard Worker 
56*e1eccf28SAndroid Build Coastguard Worker 
57*e1eccf28SAndroid Build Coastguard Worker namespace android {
58*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
59*e1eccf28SAndroid Build Coastguard Worker 
60*e1eccf28SAndroid Build Coastguard Worker typedef int64_t nsecs_t;  // nano-seconds
61*e1eccf28SAndroid Build Coastguard Worker 
62*e1eccf28SAndroid Build Coastguard Worker enum {
63*e1eccf28SAndroid Build Coastguard Worker     SYSTEM_TIME_REALTIME = 0,  // system-wide realtime clock
64*e1eccf28SAndroid Build Coastguard Worker     SYSTEM_TIME_MONOTONIC = 1, // monotonic time since unspecified starting point
65*e1eccf28SAndroid Build Coastguard Worker     SYSTEM_TIME_PROCESS = 2,   // high-resolution per-process clock
66*e1eccf28SAndroid Build Coastguard Worker     SYSTEM_TIME_THREAD = 3,    // high-resolution per-thread clock
67*e1eccf28SAndroid Build Coastguard Worker };
68*e1eccf28SAndroid Build Coastguard Worker 
systemTime(int clock)69*e1eccf28SAndroid Build Coastguard Worker static inline nsecs_t systemTime(int clock)
70*e1eccf28SAndroid Build Coastguard Worker {
71*e1eccf28SAndroid Build Coastguard Worker #if defined(__linux__)
72*e1eccf28SAndroid Build Coastguard Worker     static const clockid_t clocks[] = {
73*e1eccf28SAndroid Build Coastguard Worker             CLOCK_REALTIME,
74*e1eccf28SAndroid Build Coastguard Worker             CLOCK_MONOTONIC,
75*e1eccf28SAndroid Build Coastguard Worker             CLOCK_PROCESS_CPUTIME_ID,
76*e1eccf28SAndroid Build Coastguard Worker             CLOCK_THREAD_CPUTIME_ID
77*e1eccf28SAndroid Build Coastguard Worker     };
78*e1eccf28SAndroid Build Coastguard Worker     struct timespec t;
79*e1eccf28SAndroid Build Coastguard Worker     t.tv_sec = t.tv_nsec = 0;
80*e1eccf28SAndroid Build Coastguard Worker     clock_gettime(clocks[clock], &t);
81*e1eccf28SAndroid Build Coastguard Worker     return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec;
82*e1eccf28SAndroid Build Coastguard Worker #else
83*e1eccf28SAndroid Build Coastguard Worker     // we don't support the clocks here.
84*e1eccf28SAndroid Build Coastguard Worker     struct timeval t;
85*e1eccf28SAndroid Build Coastguard Worker     t.tv_sec = t.tv_usec = 0;
86*e1eccf28SAndroid Build Coastguard Worker     gettimeofday(&t, nullptr);
87*e1eccf28SAndroid Build Coastguard Worker     return nsecs_t(t.tv_sec)*1000000000LL + nsecs_t(t.tv_usec)*1000LL;
88*e1eccf28SAndroid Build Coastguard Worker #endif
89*e1eccf28SAndroid Build Coastguard Worker }
90*e1eccf28SAndroid Build Coastguard Worker 
nanoseconds_to_milliseconds(nsecs_t secs)91*e1eccf28SAndroid Build Coastguard Worker static inline nsecs_t nanoseconds_to_milliseconds(nsecs_t secs)
92*e1eccf28SAndroid Build Coastguard Worker {
93*e1eccf28SAndroid Build Coastguard Worker     return secs/1000000;
94*e1eccf28SAndroid Build Coastguard Worker }
95*e1eccf28SAndroid Build Coastguard Worker 
96*e1eccf28SAndroid Build Coastguard Worker #if 1
97*e1eccf28SAndroid Build Coastguard Worker #define rsAssert(v) do {if(!(v)) ALOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0)
98*e1eccf28SAndroid Build Coastguard Worker #else
99*e1eccf28SAndroid Build Coastguard Worker #define rsAssert(v) while (0)
100*e1eccf28SAndroid Build Coastguard Worker #endif
101*e1eccf28SAndroid Build Coastguard Worker 
102*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsMin(T in1,T in2)103*e1eccf28SAndroid Build Coastguard Worker T rsMin(T in1, T in2)
104*e1eccf28SAndroid Build Coastguard Worker {
105*e1eccf28SAndroid Build Coastguard Worker     if (in1 > in2) {
106*e1eccf28SAndroid Build Coastguard Worker         return in2;
107*e1eccf28SAndroid Build Coastguard Worker     }
108*e1eccf28SAndroid Build Coastguard Worker     return in1;
109*e1eccf28SAndroid Build Coastguard Worker }
110*e1eccf28SAndroid Build Coastguard Worker 
111*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsMax(T in1,T in2)112*e1eccf28SAndroid Build Coastguard Worker T rsMax(T in1, T in2) {
113*e1eccf28SAndroid Build Coastguard Worker     if (in1 < in2) {
114*e1eccf28SAndroid Build Coastguard Worker         return in2;
115*e1eccf28SAndroid Build Coastguard Worker     }
116*e1eccf28SAndroid Build Coastguard Worker     return in1;
117*e1eccf28SAndroid Build Coastguard Worker }
118*e1eccf28SAndroid Build Coastguard Worker 
119*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsFindHighBit(T val)120*e1eccf28SAndroid Build Coastguard Worker T rsFindHighBit(T val) {
121*e1eccf28SAndroid Build Coastguard Worker     uint32_t bit = 0;
122*e1eccf28SAndroid Build Coastguard Worker     while (val > 1) {
123*e1eccf28SAndroid Build Coastguard Worker         bit++;
124*e1eccf28SAndroid Build Coastguard Worker         val>>=1;
125*e1eccf28SAndroid Build Coastguard Worker     }
126*e1eccf28SAndroid Build Coastguard Worker     return bit;
127*e1eccf28SAndroid Build Coastguard Worker }
128*e1eccf28SAndroid Build Coastguard Worker 
129*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsIsPow2(T val)130*e1eccf28SAndroid Build Coastguard Worker bool rsIsPow2(T val) {
131*e1eccf28SAndroid Build Coastguard Worker     return (val & (val-1)) == 0;
132*e1eccf28SAndroid Build Coastguard Worker }
133*e1eccf28SAndroid Build Coastguard Worker 
134*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsHigherPow2(T v)135*e1eccf28SAndroid Build Coastguard Worker T rsHigherPow2(T v) {
136*e1eccf28SAndroid Build Coastguard Worker     if (rsIsPow2(v)) {
137*e1eccf28SAndroid Build Coastguard Worker         return v;
138*e1eccf28SAndroid Build Coastguard Worker     }
139*e1eccf28SAndroid Build Coastguard Worker     return 1 << (rsFindHighBit(v) + 1);
140*e1eccf28SAndroid Build Coastguard Worker }
141*e1eccf28SAndroid Build Coastguard Worker 
142*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsLowerPow2(T v)143*e1eccf28SAndroid Build Coastguard Worker T rsLowerPow2(T v) {
144*e1eccf28SAndroid Build Coastguard Worker     if (rsIsPow2(v)) {
145*e1eccf28SAndroid Build Coastguard Worker         return v;
146*e1eccf28SAndroid Build Coastguard Worker     }
147*e1eccf28SAndroid Build Coastguard Worker     return 1 << rsFindHighBit(v);
148*e1eccf28SAndroid Build Coastguard Worker }
149*e1eccf28SAndroid Build Coastguard Worker 
150*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsRound(T v,unsigned int r)151*e1eccf28SAndroid Build Coastguard Worker T rsRound(T v, unsigned int r) {
152*e1eccf28SAndroid Build Coastguard Worker     // Only valid for rounding up to powers of 2.
153*e1eccf28SAndroid Build Coastguard Worker     if ((r & (r - 1)) != 0) {
154*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false && "Must be power of 2 for rounding up");
155*e1eccf28SAndroid Build Coastguard Worker         return v;
156*e1eccf28SAndroid Build Coastguard Worker     }
157*e1eccf28SAndroid Build Coastguard Worker     T res = v + (r - 1);
158*e1eccf28SAndroid Build Coastguard Worker     if (res < v) {
159*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false && "Overflow of rounding operation");
160*e1eccf28SAndroid Build Coastguard Worker         return v;
161*e1eccf28SAndroid Build Coastguard Worker     }
162*e1eccf28SAndroid Build Coastguard Worker     res &= ~(r - 1);
163*e1eccf28SAndroid Build Coastguard Worker     return res;
164*e1eccf28SAndroid Build Coastguard Worker }
165*e1eccf28SAndroid Build Coastguard Worker 
rs888to565(uint32_t r,uint32_t g,uint32_t b)166*e1eccf28SAndroid Build Coastguard Worker static inline uint16_t rs888to565(uint32_t r, uint32_t g, uint32_t b) {
167*e1eccf28SAndroid Build Coastguard Worker     uint16_t t = 0;
168*e1eccf28SAndroid Build Coastguard Worker     t |= b >> 3;
169*e1eccf28SAndroid Build Coastguard Worker     t |= (g >> 2) << 5;
170*e1eccf28SAndroid Build Coastguard Worker     t |= (r >> 3) << 11;
171*e1eccf28SAndroid Build Coastguard Worker     return t;
172*e1eccf28SAndroid Build Coastguard Worker }
173*e1eccf28SAndroid Build Coastguard Worker 
rsBoxFilter565(uint16_t i1,uint16_t i2,uint16_t i3,uint16_t i4)174*e1eccf28SAndroid Build Coastguard Worker static inline uint16_t rsBoxFilter565(uint16_t i1, uint16_t i2, uint16_t i3, uint16_t i4) {
175*e1eccf28SAndroid Build Coastguard Worker     uint32_t r = ((i1 & 0x1f) + (i2 & 0x1f) + (i3 & 0x1f) + (i4 & 0x1f));
176*e1eccf28SAndroid Build Coastguard Worker     uint32_t g = ((i1 >> 5) & 0x3f) + ((i2 >> 5) & 0x3f) + ((i3 >> 5) & 0x3f) + ((i4 >> 5) & 0x3f);
177*e1eccf28SAndroid Build Coastguard Worker     uint32_t b = ((i1 >> 11) + (i2 >> 11) + (i3 >> 11) + (i4 >> 11));
178*e1eccf28SAndroid Build Coastguard Worker     return (r >> 2) | ((g >> 2) << 5) | ((b >> 2) << 11);
179*e1eccf28SAndroid Build Coastguard Worker }
180*e1eccf28SAndroid Build Coastguard Worker 
rsBoxFilter8888(uint32_t i1,uint32_t i2,uint32_t i3,uint32_t i4)181*e1eccf28SAndroid Build Coastguard Worker static inline uint32_t rsBoxFilter8888(uint32_t i1, uint32_t i2, uint32_t i3, uint32_t i4) {
182*e1eccf28SAndroid Build Coastguard Worker     uint32_t r = (i1 & 0xff) +         (i2 & 0xff) +         (i3 & 0xff) +         (i4 & 0xff);
183*e1eccf28SAndroid Build Coastguard Worker     uint32_t g = ((i1 >> 8) & 0xff) +  ((i2 >> 8) & 0xff) +  ((i3 >> 8) & 0xff) +  ((i4 >> 8) & 0xff);
184*e1eccf28SAndroid Build Coastguard Worker     uint32_t b = ((i1 >> 16) & 0xff) + ((i2 >> 16) & 0xff) + ((i3 >> 16) & 0xff) + ((i4 >> 16) & 0xff);
185*e1eccf28SAndroid Build Coastguard Worker     uint32_t a = ((i1 >> 24) & 0xff) + ((i2 >> 24) & 0xff) + ((i3 >> 24) & 0xff) + ((i4 >> 24) & 0xff);
186*e1eccf28SAndroid Build Coastguard Worker     return (r >> 2) | ((g >> 2) << 8) | ((b >> 2) << 16) | ((a >> 2) << 24);
187*e1eccf28SAndroid Build Coastguard Worker }
188*e1eccf28SAndroid Build Coastguard Worker 
189*e1eccf28SAndroid Build Coastguard Worker const char * rsuCopyString(const char *name);
190*e1eccf28SAndroid Build Coastguard Worker const char * rsuCopyString(const char *name, size_t len);
191*e1eccf28SAndroid Build Coastguard Worker const char* rsuJoinStrings(int n, const char* const* strs);
192*e1eccf28SAndroid Build Coastguard Worker 
193*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
194*e1eccf28SAndroid Build Coastguard Worker // Utility to fork/exec a command.
195*e1eccf28SAndroid Build Coastguard Worker //     exe - Command to execute
196*e1eccf28SAndroid Build Coastguard Worker //     nArgs - Number of arguments (excluding the trailing nullptr in args)
197*e1eccf28SAndroid Build Coastguard Worker //     args - Arguments to the command
198*e1eccf28SAndroid Build Coastguard Worker bool rsuExecuteCommand(const char *exe, int nArgs, const char * const *args);
199*e1eccf28SAndroid Build Coastguard Worker #endif
200*e1eccf28SAndroid Build Coastguard Worker 
201*e1eccf28SAndroid Build Coastguard Worker int property_get(const char *key, char *value, const char *default_value);
202*e1eccf28SAndroid Build Coastguard Worker 
203*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
204*e1eccf28SAndroid Build Coastguard Worker } // namespace android
205*e1eccf28SAndroid Build Coastguard Worker 
206*e1eccf28SAndroid Build Coastguard Worker #endif //ANDROID_RS_OBJECT_BASE_H
207*e1eccf28SAndroid Build Coastguard Worker 
208*e1eccf28SAndroid Build Coastguard Worker 
209