rsType.cpp revision 326e0ddf89e8df2837752fbfd7a014814b32082c
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 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#include "rsContext.h" 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 22326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsType::Type() 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs = 0; 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = 0; 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 29326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsType::~Type() 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mLODs) { 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete [] mLODs; 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::clear() 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mLODs) { 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete [] mLODs; 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs = NULL; 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimX = 0; 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimY = 0; 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimZ = 0; 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimLOD = 0; 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mFaces = false; 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mElement.clear(); 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 50326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::TypeState() 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 54326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::~TypeState() 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Type::getOffsetForFace(uint32_t face) const 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mFaces); 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 0; 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::compute() 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //LOGE("compute"); 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t oldLODCount = mLODCount; 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mDimLOD) { 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t l2x = rsFindHighBit(mDimX) + 1; 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t l2y = rsFindHighBit(mDimY) + 1; 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t l2z = rsFindHighBit(mDimZ) + 1; 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = rsMax(l2x, l2y); 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = rsMax(mLODCount, l2z); 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } else { 76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = 1; 77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mLODCount != oldLODCount) { 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete [] mLODs; 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs = new LOD[mLODCount]; 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //LOGE("xyz %i %i %i", mDimX, mDimY, mDimZ); 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //LOGE("mips %i", mLODCount); 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //LOGE("e size %i", mElement->getSizeBytes()); 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t tx = mDimX; 87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t ty = mDimY; 88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t tz = mDimZ; 89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t offset = 0; 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t lod=0; lod < mLODCount; lod++) { 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mX = tx; 92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mY = ty; 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mZ = tz; 94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mOffset = offset; 95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //LOGE("txyz %i %i %i", tx, ty, tz); 96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes(); 97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams tx >>= 1; 98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ty >>= 1; 99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams tz >>= 1; 100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //LOGE("size %i", offset); 103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // At this point the offset is the size of a mipmap chain; 105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mMipChainSizeBytes = offset; 106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mFaces) { 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset *= 6; 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTotalSizeBytes = offset; 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 114326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t offset = mLODs[lod].mOffset; 117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += x * mElement->getSizeBytes(); 118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 121326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const 122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t offset = mLODs[lod].mOffset; 124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes(); 125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 128326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const 129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t offset = mLODs[lod].mOffset; 131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes(); 132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams////////////////////////////////////////////////// 137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// 138326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 139326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 141326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeBegin(Context *rsc, RsElement vse) 142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams TypeState * stc = &rsc->mStateType; 144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mX = 0; 146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mY = 0; 147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mZ = 0; 148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mLOD = false; 149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mFaces = false; 150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mElement.set(static_cast<const Element *>(vse)); 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 153326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value) 154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams TypeState * stc = &rsc->mStateType; 156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (dim < 0) { 158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //error 159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams switch (dim) { 164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_X: 165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mX = value; 166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Y: 168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mY = value; 169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 170326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Z: 171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mZ = value; 172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_FACE: 174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mFaces = (value != 0); 175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_LOD: 177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mLOD = (value != 0); 178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams default: 180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0; 185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if ((dim < 0) || (dim > RS_DIMENSION_MAX)) { 186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("rsTypeAdd: Bad dimension"); 187326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //error 188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 189326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 190326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 191326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // todo: implement array support 192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 195326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsType rsi_TypeCreate(Context *rsc) 196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 197326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams TypeState * stc = &rsc->mStateType; 198326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Type * st = new Type(); 200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setDimX(stc->mX); 201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setDimY(stc->mY); 202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setDimZ(stc->mZ); 203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setElement(stc->mElement.get()); 204326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setDimLOD(stc->mLOD); 205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setDimFaces(stc->mFaces); 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->compute(); 207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mAllTypes.add(st); 209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return st; 211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 213326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeDestroy(Context *rsc, RsType vst) 214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams TypeState * stc = &rsc->mStateType; 216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Type * st = static_cast<Type *>(vst); 217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (size_t ct = 0; ct < stc->mAllTypes.size(); ct++) { 219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (stc->mAllTypes[ct] == st) { 220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mAllTypes.removeAt(ct); 221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 222326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete st; 225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 230