rsType.cpp revision d19f10d43aa400e1183aa21a97099d02074131a2
1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/* 2d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Copyright (C) 2009 The Android Open Source Project 3d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * you may not use this file except in compliance with the License. 6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * You may obtain a copy of the License at 7d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Unless required by applicable law or agreed to in writing, software 11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * See the License for the specific language governing permissions and 14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * limitations under the License. 15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams */ 16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 17d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsContext.h" 18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 19d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android; 20d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android::renderscript; 21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 22d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsType::Type() 23d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 24d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs = 0; 25d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = 0; 26d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams clear(); 27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 28d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 29d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsType::~Type() 30d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mLODs) { 32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams delete [] mLODs; 33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 36d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Type::clear() 37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mLODs) { 39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams delete [] mLODs; 40d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs = NULL; 41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimX = 0; 43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimY = 0; 44d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimZ = 0; 45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimLOD = 0; 46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mFaces = false; 47d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mElement.clear(); 48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 50d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsTypeState::TypeState() 51d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 52d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 53d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 54d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsTypeState::~TypeState() 55d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 56d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 57d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 58d19f10d43aa400e1183aa21a97099d02074131a2Jason Samssize_t Type::getOffsetForFace(uint32_t face) const 59d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 60d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams rsAssert(mFaces); 61d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return 0; 62d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 63d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 64d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Type::compute() 65d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 66d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //LOGE("compute"); 67d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t oldLODCount = mLODCount; 68d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mDimLOD) { 69d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t l2x = rsFindHighBit(mDimX) + 1; 70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t l2y = rsFindHighBit(mDimY) + 1; 71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t l2z = rsFindHighBit(mDimZ) + 1; 72d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 73d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = rsMax(l2x, l2y); 74d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = rsMax(mLODCount, l2z); 75d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } else { 76d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = 1; 77d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 78d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mLODCount != oldLODCount) { 79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams delete [] mLODs; 80d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs = new LOD[mLODCount]; 81d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 83d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //LOGE("xyz %i %i %i", mDimX, mDimY, mDimZ); 84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //LOGE("mips %i", mLODCount); 85d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //LOGE("e size %i", mElement->getSizeBytes()); 86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t tx = mDimX; 87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t ty = mDimY; 88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t tz = mDimZ; 89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams size_t offset = 0; 90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams for (uint32_t lod=0; lod < mLODCount; lod++) { 91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mX = tx; 92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mY = ty; 93d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mZ = tz; 94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mOffset = offset; 95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //LOGE("txyz %i %i %i", tx, ty, tz); 96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes(); 97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams tx >>= 1; 98d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ty >>= 1; 99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams tz >>= 1; 100d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 101d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 102d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //LOGE("size %i", offset); 103d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 104d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams // At this point the offset is the size of a mipmap chain; 105d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mMipChainSizeBytes = offset; 106d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 107d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mFaces) { 108d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset *= 6; 109d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 110d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mTotalSizeBytes = offset; 111d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 112d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 113d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 114d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const 115d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 116d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t offset = mLODs[lod].mOffset; 117d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += x * mElement->getSizeBytes(); 118d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return offset; 119d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 120d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 121d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const 122d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 123d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t offset = mLODs[lod].mOffset; 124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes(); 125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return offset; 126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 127d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 128d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const 129d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 130d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t offset = mLODs[lod].mOffset; 131d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes(); 132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return offset; 133d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 134d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 135d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 136d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams////////////////////////////////////////////////// 137d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// 138d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android { 139d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript { 140d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 141d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_TypeBegin(Context *rsc, RsElement vse) 142d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 143d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams TypeState * stc = &rsc->mStateType; 144d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 145d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mX = 0; 146d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mY = 0; 147d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mZ = 0; 148d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mLOD = false; 149d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mFaces = false; 150d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mElement.set(static_cast<const Element *>(vse)); 151d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 152d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 153d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value) 154d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 155d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams TypeState * stc = &rsc->mStateType; 156d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 157d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (dim < 0) { 158d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //error 159d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 160d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 161d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 162d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 163d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams switch (dim) { 164d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_DIMENSION_X: 165d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mX = value; 166d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 167d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_DIMENSION_Y: 168d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mY = value; 169d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 170d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_DIMENSION_Z: 171d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mZ = value; 172d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 173d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_DIMENSION_FACE: 174d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mFaces = (value != 0); 175d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 176d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_DIMENSION_LOD: 177d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mLOD = (value != 0); 178d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 179d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams default: 180d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 181d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 182d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 183d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 184d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0; 185d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if ((dim < 0) || (dim > RS_DIMENSION_MAX)) { 186d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams LOGE("rsTypeAdd: Bad dimension"); 187d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //error 188d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 189d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 190d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 191d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams // todo: implement array support 192d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 193d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 194d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 195d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsRsType rsi_TypeCreate(Context *rsc) 196d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 197d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams TypeState * stc = &rsc->mStateType; 198d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 199d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams Type * st = new Type(); 200d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setDimX(stc->mX); 201d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setDimY(stc->mY); 202d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setDimZ(stc->mZ); 203d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setElement(stc->mElement.get()); 204d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setDimLOD(stc->mLOD); 205d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setDimFaces(stc->mFaces); 206d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->compute(); 207d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 208d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mAllTypes.add(st); 209d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 210d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return st; 211d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 212d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 213d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_TypeDestroy(Context *rsc, RsType vst) 214d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 215d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams TypeState * stc = &rsc->mStateType; 216d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams Type * st = static_cast<Type *>(vst); 217d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 218d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams for (size_t ct = 0; ct < stc->mAllTypes.size(); ct++) { 219d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (stc->mAllTypes[ct] == st) { 220d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mAllTypes.removeAt(ct); 221d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 222d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 223d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 224d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams delete st; 225d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 226d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 227d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 228d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 229d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 230