Type.cpp revision 69cccdf0659a193d6a75420ec745421fb5c436e6
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 17f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams#define LOG_TAG "libRS_cpp" 18f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams 19221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <utils/Log.h> 20221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <malloc.h> 21221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <string.h> 22221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 23221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "RenderScript.h" 24221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "Element.h" 25221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "Type.h" 26221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2769cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace android; 2869cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace renderscriptCpp; 2969cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams 30221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::calcElementCount() { 31221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams bool hasLod = hasMipmaps(); 32221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t x = getX(); 33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t y = getY(); 34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t z = getZ(); 35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t faces = 1; 36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (hasFaces()) { 37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams faces = 6; 38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 39221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (x == 0) { 40221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams x = 1; 41221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 42221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (y == 0) { 43221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams y = 1; 44221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (z == 0) { 46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams z = 1; 47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t count = x * y * z * faces; 50221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams while (hasLod && ((x > 1) || (y > 1) || (z > 1))) { 51221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(x > 1) { 52221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams x >>= 1; 53221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 54221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(y > 1) { 55221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams y >>= 1; 56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 57221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(z > 1) { 58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams z >>= 1; 59221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams count += x * y * z * faces; 62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElementCount = count; 64221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 67221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsType::Type(void *id, RenderScript *rs) : BaseObj(id, rs) { 68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimX = 0; 69221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimY = 0; 70221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimZ = 0; 71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimMipmaps = false; 72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimFaces = false; 73221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElement = NULL; 74221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 75221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 76221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::updateFromNative() { 77221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // We have 6 integer to obtain mDimX; mDimY; mDimZ; 78221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // mDimLOD; mDimFaces; mElement; 79221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 80221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams /* 81221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int[] dataBuffer = new int[6]; 82221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS.nTypeGetNativeData(getID(), dataBuffer); 83221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimX = dataBuffer[0]; 85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimY = dataBuffer[1]; 86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimZ = dataBuffer[2]; 87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimMipmaps = dataBuffer[3] == 1 ? true : false; 88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimFaces = dataBuffer[4] == 1 ? true : false; 89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int elementID = dataBuffer[5]; 91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(elementID != 0) { 92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElement = new Element(elementID, mRS); 93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElement.updateFromNative(); 94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams calcElementCount(); 96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams */ 97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 9969cccdf0659a193d6a75420ec745421fb5c436e6Jason SamsType::Builder::Builder(RenderScript *rs, sp<const Element> e) { 100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS = rs; 101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElement = e; 102221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimX = 0; 103221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimY = 0; 104221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimZ = 0; 105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimMipmaps = false; 106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimFaces = false; 107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setX(uint32_t value) { 110221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(value < 1) { 111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Values of less than 1 for Dimension X are not valid."); 112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 113221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimX = value; 114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 115221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 116221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setY(int value) { 117221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(value < 1) { 118221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Values of less than 1 for Dimension Y are not valid."); 119221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 120221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimY = value; 121221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 122221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 123221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setMipmaps(bool value) { 124221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimMipmaps = value; 125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 127221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setFaces(bool value) { 128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mDimFaces = value; 129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 13169cccdf0659a193d6a75420ec745421fb5c436e6Jason Samssp<const Type> Type::Builder::create() { 132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimZ > 0) { 133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((mDimX < 1) || (mDimY < 1)) { 134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Both X and Y dimension required when Z is present."); 135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimFaces) { 137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Cube maps not supported with 3D types."); 138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimY > 0) { 141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimX < 1) { 142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("X dimension required when Y is present."); 143221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 144221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 145221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimFaces) { 146221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mDimY < 1) { 147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Cube maps require 2D Types."); 148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 149221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 15169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams void * id = rsTypeCreate(mRS->mContext, mElement->getID(), mDimX, mDimY, mDimZ, 15269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams mDimMipmaps, mDimFaces); 153221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams Type *t = new Type(id, mRS); 154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mElement = mElement; 155221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mDimX = mDimX; 156221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mDimY = mDimY; 157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mDimZ = mDimZ; 158221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mDimMipmaps = mDimMipmaps; 159221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->mDimFaces = mDimFaces; 160221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->calcElementCount(); 162221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return t; 163221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 165