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 22ed9f210568082dd6d1d8a0c92c693d574d87d545Alex SakhartchoukType::Type(Context *rsc) : ObjectBase(rsc) { 23d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs = 0; 24d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = 0; 25d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams clear(); 26d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 28117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchoukvoid Type::preDestroy() const { 29e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams for (uint32_t ct = 0; ct < mRSC->mStateType.mTypes.size(); ct++) { 30e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams if (mRSC->mStateType.mTypes[ct] == this) { 31e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams mRSC->mStateType.mTypes.removeAt(ct); 32e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams break; 33e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams } 34e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams } 35b38d534873ca514f5a5230596c838aa37eca1568Jason Sams} 36b38d534873ca514f5a5230596c838aa37eca1568Jason Sams 37ed9f210568082dd6d1d8a0c92c693d574d87d545Alex SakhartchoukType::~Type() { 38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mLODs) { 39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams delete [] mLODs; 406f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk mLODs = NULL; 416f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk } 42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 44ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Type::clear() { 45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mLODs) { 46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams delete [] mLODs; 47d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs = NULL; 48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimX = 0; 50d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimY = 0; 51d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimZ = 0; 52d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimLOD = 0; 53d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mFaces = false; 54d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mElement.clear(); 55d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 56d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 57ed9f210568082dd6d1d8a0c92c693d574d87d545Alex SakhartchoukTypeState::TypeState() { 58d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 59d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 60ed9f210568082dd6d1d8a0c92c693d574d87d545Alex SakhartchoukTypeState::~TypeState() { 61117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk rsAssert(!mTypes.size()); 62d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 63d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 64ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouksize_t Type::getOffsetForFace(uint32_t face) const { 65d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams rsAssert(mFaces); 66d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return 0; 67d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 68d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 69ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Type::compute() { 70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t oldLODCount = mLODCount; 71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mDimLOD) { 72d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t l2x = rsFindHighBit(mDimX) + 1; 73d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t l2y = rsFindHighBit(mDimY) + 1; 74d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t l2z = rsFindHighBit(mDimZ) + 1; 75d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 76d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = rsMax(l2x, l2y); 77d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = rsMax(mLODCount, l2z); 78d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } else { 79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = 1; 80d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 81d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mLODCount != oldLODCount) { 82ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk if (mLODs){ 839b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk delete [] mLODs; 84dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk } 85d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs = new LOD[mLODCount]; 86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t tx = mDimX; 89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t ty = mDimY; 90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t tz = mDimZ; 91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams size_t offset = 0; 92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams for (uint32_t lod=0; lod < mLODCount; lod++) { 93d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mX = tx; 94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mY = ty; 95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mZ = tz; 96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mOffset = offset; 97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes(); 98917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams if (tx > 1) tx >>= 1; 99917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams if (ty > 1) ty >>= 1; 100917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams if (tz > 1) tz >>= 1; 101d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 102d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 103d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams // At this point the offset is the size of a mipmap chain; 104d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mMipChainSizeBytes = offset; 105d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 106d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mFaces) { 107d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset *= 6; 108d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 109d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mTotalSizeBytes = offset; 110d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 111d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 112ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const { 113d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t offset = mLODs[lod].mOffset; 114d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += x * mElement->getSizeBytes(); 115d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return offset; 116d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 117d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 118ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const { 119d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t offset = mLODs[lod].mOffset; 120d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes(); 121d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return offset; 122d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 123d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 124ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const { 125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t offset = mLODs[lod].mOffset; 126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes(); 127d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return offset; 128d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 129d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 130ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Samsuint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, uint32_t x, uint32_t y) const { 131ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams uint32_t offset = mLODs[lod].mOffset; 132ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes(); 133ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams 134ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams if (face != 0) { 135ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams uint32_t faceOffset = getSizeBytes() / 6; 136ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams offset += faceOffset * face; 137ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams } 138ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams return offset; 139ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams} 140ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams 141ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Type::dumpLOGV(const char *prefix) const { 1423c0dfbab807a459622aeade4940daddf482dec66Jason Sams char buf[1024]; 1433c0dfbab807a459622aeade4940daddf482dec66Jason Sams ObjectBase::dumpLOGV(prefix); 144a3b5960f6f28a81cd63abd69adcdfb5dcc05aa30Alex Sakhartchouk LOGV("%s Type: x=%zu y=%zu z=%zu mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces); 145add9d9633205f76cc34f04368b8482c2c369ba63Jason Sams snprintf(buf, sizeof(buf), "%s element: ", prefix); 1463c0dfbab807a459622aeade4940daddf482dec66Jason Sams mElement->dumpLOGV(buf); 1473c0dfbab807a459622aeade4940daddf482dec66Jason Sams} 1483c0dfbab807a459622aeade4940daddf482dec66Jason Sams 149ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Type::serialize(OStream *stream) const { 150aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk // Need to identify ourselves 151aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 152aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 153aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk String8 name(getName()); 154aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addString(&name); 155aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 156aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk mElement->serialize(stream); 157aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 158aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU32(mDimX); 159aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU32(mDimY); 160aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU32(mDimZ); 161aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 162aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU8((uint8_t)(mDimLOD ? 1 : 0)); 163aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU8((uint8_t)(mFaces ? 1 : 0)); 164aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk} 165aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 166ed9f210568082dd6d1d8a0c92c693d574d87d545Alex SakhartchoukType *Type::createFromStream(Context *rsc, IStream *stream) { 167aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk // First make sure we are reading the correct object 168aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 169ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk if (classID != RS_A3D_CLASS_ID_TYPE) { 170aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk LOGE("type loading skipped due to invalid class id\n"); 171aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk return NULL; 172aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk } 173aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 174aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk String8 name; 175aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->loadString(&name); 176aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 177aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk Element *elem = Element::createFromStream(rsc, stream); 178ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk if (!elem) { 179aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk return NULL; 180aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk } 181aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 18231a7e42f4baa059352f0db119de38428e655eab2Jason Sams uint32_t x = stream->loadU32(); 18331a7e42f4baa059352f0db119de38428e655eab2Jason Sams uint32_t y = stream->loadU32(); 18431a7e42f4baa059352f0db119de38428e655eab2Jason Sams uint32_t z = stream->loadU32(); 18531a7e42f4baa059352f0db119de38428e655eab2Jason Sams uint8_t lod = stream->loadU8(); 18631a7e42f4baa059352f0db119de38428e655eab2Jason Sams uint8_t faces = stream->loadU8(); 187117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk Type *type = Type::getType(rsc, elem, x, y, z, lod != 0, faces !=0 ); 188117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk elem->decUserRef(); 189117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk return type; 190aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk} 191aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 192ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukbool Type::getIsNp2() const { 1932978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams uint32_t x = getDimX(); 1942978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams uint32_t y = getDimY(); 1952978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams uint32_t z = getDimZ(); 1962978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams 1972978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams if (x && (x & (x-1))) { 1982978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams return true; 1992978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams } 2002978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams if (y && (y & (y-1))) { 2012978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams return true; 2022978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams } 2032978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams if (z && (z & (z-1))) { 2042978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams return true; 2052978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams } 2062978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams return false; 2072978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams} 2082978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams 209117abdbc67123654d0754b686c5bbdee6b44bcddAlex SakhartchoukObjectBaseRef<Type> Type::getTypeRef(Context *rsc, const Element *e, 210117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk uint32_t dimX, uint32_t dimY, uint32_t dimZ, 211117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk bool dimLOD, bool dimFaces) { 212117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk ObjectBaseRef<Type> returnRef; 2133c0dfbab807a459622aeade4940daddf482dec66Jason Sams 2145edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams TypeState * stc = &rsc->mStateType; 21531a7e42f4baa059352f0db119de38428e655eab2Jason Sams 21631a7e42f4baa059352f0db119de38428e655eab2Jason Sams ObjectBase::asyncLock(); 2175edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) { 2185edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams Type *t = stc->mTypes[ct]; 21931a7e42f4baa059352f0db119de38428e655eab2Jason Sams if (t->getElement() != e) continue; 2205edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams if (t->getDimX() != dimX) continue; 22131a7e42f4baa059352f0db119de38428e655eab2Jason Sams if (t->getDimY() != dimY) continue; 22231a7e42f4baa059352f0db119de38428e655eab2Jason Sams if (t->getDimZ() != dimZ) continue; 22331a7e42f4baa059352f0db119de38428e655eab2Jason Sams if (t->getDimLOD() != dimLOD) continue; 22431a7e42f4baa059352f0db119de38428e655eab2Jason Sams if (t->getDimFaces() != dimFaces) continue; 225117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk returnRef.set(t); 22631a7e42f4baa059352f0db119de38428e655eab2Jason Sams ObjectBase::asyncUnlock(); 227117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk return returnRef; 2285edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 22931a7e42f4baa059352f0db119de38428e655eab2Jason Sams ObjectBase::asyncUnlock(); 23031a7e42f4baa059352f0db119de38428e655eab2Jason Sams 2315edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams 2325edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams Type *nt = new Type(rsc); 233117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk returnRef.set(nt); 23431a7e42f4baa059352f0db119de38428e655eab2Jason Sams nt->mElement.set(e); 2355edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams nt->mDimX = dimX; 23631a7e42f4baa059352f0db119de38428e655eab2Jason Sams nt->mDimY = dimY; 23731a7e42f4baa059352f0db119de38428e655eab2Jason Sams nt->mDimZ = dimZ; 23831a7e42f4baa059352f0db119de38428e655eab2Jason Sams nt->mDimLOD = dimLOD; 23931a7e42f4baa059352f0db119de38428e655eab2Jason Sams nt->mFaces = dimFaces; 2405edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams nt->compute(); 24131a7e42f4baa059352f0db119de38428e655eab2Jason Sams 24231a7e42f4baa059352f0db119de38428e655eab2Jason Sams ObjectBase::asyncLock(); 24331a7e42f4baa059352f0db119de38428e655eab2Jason Sams stc->mTypes.push(nt); 24431a7e42f4baa059352f0db119de38428e655eab2Jason Sams ObjectBase::asyncUnlock(); 24531a7e42f4baa059352f0db119de38428e655eab2Jason Sams 246117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk return returnRef; 2475edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams} 2485edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams 249117abdbc67123654d0754b686c5bbdee6b44bcddAlex SakhartchoukObjectBaseRef<Type> Type::cloneAndResize1D(Context *rsc, uint32_t dimX) const { 250117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk return getTypeRef(rsc, mElement.get(), dimX, 251117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk mDimY, mDimZ, mDimLOD, mFaces); 25231a7e42f4baa059352f0db119de38428e655eab2Jason Sams} 2535edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams 254117abdbc67123654d0754b686c5bbdee6b44bcddAlex SakhartchoukObjectBaseRef<Type> Type::cloneAndResize2D(Context *rsc, 255ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk uint32_t dimX, 256ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk uint32_t dimY) const { 257117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk return getTypeRef(rsc, mElement.get(), dimX, dimY, 258117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk mDimZ, mDimLOD, mFaces); 2595edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams} 2605edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams 2615edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams 262d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams////////////////////////////////////////////////// 2631bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams// 264d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android { 265d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript { 266d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 267c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason SamsRsType rsi_TypeCreate(Context *rsc, RsElement _e, uint32_t dimX, 268bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams uint32_t dimY, uint32_t dimZ, bool mips, bool faces) { 2693b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams Element *e = static_cast<Element *>(_e); 2703b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams 271bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams return Type::getType(rsc, e, dimX, dimY, dimZ, mips, faces); 272d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 273d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 274c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams} 275c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams} 276c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 277ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsaTypeGetNativeData(RsContext con, RsType type, uint32_t *typeData, uint32_t typeDataSize) { 278581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk rsAssert(typeDataSize == 6); 279581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk // Pack the data in the follofing way mDimX; mDimY; mDimZ; 280581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk // mDimLOD; mDimFaces; mElement; into typeData 281581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk Type *t = static_cast<Type *>(type); 282581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk 283581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk (*typeData++) = t->getDimX(); 284581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk (*typeData++) = t->getDimY(); 285581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk (*typeData++) = t->getDimZ(); 286581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk (*typeData++) = t->getDimLOD(); 287581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk (*typeData++) = t->getDimFaces() ? 1 : 0; 288581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk (*typeData++) = (uint32_t)t->getElement(); 289581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk t->getElement()->incUserRef(); 290581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk} 291