rsType.cpp revision a572aca4eb4ddb32c10baa1f529431cfefd756b8
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; 4586087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines 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 5886087f2f1da630d43f4010c246619f3fd4fad286Stephen Hinessize_t Type::getOffsetForFace(uint32_t face) const { 5986087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines rsAssert(mHal.state.faces); 6086087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines return 0; 6186087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines} 6286087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines 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; 8086087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines 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]; 8586087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines 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; 9186087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines 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; 9686087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines mHal.state.lodOffset[lod] = offset; 9786087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines 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; 10486087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines mMipChainSizeBytes = offset; 105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 10650bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk if (mHal.state.faces) { 10786087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines offset *= 6; 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 10986087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines mTotalSizeBytes = offset; 11050bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk mHal.state.element = mElement.get(); 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 11386087f2f1da630d43f4010c246619f3fd4fad286Stephen Hinesuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const { 11486087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines uint32_t offset = mHal.state.lodOffset[lod]; 11586087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines offset += x * mElement->getSizeBytes(); 11686087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines return offset; 11786087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines} 11886087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines 11986087f2f1da630d43f4010c246619f3fd4fad286Stephen Hinesuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const { 12086087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines uint32_t offset = mHal.state.lodOffset[lod]; 12186087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines offset += (x + y * mHal.state.lodDimX[lod]) * mElement->getSizeBytes(); 12286087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines return offset; 12386087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines} 12486087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines 12586087f2f1da630d43f4010c246619f3fd4fad286Stephen Hinesuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const { 12686087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines uint32_t offset = mHal.state.lodOffset[lod]; 12786087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines offset += (x + 12886087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines y * mHal.state.lodDimX[lod] + 12986087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines z * mHal.state.lodDimX[lod] * mHal.state.lodDimY[lod]) * mElement->getSizeBytes(); 13086087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines return offset; 13186087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines} 13286087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines 13386087f2f1da630d43f4010c246619f3fd4fad286Stephen Hinesuint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, 13486087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines uint32_t x, uint32_t y) const { 13586087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines uint32_t offset = mHal.state.lodOffset[lod]; 13686087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines offset += (x + y * mHal.state.lodDimX[lod]) * mElement->getSizeBytes(); 13786087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines 13886087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines if (face != 0) { 13986087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines uint32_t faceOffset = getSizeBytes() / 6; 14086087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines offset += faceOffset * face; 14186087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines } 14286087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines return offset; 14386087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines} 14486087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines 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 158e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Type::serialize(Context *rsc, 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 165e3150cfb3edb028407669e4a65e087eae77e718cJason Sams mElement->serialize(rsc, 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(); 196a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams Type *type = Type::getType(rsc, elem, x, y, z, lod != 0, faces !=0, 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, 220a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams bool dimLOD, bool dimFaces, uint32_t dimYuv) { 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; 234a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams if (t->getDimYuv() != dimYuv) continue; 235c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(t); 236f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncUnlock(); 237c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 23896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 239f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncUnlock(); 240f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 24196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 24296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Type *nt = new Type(rsc); 243246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk nt->mDimLOD = dimLOD; 244c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(nt); 245f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams nt->mElement.set(e); 24650bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk nt->mHal.state.dimX = dimX; 24750bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk nt->mHal.state.dimY = dimY; 24850bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk nt->mHal.state.dimZ = dimZ; 24950bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk nt->mHal.state.faces = dimFaces; 250a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams nt->mHal.state.dimYuv = dimYuv; 25196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams nt->compute(); 252f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 253f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncLock(); 254f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams stc->mTypes.push(nt); 255f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncUnlock(); 256f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 257c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 25896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 25996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 260c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<Type> Type::cloneAndResize1D(Context *rsc, uint32_t dimX) const { 261c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return getTypeRef(rsc, mElement.get(), dimX, 262a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams getDimY(), getDimZ(), getDimLOD(), getDimFaces(), getDimYuv()); 263f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams} 26496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 265c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<Type> Type::cloneAndResize2D(Context *rsc, 266afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t dimX, 267afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t dimY) const { 268c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return getTypeRef(rsc, mElement.get(), dimX, dimY, 269a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams getDimZ(), getDimLOD(), getDimFaces(), getDimYuv()); 27096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 27196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 27296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 2739f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hinesvoid Type::incRefs(const void *ptr, size_t ct, size_t startOff) const { 2749f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines const uint8_t *p = static_cast<const uint8_t *>(ptr); 2759f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines const Element *e = mHal.state.element; 2769f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines uint32_t stride = e->getSizeBytes(); 2779f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 2789f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines p += stride * startOff; 2799f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines while (ct > 0) { 2809f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines e->incRefs(p); 2819f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines ct--; 2829f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines p += stride; 2839f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines } 2849f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines} 2859f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 2869f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 2879f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hinesvoid Type::decRefs(const void *ptr, size_t ct, size_t startOff) const { 2889f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines if (!mHal.state.element->getHasReferences()) { 2899f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines return; 2909f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines } 2919f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines const uint8_t *p = static_cast<const uint8_t *>(ptr); 2929f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines const Element *e = mHal.state.element; 2939f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines uint32_t stride = e->getSizeBytes(); 2949f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 2959f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines p += stride * startOff; 2969f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines while (ct > 0) { 2979f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines e->decRefs(p); 2989f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines ct--; 2999f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines p += stride; 3009f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines } 3019f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines} 3029f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 3039f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines 304326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams////////////////////////////////////////////////// 305e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 306326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 307326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 308326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 309c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsType rsi_TypeCreate(Context *rsc, RsElement _e, uint32_t dimX, 310a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams uint32_t dimY, uint32_t dimZ, bool mips, bool faces, uint32_t yuv) { 3112353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams Element *e = static_cast<Element *>(_e); 3122353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 313a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams return Type::getType(rsc, e, dimX, dimY, dimZ, mips, faces, yuv); 314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 316c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 317c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 318c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 319afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaTypeGetNativeData(RsContext con, RsType type, uint32_t *typeData, uint32_t typeDataSize) { 320dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk rsAssert(typeDataSize == 6); 32150bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk // Pack the data in the follofing way mHal.state.dimX; mHal.state.dimY; mHal.state.dimZ; 322246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk // mHal.state.lodCount; mHal.state.faces; mElement; into typeData 323dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk Type *t = static_cast<Type *>(type); 324dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 325dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimX(); 326dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimY(); 327dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimZ(); 328246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk (*typeData++) = t->getDimLOD() ? 1 : 0; 329dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimFaces() ? 1 : 0; 330dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = (uint32_t)t->getElement(); 331dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk t->getElement()->incUserRef(); 332dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 333