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