rsType.cpp revision aa7d2884cb563f87294003981e03e37a1abeb961
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{ 3061f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844Jason Sams mAllocFile = __FILE__; 3161f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844Jason Sams mAllocLine = __LINE__; 32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs = 0; 33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = 0; 34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams clear(); 35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 36d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 37d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsType::~Type() 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 } 45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mLODs) { 46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams delete [] mLODs; 47d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 50d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Type::clear() 51d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 52d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mLODs) { 53d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams delete [] mLODs; 54d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs = NULL; 55d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 56d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimX = 0; 57d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimY = 0; 58d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimZ = 0; 59d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mDimLOD = 0; 60d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mFaces = false; 61d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mElement.clear(); 62d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 63d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 64d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsTypeState::TypeState() 65d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 66d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 67d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 68d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsTypeState::~TypeState() 69d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 72d19f10d43aa400e1183aa21a97099d02074131a2Jason Samssize_t Type::getOffsetForFace(uint32_t face) const 73d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 74d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams rsAssert(mFaces); 75d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return 0; 76d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 77d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 78d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Type::compute() 79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 80d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t oldLODCount = mLODCount; 81d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mDimLOD) { 82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t l2x = rsFindHighBit(mDimX) + 1; 83d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t l2y = rsFindHighBit(mDimY) + 1; 84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t l2z = rsFindHighBit(mDimZ) + 1; 85d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = rsMax(l2x, l2y); 87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = rsMax(mLODCount, l2z); 88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } else { 89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODCount = 1; 90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mLODCount != oldLODCount) { 92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams delete [] mLODs; 93d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs = new LOD[mLODCount]; 94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t tx = mDimX; 97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t ty = mDimY; 98d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t tz = mDimZ; 99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams size_t offset = 0; 100d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams for (uint32_t lod=0; lod < mLODCount; lod++) { 101d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mX = tx; 102d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mY = ty; 103d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mZ = tz; 104d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mLODs[lod].mOffset = offset; 105d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes(); 106917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams if (tx > 1) tx >>= 1; 107917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams if (ty > 1) ty >>= 1; 108917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams if (tz > 1) tz >>= 1; 109d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 110d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 111d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams // At this point the offset is the size of a mipmap chain; 112d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mMipChainSizeBytes = offset; 113d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 114d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (mFaces) { 115d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset *= 6; 116d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 117d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mTotalSizeBytes = offset; 118d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 1191bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams makeGLComponents(); 120d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 121d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 122d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const 123d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t offset = mLODs[lod].mOffset; 125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += x * mElement->getSizeBytes(); 126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return offset; 127d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 128d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 129d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const 130d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 131d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t offset = mLODs[lod].mOffset; 132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes(); 133d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return offset; 134d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 135d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 136d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const 137d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 138d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams uint32_t offset = mLODs[lod].mOffset; 139d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes(); 140d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return offset; 141d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 142d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 143d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 1441bada8cd6e4f340de93cff4a2439835fc3b1456cJason Samsvoid Type::makeGLComponents() 1451bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams{ 146a09a6e145b778861f7abee86ce17e59507ed221eJason Sams uint32_t userNum = 0; 1471bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 1480011bcf57ff711a221a3a4c73f2a79125111647dJason Sams for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) { 149718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams const Component &c = getElement()->getField(ct)->getComponent(); 1501bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 151718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams switch(c.getKind()) { 152a09a6e145b778861f7abee86ce17e59507ed221eJason Sams case RS_KIND_USER: 153a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mUser[userNum].size = c.getVectorSize(); 154a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mUser[userNum].offset = mElement->getFieldOffsetBytes(ct); 155a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mUser[userNum].type = c.getGLType(); 156a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mUser[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized(); 157a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mUser[userNum].name.setTo(getElement()->getFieldName(ct)); 158a09a6e145b778861f7abee86ce17e59507ed221eJason Sams userNum ++; 159a09a6e145b778861f7abee86ce17e59507ed221eJason Sams break; 160a09a6e145b778861f7abee86ce17e59507ed221eJason Sams 161718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams case RS_KIND_POSITION: 1621bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams rsAssert(mGL.mVtx.size == 0); 163718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mGL.mVtx.size = c.getVectorSize(); 1640011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mGL.mVtx.offset = mElement->getFieldOffsetBytes(ct); 165718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mGL.mVtx.type = c.getGLType(); 166a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mVtx.normalized = false; 167a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mVtx.name.setTo("Position"); 1681bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams break; 1691bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 170718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams case RS_KIND_COLOR: 1711bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams rsAssert(mGL.mColor.size == 0); 172718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mGL.mColor.size = c.getVectorSize(); 1730011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mGL.mColor.offset = mElement->getFieldOffsetBytes(ct); 174718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mGL.mColor.type = c.getGLType(); 175a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mColor.normalized = c.getType() != RS_TYPE_FLOAT_32; 176a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mColor.name.setTo("Color"); 1771bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams break; 1781bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 179718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams case RS_KIND_NORMAL: 1801bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams rsAssert(mGL.mNorm.size == 0); 181718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mGL.mNorm.size = c.getVectorSize(); 1820011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mGL.mNorm.offset = mElement->getFieldOffsetBytes(ct); 183718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mGL.mNorm.type = c.getGLType(); 184a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mNorm.normalized = false; 185a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mNorm.name.setTo("Normal"); 186718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams break; 1871bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 188718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams case RS_KIND_TEXTURE: 189a09a6e145b778861f7abee86ce17e59507ed221eJason Sams rsAssert(mGL.mTex.size == 0); 190a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mTex.size = c.getVectorSize(); 191a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mTex.offset = mElement->getFieldOffsetBytes(ct); 192a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mTex.type = c.getGLType(); 193a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mTex.normalized = false; 194a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mTex.name.setTo("Texture"); 195718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams break; 1961bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 1970011bcf57ff711a221a3a4c73f2a79125111647dJason Sams case RS_KIND_POINT_SIZE: 19825ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams rsAssert(!mGL.mPointSize.size); 199718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mGL.mPointSize.size = c.getVectorSize(); 2000011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mGL.mPointSize.offset = mElement->getFieldOffsetBytes(ct); 201718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mGL.mPointSize.type = c.getGLType(); 202a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mPointSize.normalized = false; 203a09a6e145b778861f7abee86ce17e59507ed221eJason Sams mGL.mPointSize.name.setTo("PointSize"); 20425ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams break; 20525ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams 2061bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams default: 2071bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams break; 2081bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams } 2091bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams } 2101bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams} 2111bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 212bb51c40d89c7dbdee7d7507fdfe0a64e8f4f87a9Jason Samsvoid Type::enableGLVertexBuffer(VertexArray *va) const 2131bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams{ 2141bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams // Note: We are only going to enable buffers and never disable them 215a09a6e145b778861f7abee86ce17e59507ed221eJason Sams // here. The reason is more than one Allocation may be used as a vertex 2161bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams // source. So we cannot disable arrays that may have been in use by 2171bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams // another allocation. 2181bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 2191bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams uint32_t stride = mElement->getSizeBytes(); 2201bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams if (mGL.mVtx.size) { 221df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams va->addLegacy(mGL.mVtx.type, 222df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams mGL.mVtx.size, 223df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams stride, 224df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams RS_KIND_POSITION, 225df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams false, 226df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams mGL.mVtx.offset); 2271bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams } 2281bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 2291bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams if (mGL.mNorm.size) { 230df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams va->addLegacy(mGL.mNorm.type, 231df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams 3, 232df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams stride, 233df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams RS_KIND_NORMAL, 234df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams false, 235df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams mGL.mNorm.offset); 2361bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams } 2371bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 2381bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams if (mGL.mColor.size) { 239df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams va->addLegacy(mGL.mColor.type, 240df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams mGL.mColor.size, 241bb51c40d89c7dbdee7d7507fdfe0a64e8f4f87a9Jason Sams stride, 242df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams RS_KIND_COLOR, 243df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams true, 244bb51c40d89c7dbdee7d7507fdfe0a64e8f4f87a9Jason Sams mGL.mColor.offset); 2451bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams } 2461bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 247a09a6e145b778861f7abee86ce17e59507ed221eJason Sams if (mGL.mTex.size) { 248df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams va->addLegacy(mGL.mTex.type, 249df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams mGL.mTex.size, 250df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams stride, 251df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams RS_KIND_TEXTURE, 252df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams false, 253df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams mGL.mTex.offset); 2541bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams } 2551bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 25625ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams if (mGL.mPointSize.size) { 257df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams va->addLegacy(mGL.mPointSize.type, 258df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams 1, 259df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams stride, 260df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams RS_KIND_POINT_SIZE, 261df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams false, 262df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams mGL.mPointSize.offset); 26325ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams } 26425ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams 2651bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams} 2661bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 267a09a6e145b778861f7abee86ce17e59507ed221eJason Samsvoid Type::enableGLVertexBuffer2(VertexArray *va) const 268a09a6e145b778861f7abee86ce17e59507ed221eJason Sams{ 269a09a6e145b778861f7abee86ce17e59507ed221eJason Sams // Do legacy buffers 270a09a6e145b778861f7abee86ce17e59507ed221eJason Sams enableGLVertexBuffer(va); 271a09a6e145b778861f7abee86ce17e59507ed221eJason Sams 272a09a6e145b778861f7abee86ce17e59507ed221eJason Sams uint32_t stride = mElement->getSizeBytes(); 273a09a6e145b778861f7abee86ce17e59507ed221eJason Sams for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) { 274a09a6e145b778861f7abee86ce17e59507ed221eJason Sams if (mGL.mUser[ct].size) { 275df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams va->addUser(mGL.mUser[ct], stride); 276a09a6e145b778861f7abee86ce17e59507ed221eJason Sams } 277a09a6e145b778861f7abee86ce17e59507ed221eJason Sams } 278a09a6e145b778861f7abee86ce17e59507ed221eJason Sams} 279a09a6e145b778861f7abee86ce17e59507ed221eJason Sams 280a09a6e145b778861f7abee86ce17e59507ed221eJason Sams 2811bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 2823c0dfbab807a459622aeade4940daddf482dec66Jason Samsvoid Type::dumpLOGV(const char *prefix) const 2833c0dfbab807a459622aeade4940daddf482dec66Jason Sams{ 2843c0dfbab807a459622aeade4940daddf482dec66Jason Sams char buf[1024]; 2853c0dfbab807a459622aeade4940daddf482dec66Jason Sams ObjectBase::dumpLOGV(prefix); 2863c0dfbab807a459622aeade4940daddf482dec66Jason Sams LOGV("%s Type: x=%i y=%i z=%i mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces); 2873c0dfbab807a459622aeade4940daddf482dec66Jason Sams sprintf(buf, "%s element: ", prefix); 2883c0dfbab807a459622aeade4940daddf482dec66Jason Sams mElement->dumpLOGV(buf); 2893c0dfbab807a459622aeade4940daddf482dec66Jason Sams} 2903c0dfbab807a459622aeade4940daddf482dec66Jason Sams 291aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchoukvoid Type::serialize(OStream *stream) const 292aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk{ 293aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk // Need to identify ourselves 294aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 295aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 296aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk String8 name(getName()); 297aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addString(&name); 298aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 299aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk mElement->serialize(stream); 300aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 301aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU32(mDimX); 302aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU32(mDimY); 303aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU32(mDimZ); 304aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 305aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU8((uint8_t)(mDimLOD ? 1 : 0)); 306aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->addU8((uint8_t)(mFaces ? 1 : 0)); 307aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk} 308aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 309aa7d2884cb563f87294003981e03e37a1abeb961Alex SakhartchoukType *Type::createFromStream(Context *rsc, IStream *stream) 310aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk{ 311aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk // First make sure we are reading the correct object 312aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk A3DClassID classID = (A3DClassID)stream->loadU32(); 313aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk if(classID != A3D_CLASS_ID_TYPE) { 314aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk LOGE("type loading skipped due to invalid class id\n"); 315aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk return NULL; 316aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk } 317aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 318aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk String8 name; 319aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk stream->loadString(&name); 320aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 321aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk Element *elem = Element::createFromStream(rsc, stream); 322aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk if(!elem) { 323aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk return NULL; 324aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk } 325aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 326aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk Type *type = new Type(rsc); 327aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk type->mDimX = stream->loadU32(); 328aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk type->mDimY = stream->loadU32(); 329aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk type->mDimZ = stream->loadU32(); 330aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 331aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk uint8_t temp = stream->loadU8(); 332aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk type->mDimLOD = temp != 0; 333aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 334aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk temp = stream->loadU8(); 335aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk type->mFaces = temp != 0; 336aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 337aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk type->setElement(elem); 338aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 339aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk return type; 340aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk} 341aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk 3422978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Samsbool Type::getIsNp2() const 3432978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams{ 3442978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams uint32_t x = getDimX(); 3452978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams uint32_t y = getDimY(); 3462978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams uint32_t z = getDimZ(); 3472978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams 3482978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams if (x && (x & (x-1))) { 3492978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams return true; 3502978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams } 3512978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams if (y && (y & (y-1))) { 3522978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams return true; 3532978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams } 3542978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams if (z && (z & (z-1))) { 3552978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams return true; 3562978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams } 3572978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams return false; 3582978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams} 3592978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams 3603c0dfbab807a459622aeade4940daddf482dec66Jason Sams 361d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams////////////////////////////////////////////////// 3621bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams// 363d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android { 364d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript { 365d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 366d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_TypeBegin(Context *rsc, RsElement vse) 367d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 368d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams TypeState * stc = &rsc->mStateType; 369d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 370d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mX = 0; 371d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mY = 0; 372d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mZ = 0; 373d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mLOD = false; 374d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mFaces = false; 375d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mElement.set(static_cast<const Element *>(vse)); 376d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 377d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 378d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value) 379d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 380d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams TypeState * stc = &rsc->mStateType; 381d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 382d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (dim < 0) { 383d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //error 384d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 385d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 386d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 387d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 388d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams switch (dim) { 389d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_DIMENSION_X: 390d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mX = value; 391d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 392d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_DIMENSION_Y: 393d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mY = value; 394d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 395d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_DIMENSION_Z: 396d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mZ = value; 397d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 398d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_DIMENSION_FACE: 399d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mFaces = (value != 0); 400d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 401d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_DIMENSION_LOD: 402d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams stc->mLOD = (value != 0); 403d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 404d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams default: 405d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 406d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 407d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 408d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 409d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0; 410d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if ((dim < 0) || (dim > RS_DIMENSION_MAX)) { 411d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams LOGE("rsTypeAdd: Bad dimension"); 412d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //error 413d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 414d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 415d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 416d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams // todo: implement array support 417d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 418d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 419d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 420d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsRsType rsi_TypeCreate(Context *rsc) 421d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 422d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams TypeState * stc = &rsc->mStateType; 423d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 424e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) { 425e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams Type *t = stc->mTypes[ct]; 426e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams if (t->getElement() != stc->mElement.get()) continue; 427e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams if (t->getDimX() != stc->mX) continue; 428e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams if (t->getDimY() != stc->mY) continue; 429e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams if (t->getDimZ() != stc->mZ) continue; 430e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams if (t->getDimLOD() != stc->mLOD) continue; 431e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams if (t->getDimFaces() != stc->mFaces) continue; 432e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams t->incUserRef(); 433e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams return t; 434e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams } 435e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams 436a9e7a05b84470257637c97d65f6562aa832c66efJason Sams Type * st = new Type(rsc); 43707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams st->incUserRef(); 438d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setDimX(stc->mX); 439d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setDimY(stc->mY); 440d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setDimZ(stc->mZ); 441d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setElement(stc->mElement.get()); 442d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setDimLOD(stc->mLOD); 443d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->setDimFaces(stc->mFaces); 444d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams st->compute(); 445a57e982785d318ddcaa4d86486d63343acefa3fbJason Sams stc->mElement.clear(); 446e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams stc->mTypes.push(st); 447d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return st; 448d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 449d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 450d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 451d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 452d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 453d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 454