1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "libRS_cpp" 18 19 #include <utils/Log.h> 20 #include <malloc.h> 21 #include <string.h> 22 23 #include "RenderScript.h" 24 #include "Element.h" 25 #include "Type.h" 26 27 using namespace android; 28 using namespace renderscriptCpp; 29 30 void Type::calcElementCount() { 31 bool hasLod = hasMipmaps(); 32 uint32_t x = getX(); 33 uint32_t y = getY(); 34 uint32_t z = getZ(); 35 uint32_t faces = 1; 36 if (hasFaces()) { 37 faces = 6; 38 } 39 if (x == 0) { 40 x = 1; 41 } 42 if (y == 0) { 43 y = 1; 44 } 45 if (z == 0) { 46 z = 1; 47 } 48 49 uint32_t count = x * y * z * faces; 50 while (hasLod && ((x > 1) || (y > 1) || (z > 1))) { 51 if(x > 1) { 52 x >>= 1; 53 } 54 if(y > 1) { 55 y >>= 1; 56 } 57 if(z > 1) { 58 z >>= 1; 59 } 60 61 count += x * y * z * faces; 62 } 63 mElementCount = count; 64 } 65 66 67 Type::Type(void *id, RenderScript *rs) : BaseObj(id, rs) { 68 mDimX = 0; 69 mDimY = 0; 70 mDimZ = 0; 71 mDimMipmaps = false; 72 mDimFaces = false; 73 mElement = NULL; 74 } 75 76 void Type::updateFromNative() { 77 // We have 6 integer to obtain mDimX; mDimY; mDimZ; 78 // mDimLOD; mDimFaces; mElement; 79 80 /* 81 int[] dataBuffer = new int[6]; 82 mRS.nTypeGetNativeData(getID(), dataBuffer); 83 84 mDimX = dataBuffer[0]; 85 mDimY = dataBuffer[1]; 86 mDimZ = dataBuffer[2]; 87 mDimMipmaps = dataBuffer[3] == 1 ? true : false; 88 mDimFaces = dataBuffer[4] == 1 ? true : false; 89 90 int elementID = dataBuffer[5]; 91 if(elementID != 0) { 92 mElement = new Element(elementID, mRS); 93 mElement.updateFromNative(); 94 } 95 calcElementCount(); 96 */ 97 } 98 99 Type::Builder::Builder(RenderScript *rs, sp<const Element> e) { 100 mRS = rs; 101 mElement = e; 102 mDimX = 0; 103 mDimY = 0; 104 mDimZ = 0; 105 mDimMipmaps = false; 106 mDimFaces = false; 107 } 108 109 void Type::Builder::setX(uint32_t value) { 110 if(value < 1) { 111 ALOGE("Values of less than 1 for Dimension X are not valid."); 112 } 113 mDimX = value; 114 } 115 116 void Type::Builder::setY(int value) { 117 if(value < 1) { 118 ALOGE("Values of less than 1 for Dimension Y are not valid."); 119 } 120 mDimY = value; 121 } 122 123 void Type::Builder::setMipmaps(bool value) { 124 mDimMipmaps = value; 125 } 126 127 void Type::Builder::setFaces(bool value) { 128 mDimFaces = value; 129 } 130 131 sp<const Type> Type::Builder::create() { 132 if (mDimZ > 0) { 133 if ((mDimX < 1) || (mDimY < 1)) { 134 ALOGE("Both X and Y dimension required when Z is present."); 135 } 136 if (mDimFaces) { 137 ALOGE("Cube maps not supported with 3D types."); 138 } 139 } 140 if (mDimY > 0) { 141 if (mDimX < 1) { 142 ALOGE("X dimension required when Y is present."); 143 } 144 } 145 if (mDimFaces) { 146 if (mDimY < 1) { 147 ALOGE("Cube maps require 2D Types."); 148 } 149 } 150 151 void * id = rsTypeCreate(mRS->mContext, mElement->getID(), mDimX, mDimY, mDimZ, 152 mDimMipmaps, mDimFaces); 153 Type *t = new Type(id, mRS); 154 t->mElement = mElement; 155 t->mDimX = mDimX; 156 t->mDimY = mDimY; 157 t->mDimZ = mDimZ; 158 t->mDimMipmaps = mDimMipmaps; 159 t->mDimFaces = mDimFaces; 160 161 t->calcElementCount(); 162 return t; 163 } 164 165