10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/* 20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009 The Android Open Source Project 30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License. 60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at 70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software 110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and 140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License. 150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */ 160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsContext.h" 180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android; 200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android::renderscript; 210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesType::Type(Context *rsc) : ObjectBase(rsc) { 230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines memset(&mHal, 0, sizeof(mHal)); 240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mDimLOD = false; 250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Type::preDestroy() const { 280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines for (uint32_t ct = 0; ct < mRSC->mStateType.mTypes.size(); ct++) { 290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (mRSC->mStateType.mTypes[ct] == this) { 300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mRSC->mStateType.mTypes.removeAt(ct); 310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines break; 320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesType::~Type() { 370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines clear(); 380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Type::clear() { 410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (mHal.state.lodCount) { 420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines delete [] mHal.state.lodDimX; 430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines delete [] mHal.state.lodDimY; 440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines delete [] mHal.state.lodDimZ; 450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines delete [] mHal.state.lodOffset; 460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mElement.clear(); 480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines memset(&mHal, 0, sizeof(mHal)); 490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesTypeState::TypeState() { 520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesTypeState::~TypeState() { 550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines rsAssert(!mTypes.size()); 560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinessize_t Type::getOffsetForFace(uint32_t face) const { 590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines rsAssert(mHal.state.faces); 600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return 0; 610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Type::compute() { 640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t oldLODCount = mHal.state.lodCount; 650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (mDimLOD) { 660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t l2x = rsFindHighBit(mHal.state.dimX) + 1; 670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t l2y = rsFindHighBit(mHal.state.dimY) + 1; 680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t l2z = rsFindHighBit(mHal.state.dimZ) + 1; 690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodCount = rsMax(l2x, l2y); 710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodCount = rsMax(mHal.state.lodCount, l2z); 720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } else { 730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodCount = 1; 740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (mHal.state.lodCount != oldLODCount) { 760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (oldLODCount) { 770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines delete [] mHal.state.lodDimX; 780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines delete [] mHal.state.lodDimY; 790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines delete [] mHal.state.lodDimZ; 800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines delete [] mHal.state.lodOffset; 810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodDimX = new uint32_t[mHal.state.lodCount]; 830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodDimY = new uint32_t[mHal.state.lodCount]; 840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodDimZ = new uint32_t[mHal.state.lodCount]; 850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodOffset = new uint32_t[mHal.state.lodCount]; 860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t tx = mHal.state.dimX; 890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t ty = mHal.state.dimY; 900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t tz = mHal.state.dimZ; 910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines size_t offset = 0; 920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines for (uint32_t lod=0; lod < mHal.state.lodCount; lod++) { 930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodDimX[lod] = tx; 940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodDimY[lod] = ty; 950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodDimZ[lod] = tz; 960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodOffset[lod] = offset; 970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes(); 980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (tx > 1) tx >>= 1; 990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (ty > 1) ty >>= 1; 1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (tz > 1) tz >>= 1; 1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // At this point the offset is the size of a mipmap chain; 1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mMipChainSizeBytes = offset; 1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (mHal.state.faces) { 1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines offset *= 6; 1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mTotalSizeBytes = offset; 1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.element = mElement.get(); 1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const { 1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t offset = mHal.state.lodOffset[lod]; 1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines offset += x * mElement->getSizeBytes(); 1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return offset; 1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const { 1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t offset = mHal.state.lodOffset[lod]; 1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines offset += (x + y * mHal.state.lodDimX[lod]) * mElement->getSizeBytes(); 1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return offset; 1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const { 1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t offset = mHal.state.lodOffset[lod]; 1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines offset += (x + 1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines y * mHal.state.lodDimX[lod] + 1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines z * mHal.state.lodDimX[lod] * mHal.state.lodDimY[lod]) * mElement->getSizeBytes(); 1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return offset; 1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesuint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, 1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t x, uint32_t y) const { 1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t offset = mHal.state.lodOffset[lod]; 1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines offset += (x + y * mHal.state.lodDimX[lod]) * mElement->getSizeBytes(); 1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (face != 0) { 1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t faceOffset = getSizeBytes() / 6; 1400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines offset += faceOffset * face; 1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return offset; 1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Type::dumpLOGV(const char *prefix) const { 1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines char buf[1024]; 1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase::dumpLOGV(prefix); 1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ALOGV("%s Type: x=%u y=%u z=%u mip=%i face=%i", prefix, 1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.dimX, 1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.dimY, 1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.dimZ, 1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.lodCount, 1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.faces); 1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines snprintf(buf, sizeof(buf), "%s element: ", prefix); 1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mElement->dumpLOGV(buf); 1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Type::serialize(Context *rsc, OStream *stream) const { 1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // Need to identify ourselves 1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines stream->addU32((uint32_t)getClassId()); 1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines String8 name(getName()); 1630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines stream->addString(&name); 1640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mElement->serialize(rsc, stream); 1660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines stream->addU32(mHal.state.dimX); 1680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines stream->addU32(mHal.state.dimY); 1690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines stream->addU32(mHal.state.dimZ); 1700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines stream->addU8((uint8_t)(mHal.state.lodCount ? 1 : 0)); 1720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines stream->addU8((uint8_t)(mHal.state.faces ? 1 : 0)); 1730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesType *Type::createFromStream(Context *rsc, IStream *stream) { 1760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // First make sure we are reading the correct object 1770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 1780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (classID != RS_A3D_CLASS_ID_TYPE) { 1790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ALOGE("type loading skipped due to invalid class id\n"); 1800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return NULL; 1810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines String8 name; 1840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines stream->loadString(&name); 1850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Element *elem = Element::createFromStream(rsc, stream); 1870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (!elem) { 1880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return NULL; 1890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t x = stream->loadU32(); 1920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t y = stream->loadU32(); 1930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t z = stream->loadU32(); 1940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint8_t lod = stream->loadU8(); 1950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint8_t faces = stream->loadU8(); 1960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Type *type = Type::getType(rsc, elem, x, y, z, lod != 0, faces !=0 ); 1970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines elem->decUserRef(); 1980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return type; 1990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 2000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesbool Type::getIsNp2() const { 2020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t x = getDimX(); 2030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t y = getDimY(); 2040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t z = getDimZ(); 2050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (x && (x & (x-1))) { 2070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return true; 2080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 2090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (y && (y & (y-1))) { 2100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return true; 2110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 2120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (z && (z & (z-1))) { 2130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return true; 2140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 2150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return false; 2160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 2170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesObjectBaseRef<Type> Type::getTypeRef(Context *rsc, const Element *e, 2190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t dimX, uint32_t dimY, uint32_t dimZ, 2200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines bool dimLOD, bool dimFaces) { 2210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBaseRef<Type> returnRef; 2220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines TypeState * stc = &rsc->mStateType; 2240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase::asyncLock(); 2260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) { 2270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Type *t = stc->mTypes[ct]; 2280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (t->getElement() != e) continue; 2290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (t->getDimX() != dimX) continue; 2300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (t->getDimY() != dimY) continue; 2310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (t->getDimZ() != dimZ) continue; 2320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (t->getDimLOD() != dimLOD) continue; 2330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (t->getDimFaces() != dimFaces) continue; 2340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines returnRef.set(t); 2350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase::asyncUnlock(); 2360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return returnRef; 2370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 2380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase::asyncUnlock(); 2390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Type *nt = new Type(rsc); 2420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines nt->mDimLOD = dimLOD; 2430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines returnRef.set(nt); 2440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines nt->mElement.set(e); 2450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines nt->mHal.state.dimX = dimX; 2460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines nt->mHal.state.dimY = dimY; 2470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines nt->mHal.state.dimZ = dimZ; 2480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines nt->mHal.state.faces = dimFaces; 2490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines nt->compute(); 2500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase::asyncLock(); 2520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines stc->mTypes.push(nt); 2530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase::asyncUnlock(); 2540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return returnRef; 2560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 2570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesObjectBaseRef<Type> Type::cloneAndResize1D(Context *rsc, uint32_t dimX) const { 2590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return getTypeRef(rsc, mElement.get(), dimX, 2600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines getDimY(), getDimZ(), getDimLOD(), getDimFaces()); 2610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 2620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesObjectBaseRef<Type> Type::cloneAndResize2D(Context *rsc, 2640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t dimX, 2650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t dimY) const { 2660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return getTypeRef(rsc, mElement.get(), dimX, dimY, 2670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines getDimZ(), getDimLOD(), getDimFaces()); 2680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 2690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Type::incRefs(const void *ptr, size_t ct, size_t startOff) const { 2720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const uint8_t *p = static_cast<const uint8_t *>(ptr); 2730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const Element *e = mHal.state.element; 2740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t stride = e->getSizeBytes(); 2750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines p += stride * startOff; 2770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines while (ct > 0) { 2780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines e->incRefs(p); 2790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ct--; 2800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines p += stride; 2810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 2820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 2830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Type::decRefs(const void *ptr, size_t ct, size_t startOff) const { 2860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (!mHal.state.element->getHasReferences()) { 2870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return; 2880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 2890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const uint8_t *p = static_cast<const uint8_t *>(ptr); 2900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const Element *e = mHal.state.element; 2910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t stride = e->getSizeBytes(); 2920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 2930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines p += stride * startOff; 2940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines while (ct > 0) { 2950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines e->decRefs(p); 2960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ct--; 2970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines p += stride; 2980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 2990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 3000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 3010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 3020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines////////////////////////////////////////////////// 3030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// 3040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android { 3050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript { 3060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 3070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesRsType rsi_TypeCreate(Context *rsc, RsElement _e, uint32_t dimX, 3080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t dimY, uint32_t dimZ, bool mips, bool faces) { 3090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Element *e = static_cast<Element *>(_e); 3100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 3110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return Type::getType(rsc, e, dimX, dimY, dimZ, mips, faces); 3120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 3130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 3140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 3150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 3160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 3170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid rsaTypeGetNativeData(RsContext con, RsType type, uint32_t *typeData, uint32_t typeDataSize) { 3180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines rsAssert(typeDataSize == 6); 3190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // Pack the data in the follofing way mHal.state.dimX; mHal.state.dimY; mHal.state.dimZ; 3200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // mHal.state.lodCount; mHal.state.faces; mElement; into typeData 3210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Type *t = static_cast<Type *>(type); 3220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 3230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines (*typeData++) = t->getDimX(); 3240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines (*typeData++) = t->getDimY(); 3250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines (*typeData++) = t->getDimZ(); 3260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines (*typeData++) = t->getDimLOD() ? 1 : 0; 3270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines (*typeData++) = t->getDimFaces() ? 1 : 0; 3280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines (*typeData++) = (uint32_t)t->getElement(); 3290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines t->getElement()->incUserRef(); 3300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 331