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