Type.cpp revision 7758a5b899bc8d230aff12e15c3283ea8c248609
1221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/* 269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams * Copyright (C) 2012 The Android Open Source Project 3221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * 4221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * you may not use this file except in compliance with the License. 6221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * You may obtain a copy of the License at 7221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * 8221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * 10221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * Unless required by applicable law or agreed to in writing, software 11221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * See the License for the specific language governing permissions and 14221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * limitations under the License. 15221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams */ 16221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 17221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <malloc.h> 18221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <string.h> 19221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 20221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "RenderScript.h" 21eeaf7142d7e06efb3e0ddc7ef542884ab1d527dcTim Murray#include "rsCppInternal.h" 22221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 23eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray// from system/graphics.h 24eb4426dfb63983559cf903b2ea984569e990c4fdTim Murrayenum { 25eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray HAL_PIXEL_FORMAT_YV12 = 0x32315659, // YCrCb 4:2:0 Planar 26eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray HAL_PIXEL_FORMAT_YCrCb_420_SP = 0x11, // NV21 27eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray}; 28eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray 2969cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace android; 309eb7f4b90120ebe4be74343856e86b46495f72dfTim Murrayusing namespace RSC; 3169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams 32221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::calcElementCount() { 33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams bool hasLod = hasMipmaps(); 34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t x = getX(); 35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t y = getY(); 36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t z = getZ(); 37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t faces = 1; 38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (hasFaces()) { 39221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams faces = 6; 40221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 41221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (x == 0) { 42221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams x = 1; 43221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 44221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (y == 0) { 45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams y = 1; 46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (z == 0) { 48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams z = 1; 49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 50221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 51221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t count = x * y * z * faces; 52221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams while (hasLod && ((x > 1) || (y > 1) || (z > 1))) { 53221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(x > 1) { 54221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams x >>= 1; 55221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(y > 1) { 57221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams y >>= 1; 58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 59221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(z > 1) { 60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams z >>= 1; 61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams count += x * y * z * faces; 64221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElementCount = count; 66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 67221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 6984bf2b877024aaa154b66e0f2338d54bdabd855aTim MurrayType::Type(void *id, sp<RS> rs) : BaseObj(id, rs) { 70221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimX = 0; 71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimY = 0; 72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimZ = 0; 73221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimMipmaps = false; 74221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimFaces = false; 75221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElement = NULL; 76eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray mYuvFormat = RS_YUV_NONE; 77221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 78221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 79221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::updateFromNative() { 80221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // We have 6 integer to obtain mDimX; mDimY; mDimZ; 81221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // mDimLOD; mDimFaces; mElement; 82221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 83221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams /* 84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int[] dataBuffer = new int[6]; 85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS.nTypeGetNativeData(getID(), dataBuffer); 86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimX = dataBuffer[0]; 88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimY = dataBuffer[1]; 89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimZ = dataBuffer[2]; 90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimMipmaps = dataBuffer[3] == 1 ? true : false; 91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimFaces = dataBuffer[4] == 1 ? true : false; 92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int elementID = dataBuffer[5]; 94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(elementID != 0) { 95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElement = new Element(elementID, mRS); 96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElement.updateFromNative(); 97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams calcElementCount(); 99221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams */ 100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 10296267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murraysp<const Type> Type::create(sp<RS> rs, sp<const Element> e, uint32_t dimX, uint32_t dimY, uint32_t dimZ) { 103a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray void * id = RS::dispatch->TypeCreate(rs->getContext(), e->getID(), dimX, dimY, dimZ, false, false, 0); 10496267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray Type *t = new Type(id, rs); 10596267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray 10696267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray t->mElement = e; 10796267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray t->mDimX = dimX; 10896267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray t->mDimY = dimY; 10996267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray t->mDimZ = dimZ; 11096267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray t->mDimMipmaps = false; 11196267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray t->mDimFaces = false; 11296267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray 11396267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray t->calcElementCount(); 11496267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray 11596267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray return t; 11696267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray} 11796267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray 11884bf2b877024aaa154b66e0f2338d54bdabd855aTim MurrayType::Builder::Builder(sp<RS> rs, sp<const Element> e) { 1197758a5b899bc8d230aff12e15c3283ea8c248609Tim Murray mRS = rs.get(); 120221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElement = e; 121221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimX = 0; 122221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimY = 0; 123221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimZ = 0; 124221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimMipmaps = false; 125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimFaces = false; 126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 127221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setX(uint32_t value) { 129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(value < 1) { 130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Values of less than 1 for Dimension X are not valid."); 131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimX = value; 133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 1357d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hinesvoid Type::Builder::setY(uint32_t value) { 136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(value < 1) { 137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Values of less than 1 for Dimension Y are not valid."); 138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimY = value; 140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 142eb4426dfb63983559cf903b2ea984569e990c4fdTim Murrayvoid Type::Builder::setZ(uint32_t value) { 143eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray if(value < 1) { 144eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray ALOGE("Values of less than 1 for Dimension Z are not valid."); 145eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray } 146eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray mDimZ = value; 147eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray} 148eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray 149eb4426dfb63983559cf903b2ea984569e990c4fdTim Murrayvoid Type::Builder::setYuvFormat(RSYuvFormat format) { 150eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray if (format != RS_YUV_NONE && !(mElement->isCompatible(Element::YUV(mRS)))) { 151eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray ALOGE("Invalid element for use with YUV."); 152eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray return; 153eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray } 154eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray 155eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray if (format >= RS_YUV_MAX) { 156eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray ALOGE("Invalid YUV format."); 157eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray return; 158eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray } 159eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray mYuvFormat = format; 160eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray} 161eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray 162eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray 163221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setMipmaps(bool value) { 164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimMipmaps = value; 165221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 166221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setFaces(bool value) { 168221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimFaces = value; 169221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 170221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 17169cccdf0659a193d6a75420ec745421fb5c436e6Jason Samssp<const Type> Type::Builder::create() { 172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimZ > 0) { 173221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((mDimX < 1) || (mDimY < 1)) { 174221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Both X and Y dimension required when Z is present."); 175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 176221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimFaces) { 177221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Cube maps not supported with 3D types."); 178221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 179221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 180221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimY > 0) { 181221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimX < 1) { 182221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("X dimension required when Y is present."); 183221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 184221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 185221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimFaces) { 186221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimY < 1) { 187221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Cube maps require 2D Types."); 188221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 189221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 190221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 191eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray uint32_t nativeYuv; 192eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray switch(mYuvFormat) { 193eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray case(RS_YUV_YV12): 194eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray nativeYuv = HAL_PIXEL_FORMAT_YV12; 195eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray break; 196eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray case (RS_YUV_NV21): 197eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray nativeYuv = HAL_PIXEL_FORMAT_YCrCb_420_SP; 198eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray break; 199eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray default: 200eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray nativeYuv = 0; 201eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray } 202eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray 203a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray void * id = RS::dispatch->TypeCreate(mRS->getContext(), mElement->getID(), mDimX, mDimY, mDimZ, 204a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray mDimMipmaps, mDimFaces, 0); 205221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams Type *t = new Type(id, mRS); 206221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mElement = mElement; 207221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mDimX = mDimX; 208221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mDimY = mDimY; 209221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mDimZ = mDimZ; 210221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mDimMipmaps = mDimMipmaps; 211221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mDimFaces = mDimFaces; 212221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 213221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->calcElementCount(); 214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return t; 215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 216221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 217