rsType.cpp revision b38d534873ca514f5a5230596c838aa37eca1568
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
17aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST
18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsContext.h"
191bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams#include <GLES/gl.h>
20aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk#else
21aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk#include "rsContextHostStub.h"
22aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk#include <OpenGL/gl.h>
23aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk#endif
24d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
25d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android;
26d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android::renderscript;
27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
28a9e7a05b84470257637c97d65f6562aa832c66efJason SamsType::Type(Context *rsc) : ObjectBase(rsc)
29d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
30d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mLODs = 0;
31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mLODCount = 0;
326f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    mAttribs = NULL;
336f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    mAttribsSize = 0;
34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    clear();
35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
36d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
37b38d534873ca514f5a5230596c838aa37eca1568Jason Samsvoid Type::preDestroy()
38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
39e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    for (uint32_t ct = 0; ct < mRSC->mStateType.mTypes.size(); ct++) {
40e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        if (mRSC->mStateType.mTypes[ct] == this) {
41e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams            mRSC->mStateType.mTypes.removeAt(ct);
42e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams            break;
43e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        }
44e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    }
45b38d534873ca514f5a5230596c838aa37eca1568Jason Sams}
46b38d534873ca514f5a5230596c838aa37eca1568Jason Sams
47b38d534873ca514f5a5230596c838aa37eca1568Jason SamsType::~Type()
48b38d534873ca514f5a5230596c838aa37eca1568Jason Sams{
49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mLODs) {
50d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        delete [] mLODs;
516f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        mLODs = NULL;
526f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    }
536f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    if(mAttribs) {
546f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        delete [] mAttribs;
556f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        mAttribs = NULL;
56d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
57d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
58d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
59d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Type::clear()
60d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
61d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mLODs) {
62d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        delete [] mLODs;
63d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs = NULL;
64d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
65d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimX = 0;
66d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimY = 0;
67d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimZ = 0;
68d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimLOD = 0;
69d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mFaces = false;
70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mElement.clear();
71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
72d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
73d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsTypeState::TypeState()
74d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
75d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
76d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
77d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsTypeState::~TypeState()
78d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
80d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
81d19f10d43aa400e1183aa21a97099d02074131a2Jason Samssize_t Type::getOffsetForFace(uint32_t face) const
82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
83d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    rsAssert(mFaces);
84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return 0;
85d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
87d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Type::compute()
88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t oldLODCount = mLODCount;
90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mDimLOD) {
91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        uint32_t l2x = rsFindHighBit(mDimX) + 1;
92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        uint32_t l2y = rsFindHighBit(mDimY) + 1;
93d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        uint32_t l2z = rsFindHighBit(mDimZ) + 1;
94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODCount = rsMax(l2x, l2y);
96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODCount = rsMax(mLODCount, l2z);
97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    } else {
98d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODCount = 1;
99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
100d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mLODCount != oldLODCount) {
1019b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk        if(mLODs){
1029b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk            delete [] mLODs;
103dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
104d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs = new LOD[mLODCount];
105d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
106d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
107d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t tx = mDimX;
108d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t ty = mDimY;
109d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t tz = mDimZ;
110d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t offset = 0;
111d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for (uint32_t lod=0; lod < mLODCount; lod++) {
112d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mX = tx;
113d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mY = ty;
114d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mZ = tz;
115d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mOffset = offset;
116d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes();
117917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams        if (tx > 1) tx >>= 1;
118917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams        if (ty > 1) ty >>= 1;
119917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams        if (tz > 1) tz >>= 1;
120d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
121d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
122d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // At this point the offset is the size of a mipmap chain;
123d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mMipChainSizeBytes = offset;
124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mFaces) {
126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        offset *= 6;
127d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
128d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mTotalSizeBytes = offset;
129d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1301bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    makeGLComponents();
131d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
133d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const
134d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
135d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t offset = mLODs[lod].mOffset;
136d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    offset += x * mElement->getSizeBytes();
137d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return offset;
138d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
139d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
140d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const
141d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
142d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t offset = mLODs[lod].mOffset;
143d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes();
144d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return offset;
145d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
146d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
147d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const
148d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
149d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t offset = mLODs[lod].mOffset;
150d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes();
151d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return offset;
152d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
153d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
15426ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchoukbool Type::isValidGLComponent(uint32_t fieldIdx) {
15526ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    // Do not create attribs for padding
15626ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    if(mElement->getFieldName(fieldIdx)[0] == '#') {
15726ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk        return false;
15826ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    }
15926ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk
16026ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    // Only GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, GL_FLOAT are accepted.
16126ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    // Filter rs types accordingly
16226ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    RsDataType dt = mElement->getField(fieldIdx)->getComponent().getType();
16326ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    if(dt != RS_TYPE_FLOAT_32 && dt != RS_TYPE_UNSIGNED_8 &&
16426ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk       dt != RS_TYPE_UNSIGNED_16 && dt != RS_TYPE_SIGNED_8 &&
16526ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk       dt != RS_TYPE_SIGNED_16) {
16626ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk        return false;
16726ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    }
16826ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk
16926ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    // Now make sure they are not arrays
17026ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    uint32_t arraySize = mElement->getFieldArraySize(fieldIdx);
17126ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    if(arraySize != 1) {
17226ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk        return false;
17326ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    }
17426ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk
17526ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    return true;
17626ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk}
177d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1781bada8cd6e4f340de93cff4a2439835fc3b1456cJason Samsvoid Type::makeGLComponents()
1791bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams{
1806f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    // Count the number of gl attrs to initialize
1816f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    mAttribsSize = 0;
18226ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk
18326ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    for (uint32_t ct=0; ct < mElement->getFieldCount(); ct++) {
18426ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk        if(isValidGLComponent(ct)) {
1856f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk            mAttribsSize ++;
1866f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        }
1876f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    }
1886f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    if(mAttribs) {
1896f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        delete [] mAttribs;
1906f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        mAttribs = NULL;
1916f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    }
1926f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    if(mAttribsSize) {
1936f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        mAttribs = new VertexArray::Attrib[mAttribsSize];
1946f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    }
1956f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk
196a09a6e145b778861f7abee86ce17e59507ed221eJason Sams    uint32_t userNum = 0;
19726ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk    for (uint32_t ct=0; ct < mElement->getFieldCount(); ct++) {
19826ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk        const Component &c = mElement->getField(ct)->getComponent();
1991bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
20026ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk        if(!isValidGLComponent(ct)) {
2014378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk            continue;
2024378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk        }
2034378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk
2048cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        mAttribs[userNum].size = c.getVectorSize();
2058cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        mAttribs[userNum].offset = mElement->getFieldOffsetBytes(ct);
2068cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        mAttribs[userNum].type = c.getGLType();
2078cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized();
2084378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk        String8 tmp(RS_SHADER_ATTR);
20926ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk        tmp.append(mElement->getFieldName(ct));
2104378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk        mAttribs[userNum].name.setTo(tmp.string());
2114378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk
2126f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        userNum ++;
2131bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    }
2141bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams}
2151bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
2161bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
2178cb39de03aef6097a90033600d11a60ae000a6e4Jason Samsvoid Type::enableGLVertexBuffer(VertexArray *va) const
218a09a6e145b778861f7abee86ce17e59507ed221eJason Sams{
219a09a6e145b778861f7abee86ce17e59507ed221eJason Sams    uint32_t stride = mElement->getSizeBytes();
2206f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk    for (uint32_t ct=0; ct < mAttribsSize; ct++) {
2216f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        // Load up to RS_MAX_ATTRIBS inputs
2226f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        // TODO: grow vertexarray dynamically
2236f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        if(ct >= RS_MAX_ATTRIBS) {
2246f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk            LOGE("More GL attributes than we can handle");
2256f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk            break;
2266f91cb6af7a8b20e3e001f90406e27f4580a1ccdAlex Sakhartchouk        }
2278cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if (mAttribs[ct].size) {
2288cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            va->add(mAttribs[ct], stride);
229a09a6e145b778861f7abee86ce17e59507ed221eJason Sams        }
230a09a6e145b778861f7abee86ce17e59507ed221eJason Sams    }
231a09a6e145b778861f7abee86ce17e59507ed221eJason Sams}
232a09a6e145b778861f7abee86ce17e59507ed221eJason Sams
233a09a6e145b778861f7abee86ce17e59507ed221eJason Sams
2341bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
2353c0dfbab807a459622aeade4940daddf482dec66Jason Samsvoid Type::dumpLOGV(const char *prefix) const
2363c0dfbab807a459622aeade4940daddf482dec66Jason Sams{
2373c0dfbab807a459622aeade4940daddf482dec66Jason Sams    char buf[1024];
2383c0dfbab807a459622aeade4940daddf482dec66Jason Sams    ObjectBase::dumpLOGV(prefix);
2393c0dfbab807a459622aeade4940daddf482dec66Jason Sams    LOGV("%s   Type: x=%i y=%i z=%i mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces);
2403c0dfbab807a459622aeade4940daddf482dec66Jason Sams    sprintf(buf, "%s element: ", prefix);
2413c0dfbab807a459622aeade4940daddf482dec66Jason Sams    mElement->dumpLOGV(buf);
2423c0dfbab807a459622aeade4940daddf482dec66Jason Sams}
2433c0dfbab807a459622aeade4940daddf482dec66Jason Sams
244aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchoukvoid Type::serialize(OStream *stream) const
245aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk{
246aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    // Need to identify ourselves
247aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU32((uint32_t)getClassId());
248aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
249aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    String8 name(getName());
250aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addString(&name);
251aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
252aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    mElement->serialize(stream);
253aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
254aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU32(mDimX);
255aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU32(mDimY);
256aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU32(mDimZ);
257aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
258aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU8((uint8_t)(mDimLOD ? 1 : 0));
259aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU8((uint8_t)(mFaces ? 1 : 0));
260aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk}
261aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
262aa7d2884cb563f87294003981e03e37a1abeb961Alex SakhartchoukType *Type::createFromStream(Context *rsc, IStream *stream)
263aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk{
264aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    // First make sure we are reading the correct object
265aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
266aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    if(classID != RS_A3D_CLASS_ID_TYPE) {
267aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk        LOGE("type loading skipped due to invalid class id\n");
268aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk        return NULL;
269aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    }
270aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
271aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    String8 name;
272aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->loadString(&name);
273aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
274aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    Element *elem = Element::createFromStream(rsc, stream);
275aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    if(!elem) {
276aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk        return NULL;
277aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    }
278aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
279aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    Type *type = new Type(rsc);
280aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->mDimX = stream->loadU32();
281aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->mDimY = stream->loadU32();
282aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->mDimZ = stream->loadU32();
283aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
284aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    uint8_t temp = stream->loadU8();
285aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->mDimLOD = temp != 0;
286aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
287aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    temp = stream->loadU8();
288aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->mFaces = temp != 0;
289aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
290aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->setElement(elem);
291aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
292aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    return type;
293aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk}
294aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
2952978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Samsbool Type::getIsNp2() const
2962978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams{
2972978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    uint32_t x = getDimX();
2982978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    uint32_t y = getDimY();
2992978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    uint32_t z = getDimZ();
3002978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams
3012978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    if (x && (x & (x-1))) {
3022978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams        return true;
3032978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    }
3042978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    if (y && (y & (y-1))) {
3052978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams        return true;
3062978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    }
3072978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    if (z && (z & (z-1))) {
3082978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams        return true;
3092978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    }
3102978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    return false;
3112978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams}
3122978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams
313b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchoukbool Type::isEqual(const Type *other) const {
314b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk    if(other == NULL) {
315b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk        return false;
316b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk    }
317b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk    if (other->getElement()->isEqual(getElement()) &&
318b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk        other->getDimX() == mDimX &&
319b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk        other->getDimY() == mDimY &&
320b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk        other->getDimZ() == mDimZ &&
321b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk        other->getDimLOD() == mDimLOD &&
322b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk        other->getDimFaces() == mFaces) {
323b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk        return true;
324b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk    }
325b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk    return false;
326b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk}
3273c0dfbab807a459622aeade4940daddf482dec66Jason Sams
3285edc608a0749ed4b7074b5c1243043eb722c3c31Jason SamsType * Type::cloneAndResize1D(Context *rsc, uint32_t dimX) const
3295edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams{
3305edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    TypeState * stc = &rsc->mStateType;
3315edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) {
3325edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        Type *t = stc->mTypes[ct];
3335edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getElement() != mElement.get()) continue;
3345edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getDimX() != dimX) continue;
3355edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getDimY() != mDimY) continue;
3365edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getDimZ() != mDimZ) continue;
3375edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getDimLOD() != mDimLOD) continue;
3385edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getDimFaces() != mFaces) continue;
3395edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        t->incUserRef();
3405edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        return t;
3415edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    }
3425edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
3435edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    Type *nt = new Type(rsc);
3445edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mElement.set(mElement);
3455edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mDimX = dimX;
3465edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mDimY = mDimY;
3475edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mDimZ = mDimZ;
3485edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mDimLOD = mDimLOD;
3495edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mFaces = mFaces;
3505edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->compute();
3515edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    return nt;
3525edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams}
3535edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
3545edc608a0749ed4b7074b5c1243043eb722c3c31Jason SamsType * Type::cloneAndResize2D(Context *rsc, uint32_t dimX, uint32_t dimY) const
3555edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams{
3565edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    TypeState * stc = &rsc->mStateType;
3575edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) {
3585edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        Type *t = stc->mTypes[ct];
3595edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getElement() != mElement.get()) continue;
3605edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getDimX() != dimX) continue;
3615edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getDimY() != dimY) continue;
3625edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getDimZ() != mDimZ) continue;
3635edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getDimLOD() != mDimLOD) continue;
3645edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        if (t->getDimFaces() != mFaces) continue;
3655edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        t->incUserRef();
3665edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        return t;
3675edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    }
3685edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
3695edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    Type *nt = new Type(rsc);
3705edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mElement.set(mElement);
3715edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mDimX = dimX;
3725edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mDimY = dimY;
3735edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mDimZ = mDimZ;
3745edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mDimLOD = mDimLOD;
3755edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->mFaces = mFaces;
3765edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    nt->compute();
3775edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    return nt;
3785edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams}
3795edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
3805edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
381d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams//////////////////////////////////////////////////
3821bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams//
383d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android {
384d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript {
385d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3863b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Samsvoid rsi_TypeGetNativeData(Context *rsc, RsType type, uint32_t *typeData, uint32_t typeDataSize)
387d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
3883b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    rsAssert(typeDataSize == 6);
3893b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    // Pack the data in the follofing way mDimX; mDimY; mDimZ;
3903b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    // mDimLOD; mDimFaces; mElement; into typeData
3913b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    Type *t = static_cast<Type *>(type);
392d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3933b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    (*typeData++) = t->getDimX();
3943b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    (*typeData++) = t->getDimY();
3953b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    (*typeData++) = t->getDimZ();
3963b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    (*typeData++) = t->getDimLOD();
3973b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    (*typeData++) = t->getDimFaces() ? 1 : 0;
3983b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    (*typeData++) = (uint32_t)t->getElement();
399d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
4003b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams}
401d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
402d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
403d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
4043b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams}
405d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
406b38d534873ca514f5a5230596c838aa37eca1568Jason SamsRsType rsaTypeCreate(RsContext con, RsElement _e, uint32_t dimCount,
4073b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                     const RsDimension *dims, const uint32_t *vals)
408d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
4093b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    Context *rsc = static_cast<Context *>(con);
4103b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    Element *e = static_cast<Element *>(_e);
411d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    TypeState * stc = &rsc->mStateType;
412d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
4133b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    uint32_t dimX = 0;
4143b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    uint32_t dimY = 0;
4153b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    uint32_t dimZ = 0;
4163b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    uint32_t dimLOD = 0;
4173b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    uint32_t dimFaces = 0;
4183b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
4193b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    for (uint32_t ct=0; ct < dimCount; ct++) {
4203b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        switch(dims[ct]) {
4213b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        case RS_DIMENSION_X: dimX = vals[ct]; break;
4223b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        case RS_DIMENSION_Y: dimY = vals[ct]; break;
4233b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        case RS_DIMENSION_Z: dimZ = vals[ct]; break;
4243b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        case RS_DIMENSION_LOD: dimLOD = vals[ct]; break;
4253b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        case RS_DIMENSION_FACE: dimFaces = vals[ct]; break;
4263b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
4273b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        default:
4283b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams            LOGE("rsaTypeCreate: Bad dimension");
4293b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams            rsAssert(0);
4303b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        }
4313b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    }
4323b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
433b38d534873ca514f5a5230596c838aa37eca1568Jason Sams    ObjectBase::asyncLock();
434e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) {
435e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        Type *t = stc->mTypes[ct];
4363b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        if (t->getElement() != e) continue;
4373b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        if (t->getDimX() != dimX) continue;
4383b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        if (t->getDimY() != dimY) continue;
4393b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        if (t->getDimZ() != dimZ) continue;
4403b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        if (t->getDimLOD() != dimLOD) continue;
4413b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        if (t->getDimFaces() != dimFaces) continue;
442b38d534873ca514f5a5230596c838aa37eca1568Jason Sams        t->incUserRef();
443b38d534873ca514f5a5230596c838aa37eca1568Jason Sams        ObjectBase::asyncUnlock();
444e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        return t;
445e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    }
446b38d534873ca514f5a5230596c838aa37eca1568Jason Sams    ObjectBase::asyncUnlock();
447e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams
448a9e7a05b84470257637c97d65f6562aa832c66efJason Sams    Type * st = new Type(rsc);
44907ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams    st->incUserRef();
4503b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    st->setDimX(dimX);
4513b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    st->setDimY(dimY);
4523b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    st->setDimZ(dimZ);
4533b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    st->setElement(e);
4543b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    st->setDimLOD(dimLOD);
4553b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams    st->setDimFaces(dimFaces);
456d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->compute();
4573b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
458b38d534873ca514f5a5230596c838aa37eca1568Jason Sams    ObjectBase::asyncLock();
459e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    stc->mTypes.push(st);
460b38d534873ca514f5a5230596c838aa37eca1568Jason Sams    ObjectBase::asyncUnlock();
461d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return st;
462d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
463d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
464