rsType.cpp revision be504f2d0c5db4485e6db5b406e9e8b8c390dea9
181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent/* 281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * Copyright (C) 2009 The Android Open Source Project 381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * 481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * you may not use this file except in compliance with the License. 681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * You may obtain a copy of the License at 781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * 881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * 1081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * Unless required by applicable law or agreed to in writing, software 1181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 1281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * See the License for the specific language governing permissions and 1481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * limitations under the License. 1581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent */ 1681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 1781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include "rsContext.h" 1881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <GLES/gl.h> 1981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 2081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentusing namespace android; 2181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentusing namespace android::renderscript; 2281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 2381784c37c61b09289654b979567a42bf73cd2b12Eric LaurentType::Type(Context *rsc) : ObjectBase(rsc) 2481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 2581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mAllocFile = __FILE__; 2681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mAllocLine = __LINE__; 2781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mLODs = 0; 2881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mLODCount = 0; 2981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent clear(); 3081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 3181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 3281784c37c61b09289654b979567a42bf73cd2b12Eric LaurentType::~Type() 3381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 3481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (mLODs) { 3581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent delete [] mLODs; 3681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 3781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 3881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 3981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::clear() 4081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 4181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (mLODs) { 4281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent delete [] mLODs; 4381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mLODs = NULL; 4481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 4581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mDimX = 0; 4681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mDimY = 0; 4781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mDimZ = 0; 4881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mDimLOD = 0; 4981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mFaces = false; 5081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mElement.clear(); 5181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 5281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 5381784c37c61b09289654b979567a42bf73cd2b12Eric LaurentTypeState::TypeState() 5481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 5581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 5681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 5781784c37c61b09289654b979567a42bf73cd2b12Eric LaurentTypeState::~TypeState() 5881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 5981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 6081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 6181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentsize_t Type::getOffsetForFace(uint32_t face) const 6281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 6381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent rsAssert(mFaces); 6481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return 0; 6581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 6681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 6781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::compute() 6881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 6981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t oldLODCount = mLODCount; 7081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (mDimLOD) { 7181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t l2x = rsFindHighBit(mDimX) + 1; 7281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t l2y = rsFindHighBit(mDimY) + 1; 7381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t l2z = rsFindHighBit(mDimZ) + 1; 7481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 7581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mLODCount = rsMax(l2x, l2y); 7681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mLODCount = rsMax(mLODCount, l2z); 7781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } else { 7881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mLODCount = 1; 7981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 8081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (mLODCount != oldLODCount) { 8181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent delete [] mLODs; 8281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mLODs = new LOD[mLODCount]; 8381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 8481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 8581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t tx = mDimX; 8681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t ty = mDimY; 8781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t tz = mDimZ; 8881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent size_t offset = 0; 8981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent for (uint32_t lod=0; lod < mLODCount; lod++) { 9081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mLODs[lod].mX = tx; 9181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mLODs[lod].mY = ty; 9281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mLODs[lod].mZ = tz; 9381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mLODs[lod].mOffset = offset; 9481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes(); 9581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (tx > 1) tx >>= 1; 9681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (ty > 1) ty >>= 1; 9781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (tz > 1) tz >>= 1; 9881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 9981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 10081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent // At this point the offset is the size of a mipmap chain; 10181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mMipChainSizeBytes = offset; 10281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 10381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (mFaces) { 10481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent offset *= 6; 10581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 10681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mTotalSizeBytes = offset; 10781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 10881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent makeGLComponents(); 10981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 11081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 11181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const 11281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 11381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t offset = mLODs[lod].mOffset; 11481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent offset += x * mElement->getSizeBytes(); 11581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return offset; 11681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 11781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 11881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const 11981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 12081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t offset = mLODs[lod].mOffset; 12181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes(); 12281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return offset; 12381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 12481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 12581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const 12681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 12781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t offset = mLODs[lod].mOffset; 12881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes(); 12981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return offset; 13081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 13181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 13281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 13381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::makeGLComponents() 13481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 13581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t userNum = 0; 13681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 13781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) { 13881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent const Component &c = getElement()->getField(ct)->getComponent(); 13981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 14081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent switch(c.getKind()) { 14181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent case RS_KIND_USER: 14281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mUser[userNum].size = c.getVectorSize(); 14381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mUser[userNum].offset = mElement->getFieldOffsetBytes(ct); 14481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mUser[userNum].type = c.getGLType(); 14581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mUser[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized(); 14681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mUser[userNum].name.setTo(getElement()->getFieldName(ct)); 14781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent userNum ++; 14881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent break; 14981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 15081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent case RS_KIND_POSITION: 15181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent rsAssert(mGL.mVtx.size == 0); 15281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mVtx.size = c.getVectorSize(); 15381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mVtx.offset = mElement->getFieldOffsetBytes(ct); 15481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mVtx.type = c.getGLType(); 15581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mVtx.normalized = false; 15681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mVtx.name.setTo("Position"); 15781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent break; 15881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 15981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent case RS_KIND_COLOR: 16081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent rsAssert(mGL.mColor.size == 0); 16181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mColor.size = c.getVectorSize(); 16281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mColor.offset = mElement->getFieldOffsetBytes(ct); 16381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mColor.type = c.getGLType(); 16481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mColor.normalized = c.getType() != RS_TYPE_FLOAT_32; 16581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mColor.name.setTo("Color"); 16681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent break; 16781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 16881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent case RS_KIND_NORMAL: 16981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent rsAssert(mGL.mNorm.size == 0); 17081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mNorm.size = c.getVectorSize(); 17181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mNorm.offset = mElement->getFieldOffsetBytes(ct); 17281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mNorm.type = c.getGLType(); 17381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mNorm.normalized = false; 17481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mNorm.name.setTo("Normal"); 17581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent break; 17681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 17781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent case RS_KIND_TEXTURE: 17881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent rsAssert(mGL.mTex.size == 0); 17981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mTex.size = c.getVectorSize(); 18081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mTex.offset = mElement->getFieldOffsetBytes(ct); 18181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mTex.type = c.getGLType(); 18281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mTex.normalized = false; 18381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mTex.name.setTo("Texture"); 18481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent break; 18581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 18681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent case RS_KIND_POINT_SIZE: 18781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent rsAssert(!mGL.mPointSize.size); 18881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mPointSize.size = c.getVectorSize(); 18981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mPointSize.offset = mElement->getFieldOffsetBytes(ct); 19081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mPointSize.type = c.getGLType(); 19181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mPointSize.normalized = false; 19281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mPointSize.name.setTo("PointSize"); 19381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent break; 19481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 19581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent default: 19681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent break; 19781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 19881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 19981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 20081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 20181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::enableGLVertexBuffer(VertexArray *va) const 20281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 20381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent // Note: We are only going to enable buffers and never disable them 20481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent // here. The reason is more than one Allocation may be used as a vertex 20581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent // source. So we cannot disable arrays that may have been in use by 20681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent // another allocation. 20781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 20881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t stride = mElement->getSizeBytes(); 20981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (mGL.mVtx.size) { 21081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent va->addLegacy(mGL.mVtx.type, 21181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mVtx.size, 21281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stride, 21381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent RS_KIND_POSITION, 21481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent false, 21581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mVtx.offset); 21681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 21781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 21881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (mGL.mNorm.size) { 21981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent va->addLegacy(mGL.mNorm.type, 22081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 3, 22181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stride, 22281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent RS_KIND_NORMAL, 22381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent false, 22481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mNorm.offset); 22581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 22681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 22781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (mGL.mColor.size) { 22881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent va->addLegacy(mGL.mColor.type, 22981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mColor.size, 23081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stride, 23181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent RS_KIND_COLOR, 23281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent true, 23381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mColor.offset); 23481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 23581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 23681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (mGL.mTex.size) { 23781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent va->addLegacy(mGL.mTex.type, 23881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mTex.size, 23981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stride, 24081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent RS_KIND_TEXTURE, 24181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent false, 24281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mTex.offset); 24381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 24481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 24581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (mGL.mPointSize.size) { 24681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent va->addLegacy(mGL.mPointSize.type, 24781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 1, 24881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stride, 24981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent RS_KIND_POINT_SIZE, 25081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent false, 25181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mGL.mPointSize.offset); 25281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 25381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 25481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 25581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 25681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::enableGLVertexBuffer2(VertexArray *va) const 25781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 25881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent // Do legacy buffers 25981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent enableGLVertexBuffer(va); 26081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 26181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent uint32_t stride = mElement->getSizeBytes(); 26281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) { 26381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (mGL.mUser[ct].size) { 26481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent va->addUser(mGL.mUser[ct], stride); 26581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 26681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 26781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 26881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 26981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 27081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 27181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::dumpLOGV(const char *prefix) const 27281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 27381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent char buf[1024]; 27481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent ObjectBase::dumpLOGV(prefix); 27581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent LOGV("%s Type: x=%i y=%i z=%i mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces); 27681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent sprintf(buf, "%s element: ", prefix); 27781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent mElement->dumpLOGV(buf); 27881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 27981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 28081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 28181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent////////////////////////////////////////////////// 28281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// 28381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentnamespace android { 28481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentnamespace renderscript { 28581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 28681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid rsi_TypeBegin(Context *rsc, RsElement vse) 28781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 28881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent TypeState * stc = &rsc->mStateType; 28981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 29081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stc->mX = 0; 29181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stc->mY = 0; 29281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stc->mZ = 0; 29381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stc->mLOD = false; 29481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stc->mFaces = false; 29581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stc->mElement.set(static_cast<const Element *>(vse)); 29681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 29781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 29881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value) 29981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 30081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent TypeState * stc = &rsc->mStateType; 30181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 30281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if (dim < 0) { 30381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent //error 30481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return; 30581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 30681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 30781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 30881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent switch (dim) { 30981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent case RS_DIMENSION_X: 31081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stc->mX = value; 31181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return; 31281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent case RS_DIMENSION_Y: 31381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stc->mY = value; 31481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return; 31581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent case RS_DIMENSION_Z: 31681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stc->mZ = value; 31781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return; 3187f5d335f7b4caecd0dfb8f1085f352f1d2da5d2eGlenn Kasten case RS_DIMENSION_FACE: 3199e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten stc->mFaces = (value != 0); 32081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return; 32181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent case RS_DIMENSION_LOD: 32281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stc->mLOD = (value != 0); 32381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return; 32481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent default: 32581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent break; 32681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 32781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 32881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 32981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0; 33081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent if ((dim < 0) || (dim > RS_DIMENSION_MAX)) { 33181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent LOGE("rsTypeAdd: Bad dimension"); 33281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent //error 33381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return; 33481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent } 33581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 33681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent // todo: implement array support 33781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 33881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 33981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 34081784c37c61b09289654b979567a42bf73cd2b12Eric LaurentRsType rsi_TypeCreate(Context *rsc) 34181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{ 34281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent TypeState * stc = &rsc->mStateType; 34381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 34481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent Type * st = new Type(rsc); 34581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent st->incUserRef(); 34681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent st->setDimX(stc->mX); 34781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent st->setDimY(stc->mY); 34881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent st->setDimZ(stc->mZ); 34981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent st->setElement(stc->mElement.get()); 35081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent st->setDimLOD(stc->mLOD); 35181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent st->setDimFaces(stc->mFaces); 35281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent st->compute(); 35381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent stc->mElement.clear(); 35481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 35581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent return st; 35681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 35781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 35881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 35981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 36081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent} 36181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent 36281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent