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