rsUtils.h revision 0b575de8ed0b628d84d256f5846500b0385979bd
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 20b575de8ed0b628d84d256f5846500b0385979bdTim Murray * Copyright (C) 2013 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#ifndef ANDROID_RS_UTILS_H 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define ANDROID_RS_UTILS_H 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 203bce7891a1b1729f76714db08cd3cd79b91d7942Jason Sams#define LOG_NDEBUG 0 21613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams#define LOG_TAG "RenderScript" 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 230b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER 241aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <utils/Log.h> 258b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams#include <utils/String8.h> 26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <utils/Vector.h> 270b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <cutils/atomic.h> 280b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif 290b575de8ed0b628d84d256f5846500b0385979bdTim Murray 300b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <stdint.h> 31fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include <stdlib.h> 331aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <pthread.h> 34cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams#include <time.h> 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 36a5577808737a394bdb156fbeb80018d0a4d8438dJason Sams#include <math.h> 37a5577808737a394bdb156fbeb80018d0a4d8438dJason Sams 380b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifdef RS_SERVER 390b575de8ed0b628d84d256f5846500b0385979bdTim Murray 400b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <string> 410b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <vector> 420b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <algorithm> 430b575de8ed0b628d84d256f5846500b0385979bdTim Murray 440b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ALOGE(...) 450b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ALOGV(...) 460b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ALOGW(...) 470b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ALOGD(...) 480b575de8ed0b628d84d256f5846500b0385979bdTim Murray 490b575de8ed0b628d84d256f5846500b0385979bdTim Murraynamespace android { 500b575de8ed0b628d84d256f5846500b0385979bdTim Murray 510b575de8ed0b628d84d256f5846500b0385979bdTim Murray // server has no Vector or String8 classes; implement on top of STL 520b575de8ed0b628d84d256f5846500b0385979bdTim Murray class String8: public std::string { 530b575de8ed0b628d84d256f5846500b0385979bdTim Murray public: 540b575de8ed0b628d84d256f5846500b0385979bdTim Murray String8(const char *ptr) : std::string(ptr) { 550b575de8ed0b628d84d256f5846500b0385979bdTim Murray 560b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 570b575de8ed0b628d84d256f5846500b0385979bdTim Murray String8() : std::string() { 580b575de8ed0b628d84d256f5846500b0385979bdTim Murray 590b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 600b575de8ed0b628d84d256f5846500b0385979bdTim Murray 610b575de8ed0b628d84d256f5846500b0385979bdTim Murray const char* string() const { 620b575de8ed0b628d84d256f5846500b0385979bdTim Murray return this->c_str(); 630b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 640b575de8ed0b628d84d256f5846500b0385979bdTim Murray 650b575de8ed0b628d84d256f5846500b0385979bdTim Murray void setTo(const char* str, ssize_t len) { 660b575de8ed0b628d84d256f5846500b0385979bdTim Murray this->assign(str, len); 670b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 680b575de8ed0b628d84d256f5846500b0385979bdTim Murray void setTo(const char* str) { 690b575de8ed0b628d84d256f5846500b0385979bdTim Murray this->assign(str); 700b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 710b575de8ed0b628d84d256f5846500b0385979bdTim Murray 720b575de8ed0b628d84d256f5846500b0385979bdTim Murray }; 730b575de8ed0b628d84d256f5846500b0385979bdTim Murray 740b575de8ed0b628d84d256f5846500b0385979bdTim Murray template <class T> class Vector: public std::vector<T> { 750b575de8ed0b628d84d256f5846500b0385979bdTim Murray public: 760b575de8ed0b628d84d256f5846500b0385979bdTim Murray void push(T obj) { 770b575de8ed0b628d84d256f5846500b0385979bdTim Murray this->push_back(obj); 780b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 790b575de8ed0b628d84d256f5846500b0385979bdTim Murray void removeAt(uint32_t index) { 800b575de8ed0b628d84d256f5846500b0385979bdTim Murray this->erase(this->begin() + index); 810b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 820b575de8ed0b628d84d256f5846500b0385979bdTim Murray ssize_t add(const T& obj) { 830b575de8ed0b628d84d256f5846500b0385979bdTim Murray this->push_back(obj); 840b575de8ed0b628d84d256f5846500b0385979bdTim Murray return this->size() - 1; 850b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 860b575de8ed0b628d84d256f5846500b0385979bdTim Murray void setCapacity(ssize_t capacity) { 870b575de8ed0b628d84d256f5846500b0385979bdTim Murray this->resize(capacity); 880b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 890b575de8ed0b628d84d256f5846500b0385979bdTim Murray 900b575de8ed0b628d84d256f5846500b0385979bdTim Murray T* editArray() { 910b575de8ed0b628d84d256f5846500b0385979bdTim Murray return this->data(); 920b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 930b575de8ed0b628d84d256f5846500b0385979bdTim Murray 940b575de8ed0b628d84d256f5846500b0385979bdTim Murray const T* array() { 950b575de8ed0b628d84d256f5846500b0385979bdTim Murray return this->data(); 960b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 970b575de8ed0b628d84d256f5846500b0385979bdTim Murray 980b575de8ed0b628d84d256f5846500b0385979bdTim Murray }; 990b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1000b575de8ed0b628d84d256f5846500b0385979bdTim Murray template<> class Vector<bool>: public std::vector<char> { 1010b575de8ed0b628d84d256f5846500b0385979bdTim Murray public: 1020b575de8ed0b628d84d256f5846500b0385979bdTim Murray void push(bool obj) { 1030b575de8ed0b628d84d256f5846500b0385979bdTim Murray this->push_back(obj); 1040b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1050b575de8ed0b628d84d256f5846500b0385979bdTim Murray void removeAt(uint32_t index) { 1060b575de8ed0b628d84d256f5846500b0385979bdTim Murray this->erase(this->begin() + index); 1070b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1080b575de8ed0b628d84d256f5846500b0385979bdTim Murray ssize_t add(const bool& obj) { 1090b575de8ed0b628d84d256f5846500b0385979bdTim Murray this->push_back(obj); 1100b575de8ed0b628d84d256f5846500b0385979bdTim Murray return this->size() - 1; 1110b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1120b575de8ed0b628d84d256f5846500b0385979bdTim Murray void setCapacity(ssize_t capacity) { 1130b575de8ed0b628d84d256f5846500b0385979bdTim Murray this->resize(capacity); 1140b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1150b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1160b575de8ed0b628d84d256f5846500b0385979bdTim Murray bool* editArray() { 1170b575de8ed0b628d84d256f5846500b0385979bdTim Murray return (bool*)this->data(); 1180b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1190b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1200b575de8ed0b628d84d256f5846500b0385979bdTim Murray const bool* array() { 1210b575de8ed0b628d84d256f5846500b0385979bdTim Murray return (const bool*)this->data(); 1220b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1230b575de8ed0b628d84d256f5846500b0385979bdTim Murray }; 1240b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1250b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1260b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1270b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif // RS_SERVER 1280b575de8ed0b628d84d256f5846500b0385979bdTim Murray 129326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 130326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#if 1 133af12ac6a08651464f8d823add667c706f993b587Steve Block#define rsAssert(v) do {if(!(v)) ALOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0) 134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#else 135afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk#define rsAssert(v) while (0) 136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif 137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 138326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T> 139326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsT rsMin(T in1, T in2) 140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (in1 > in2) { 142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return in2; 143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return in1; 145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 147326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T> 148afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukT rsMax(T in1, T in2) { 149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (in1 < in2) { 150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return in2; 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return in1; 153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 155326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T> 156afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukT rsFindHighBit(T val) { 157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t bit = 0; 158afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk while (val > 1) { 159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams bit++; 160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams val>>=1; 161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return bit; 163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 165326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T> 166afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool rsIsPow2(T val) { 167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return (val & (val-1)) == 0; 168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 170326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T> 171afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukT rsHigherPow2(T v) { 172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (rsIsPow2(v)) { 173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return v; 174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 1 << (rsFindHighBit(v) + 1); 176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 178326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T> 179afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukT rsLowerPow2(T v) { 180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (rsIsPow2(v)) { 181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return v; 182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 1 << rsFindHighBit(v); 184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 18694999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hinestemplate<typename T> 18794999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen HinesT rsRound(T v, unsigned int r) { 18894999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines // Only valid for rounding up to powers of 2. 18994999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines if ((r & (r - 1)) != 0) { 19094999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines rsAssert(false && "Must be power of 2 for rounding up"); 19194999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines return v; 19294999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines } 19394999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines T res = v + (r - 1); 19494999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines if (res < v) { 19594999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines rsAssert(false && "Overflow of rounding operation"); 19694999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines return v; 19794999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines } 19894999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines res &= ~(r - 1); 19994999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines return res; 20094999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines} 20194999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines 202afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic inline uint16_t rs888to565(uint32_t r, uint32_t g, uint32_t b) { 203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint16_t t = 0; 20452a9f5257141322219e4ce48b6980c9d14c80b1bJason Sams t |= b >> 3; 205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams t |= (g >> 2) << 5; 20652a9f5257141322219e4ce48b6980c9d14c80b1bJason Sams t |= (r >> 3) << 11; 207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return t; 208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 210afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic inline uint16_t rsBoxFilter565(uint16_t i1, uint16_t i2, uint16_t i3, uint16_t i4) { 211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t r = ((i1 & 0x1f) + (i2 & 0x1f) + (i3 & 0x1f) + (i4 & 0x1f)); 212565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t g = ((i1 >> 5) & 0x3f) + ((i2 >> 5) & 0x3f) + ((i3 >> 5) & 0x3f) + ((i4 >> 5) & 0x3f); 213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t b = ((i1 >> 11) + (i2 >> 11) + (i3 >> 11) + (i4 >> 11)); 214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return (r >> 2) | ((g >> 2) << 5) | ((b >> 2) << 11); 215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 217afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic inline uint32_t rsBoxFilter8888(uint32_t i1, uint32_t i2, uint32_t i3, uint32_t i4) { 218565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t r = (i1 & 0xff) + (i2 & 0xff) + (i3 & 0xff) + (i4 & 0xff); 219565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t g = ((i1 >> 8) & 0xff) + ((i2 >> 8) & 0xff) + ((i3 >> 8) & 0xff) + ((i4 >> 8) & 0xff); 220565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t b = ((i1 >> 16) & 0xff) + ((i2 >> 16) & 0xff) + ((i3 >> 16) & 0xff) + ((i4 >> 16) & 0xff); 221565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t a = ((i1 >> 24) & 0xff) + ((i2 >> 24) & 0xff) + ((i3 >> 24) & 0xff) + ((i4 >> 24) & 0xff); 222565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return (r >> 2) | ((g >> 2) << 8) | ((b >> 2) << 16) | ((a >> 2) << 24); 223565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams} 224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif //ANDROID_RS_OBJECT_BASE_H 229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 230326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 231