rsType.cpp revision 9f70a4e63825afe9f786483722e1669b3625f5e9
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 22afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukType::Type(Context *rsc) : ObjectBase(rsc) { 23246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk memset(&mHal, 0, sizeof(mHal)); 24246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mDimLOD = false; 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 27c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid Type::preDestroy() const { 288154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct = 0; ct < mRSC->mStateType.mTypes.size(); ct++) { 298154954868694e1f233d87d4933a474518b1cb81Jason Sams if (mRSC->mStateType.mTypes[ct] == this) { 308154954868694e1f233d87d4933a474518b1cb81Jason Sams mRSC->mStateType.mTypes.removeAt(ct); 318154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 328154954868694e1f233d87d4933a474518b1cb81Jason Sams } 338154954868694e1f233d87d4933a474518b1cb81Jason Sams } 34225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams} 35225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams 36afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukType::~Type() { 37246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk clear(); 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 40afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Type::clear() { 41246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk if (mHal.state.lodCount) { 42246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk delete [] mHal.state.lodDimX; 43246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk delete [] mHal.state.lodDimY; 44246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk delete [] mHal.state.lodDimZ; 45246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk delete [] mHal.state.lodOffset; 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mElement.clear(); 4850bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk memset(&mHal, 0, sizeof(mHal)); 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 51afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukTypeState::TypeState() { 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 54afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukTypeState::~TypeState() { 55c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk rsAssert(!mTypes.size()); 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 58afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouksize_t Type::getOffsetForFace(uint32_t face) const { 5950bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk rsAssert(mHal.state.faces); 60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 0; 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 63afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Type::compute() { 64246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk uint32_t oldLODCount = mHal.state.lodCount; 65246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk if (mDimLOD) { 6650bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk uint32_t l2x = rsFindHighBit(mHal.state.dimX) + 1; 6750bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk uint32_t l2y = rsFindHighBit(mHal.state.dimY) + 1; 6850bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk uint32_t l2z = rsFindHighBit(mHal.state.dimZ) + 1; 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 70246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodCount = rsMax(l2x, l2y); 71246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodCount = rsMax(mHal.state.lodCount, l2z); 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } else { 73246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodCount = 1; 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 75246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk if (mHal.state.lodCount != oldLODCount) { 76246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk if (oldLODCount) { 77246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk delete [] mHal.state.lodDimX; 78246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk delete [] mHal.state.lodDimY; 79246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk delete [] mHal.state.lodDimZ; 80246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk delete [] mHal.state.lodOffset; 81417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk } 82246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodDimX = new uint32_t[mHal.state.lodCount]; 83246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodDimY = new uint32_t[mHal.state.lodCount]; 84246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodDimZ = new uint32_t[mHal.state.lodCount]; 85246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodOffset = new uint32_t[mHal.state.lodCount]; 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 8850bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk uint32_t tx = mHal.state.dimX; 8950bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk uint32_t ty = mHal.state.dimY; 9050bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk uint32_t tz = mHal.state.dimZ; 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t offset = 0; 92246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk for (uint32_t lod=0; lod < mHal.state.lodCount; lod++) { 93246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodDimX[lod] = tx; 94246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodDimY[lod] = ty; 95246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodDimZ[lod] = tz; 96246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodOffset[lod] = offset; 97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes(); 987c52898ac201043a26b3edb7526d414684cfb96bJason Sams if (tx > 1) tx >>= 1; 997c52898ac201043a26b3edb7526d414684cfb96bJason Sams if (ty > 1) ty >>= 1; 1007c52898ac201043a26b3edb7526d414684cfb96bJason Sams if (tz > 1) tz >>= 1; 101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // At this point the offset is the size of a mipmap chain; 104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mMipChainSizeBytes = offset; 105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 10650bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk if (mHal.state.faces) { 107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset *= 6; 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTotalSizeBytes = offset; 11050bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk mHal.state.element = mElement.get(); 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 113afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const { 114246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk uint32_t offset = mHal.state.lodOffset[lod]; 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += x * mElement->getSizeBytes(); 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 119afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const { 120246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk uint32_t offset = mHal.state.lodOffset[lod]; 121246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk offset += (x + y * mHal.state.lodDimX[lod]) * mElement->getSizeBytes(); 122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 125afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const { 126246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk uint32_t offset = mHal.state.lodOffset[lod]; 127246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk offset += (x + 128246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk y * mHal.state.lodDimX[lod] + 129246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk z * mHal.state.lodDimX[lod] * mHal.state.lodDimY[lod]) * mElement->getSizeBytes(); 130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 13350bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchoukuint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, 13450bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk uint32_t x, uint32_t y) const { 135246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk uint32_t offset = mHal.state.lodOffset[lod]; 136246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk offset += (x + y * mHal.state.lodDimX[lod]) * mElement->getSizeBytes(); 137bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams 138bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams if (face != 0) { 139bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams uint32_t faceOffset = getSizeBytes() / 6; 140bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams offset += faceOffset * face; 141bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams } 142bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams return offset; 143bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams} 144bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams 145afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Type::dumpLOGV(const char *prefix) const { 146e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams char buf[1024]; 147e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams ObjectBase::dumpLOGV(prefix); 14850bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk ALOGV("%s Type: x=%u y=%u z=%u mip=%i face=%i", prefix, 14950bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk mHal.state.dimX, 15050bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk mHal.state.dimY, 15150bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk mHal.state.dimZ, 152246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk mHal.state.lodCount, 15350bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk mHal.state.faces); 15487319de2b16a185cf360827c96a42cf1fcaae744Jason Sams snprintf(buf, sizeof(buf), "%s element: ", prefix); 155e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams mElement->dumpLOGV(buf); 156e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams} 157e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 158afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Type::serialize(OStream *stream) const { 159fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Need to identify ourselves 160fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32((uint32_t)getClassId()); 161fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 162fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name(getName()); 163fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&name); 164fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 165fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mElement->serialize(stream); 166fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 16750bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk stream->addU32(mHal.state.dimX); 16850bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk stream->addU32(mHal.state.dimY); 16950bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk stream->addU32(mHal.state.dimZ); 170fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 171246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk stream->addU8((uint8_t)(mHal.state.lodCount ? 1 : 0)); 17250bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk stream->addU8((uint8_t)(mHal.state.faces ? 1 : 0)); 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 175afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukType *Type::createFromStream(Context *rsc, IStream *stream) { 176fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 177b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 178afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (classID != RS_A3D_CLASS_ID_TYPE) { 179af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("type loading skipped due to invalid class id\n"); 180fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 181fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 182fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 183fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 184fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 185fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 186fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Element *elem = Element::createFromStream(rsc, stream); 187afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!elem) { 188fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 189fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 190fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 191f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams uint32_t x = stream->loadU32(); 192f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams uint32_t y = stream->loadU32(); 193f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams uint32_t z = stream->loadU32(); 194f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams uint8_t lod = stream->loadU8(); 195f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams uint8_t faces = stream->loadU8(); 196c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Type *type = Type::getType(rsc, elem, x, y, z, lod != 0, faces !=0 ); 197c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk elem->decUserRef(); 198c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return type; 199fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 200fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 201afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool Type::getIsNp2() const { 202ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams uint32_t x = getDimX(); 203ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams uint32_t y = getDimY(); 204ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams uint32_t z = getDimZ(); 205ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams 206ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams if (x && (x & (x-1))) { 207ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return true; 208ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams } 209ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams if (y && (y & (y-1))) { 210ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return true; 211ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams } 212ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams if (z && (z & (z-1))) { 213ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return true; 214ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams } 215ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return false; 216ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams} 217ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams 218c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<Type> Type::getTypeRef(Context *rsc, const Element *e, 219c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t dimX, uint32_t dimY, uint32_t dimZ, 220c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool dimLOD, bool dimFaces) { 221c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<Type> returnRef; 222e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 22396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams TypeState * stc = &rsc->mStateType; 224f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 225f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncLock(); 22696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) { 22796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Type *t = stc->mTypes[ct]; 228f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (t->getElement() != e) continue; 22996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams if (t->getDimX() != dimX) continue; 230f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (t->getDimY() != dimY) continue; 231f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (t->getDimZ() != dimZ) continue; 232f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (t->getDimLOD() != dimLOD) continue; 233f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (t->getDimFaces() != dimFaces) continue; 234c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(t); 235f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncUnlock(); 236c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 23796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 238f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncUnlock(); 239f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 24096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 24196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Type *nt = new Type(rsc); 242246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk nt->mDimLOD = dimLOD; 243c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(nt); 244f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams nt->mElement.set(e); 24550bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk nt->mHal.state.dimX = dimX; 24650bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk nt->mHal.state.dimY = dimY; 24750bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk nt->mHal.state.dimZ = dimZ; 24850bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk nt->mHal.state.faces = dimFaces; 24996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams nt->compute(); 250f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 251f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncLock(); 252f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams stc->mTypes.push(nt); 253f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncUnlock(); 254f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 255c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 25696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 25796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 258c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<Type> Type::cloneAndResize1D(Context *rsc, uint32_t dimX) const { 259c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return getTypeRef(rsc, mElement.get(), dimX, 26019d951257602fc839e5a2e4de599699da82d5311Stephen Hines getDimY(), getDimZ(), getDimLOD(), getDimFaces()); 261f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams} 26296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 263c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<Type> Type::cloneAndResize2D(Context *rsc, 264afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t dimX, 265afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t dimY) const { 266c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return getTypeRef(rsc, mElement.get(), dimX, dimY, 26719d951257602fc839e5a2e4de599699da82d5311Stephen Hines getDimZ(), getDimLOD(), getDimFaces()); 26896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 26996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 27096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 2719f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hinesvoid Type::incRefs(const void *ptr, size_t ct, size_t startOff) const { 2729f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines const uint8_t *p = static_cast<const uint8_t *>(ptr); 2739f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines const Element *e = mHal.state.element; 2749f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines uint32_t stride = e->getSizeBytes(); 2759f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 2769f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines p += stride * startOff; 2779f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines while (ct > 0) { 2789f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines e->incRefs(p); 2799f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines ct--; 2809f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines p += stride; 2819f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines } 2829f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines} 2839f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 2849f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 2859f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hinesvoid Type::decRefs(const void *ptr, size_t ct, size_t startOff) const { 2869f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines if (!mHal.state.element->getHasReferences()) { 2879f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines return; 2889f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines } 2899f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines const uint8_t *p = static_cast<const uint8_t *>(ptr); 2909f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines const Element *e = mHal.state.element; 2919f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines uint32_t stride = e->getSizeBytes(); 2929f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 2939f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines p += stride * startOff; 2949f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines while (ct > 0) { 2959f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines e->decRefs(p); 2969f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines ct--; 2979f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines p += stride; 2989f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines } 2999f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines} 3009f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 3019f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 302326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams////////////////////////////////////////////////// 303e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 304326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 305326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 306326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 307c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsType rsi_TypeCreate(Context *rsc, RsElement _e, uint32_t dimX, 30825413ecdb9359410652da7b8ef5ec0ce0fe0a640Jason Sams uint32_t dimY, uint32_t dimZ, bool mips, bool faces) { 3092353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams Element *e = static_cast<Element *>(_e); 3102353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 31125413ecdb9359410652da7b8ef5ec0ce0fe0a640Jason Sams return Type::getType(rsc, e, dimX, dimY, dimZ, mips, faces); 312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 314c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 315c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 316c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 317afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaTypeGetNativeData(RsContext con, RsType type, uint32_t *typeData, uint32_t typeDataSize) { 318dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk rsAssert(typeDataSize == 6); 31950bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk // Pack the data in the follofing way mHal.state.dimX; mHal.state.dimY; mHal.state.dimZ; 320246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk // mHal.state.lodCount; mHal.state.faces; mElement; into typeData 321dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk Type *t = static_cast<Type *>(type); 322dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 323dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimX(); 324dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimY(); 325dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimZ(); 326246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk (*typeData++) = t->getDimLOD() ? 1 : 0; 327dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimFaces() ? 1 : 0; 328dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = (uint32_t)t->getElement(); 329dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk t->getElement()->incUserRef(); 330dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 331