rsType.cpp revision ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h" 18e5ffb879ae535a899a486285a23bea05e912480fJason Sams#include <GLES/gl.h> 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 23e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsType::Type(Context *rsc) : ObjectBase(rsc) 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 25f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocFile = __FILE__; 26f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocLine = __LINE__; 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs = 0; 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = 0; 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 32326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsType::~Type() 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 348154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct = 0; ct < mRSC->mStateType.mTypes.size(); ct++) { 358154954868694e1f233d87d4933a474518b1cb81Jason Sams if (mRSC->mStateType.mTypes[ct] == this) { 368154954868694e1f233d87d4933a474518b1cb81Jason Sams mRSC->mStateType.mTypes.removeAt(ct); 378154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 388154954868694e1f233d87d4933a474518b1cb81Jason Sams } 398154954868694e1f233d87d4933a474518b1cb81Jason Sams } 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mLODs) { 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete [] mLODs; 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::clear() 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mLODs) { 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete [] mLODs; 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs = NULL; 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimX = 0; 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimY = 0; 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimZ = 0; 54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimLOD = 0; 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mFaces = false; 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mElement.clear(); 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 59326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::TypeState() 60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 63326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::~TypeState() 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Type::getOffsetForFace(uint32_t face) const 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mFaces); 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 0; 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::compute() 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t oldLODCount = mLODCount; 76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mDimLOD) { 77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t l2x = rsFindHighBit(mDimX) + 1; 78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t l2y = rsFindHighBit(mDimY) + 1; 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t l2z = rsFindHighBit(mDimZ) + 1; 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = rsMax(l2x, l2y); 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = rsMax(mLODCount, l2z); 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } else { 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = 1; 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mLODCount != oldLODCount) { 87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete [] mLODs; 88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs = new LOD[mLODCount]; 89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t tx = mDimX; 92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t ty = mDimY; 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t tz = mDimZ; 94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t offset = 0; 95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t lod=0; lod < mLODCount; lod++) { 96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mX = tx; 97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mY = ty; 98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mZ = tz; 99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mOffset = offset; 100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes(); 1017c52898ac201043a26b3edb7526d414684cfb96bJason Sams if (tx > 1) tx >>= 1; 1027c52898ac201043a26b3edb7526d414684cfb96bJason Sams if (ty > 1) ty >>= 1; 1037c52898ac201043a26b3edb7526d414684cfb96bJason Sams if (tz > 1) tz >>= 1; 104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // At this point the offset is the size of a mipmap chain; 107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mMipChainSizeBytes = offset; 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mFaces) { 110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset *= 6; 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTotalSizeBytes = offset; 113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 114e5ffb879ae535a899a486285a23bea05e912480fJason Sams makeGLComponents(); 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 117326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const 118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t offset = mLODs[lod].mOffset; 120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += x * mElement->getSizeBytes(); 121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 124326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const 125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t offset = mLODs[lod].mOffset; 127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes(); 128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 131326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const 132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t offset = mLODs[lod].mOffset; 134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes(); 135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 139e5ffb879ae535a899a486285a23bea05e912480fJason Samsvoid Type::makeGLComponents() 140e5ffb879ae535a899a486285a23bea05e912480fJason Sams{ 141433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams uint32_t userNum = 0; 142e5ffb879ae535a899a486285a23bea05e912480fJason Sams 1434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) { 144d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const Component &c = getElement()->getField(ct)->getComponent(); 145e5ffb879ae535a899a486285a23bea05e912480fJason Sams 146d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams switch(c.getKind()) { 147433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams case RS_KIND_USER: 148433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mUser[userNum].size = c.getVectorSize(); 149433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mUser[userNum].offset = mElement->getFieldOffsetBytes(ct); 150433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mUser[userNum].type = c.getGLType(); 151433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mUser[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized(); 152433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mUser[userNum].name.setTo(getElement()->getFieldName(ct)); 153433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams userNum ++; 154433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams break; 155433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams 156d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams case RS_KIND_POSITION: 157e5ffb879ae535a899a486285a23bea05e912480fJason Sams rsAssert(mGL.mVtx.size == 0); 158d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams mGL.mVtx.size = c.getVectorSize(); 1594815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mGL.mVtx.offset = mElement->getFieldOffsetBytes(ct); 160d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams mGL.mVtx.type = c.getGLType(); 161433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mVtx.normalized = false; 162433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mVtx.name.setTo("Position"); 163e5ffb879ae535a899a486285a23bea05e912480fJason Sams break; 164e5ffb879ae535a899a486285a23bea05e912480fJason Sams 165d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams case RS_KIND_COLOR: 166e5ffb879ae535a899a486285a23bea05e912480fJason Sams rsAssert(mGL.mColor.size == 0); 167d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams mGL.mColor.size = c.getVectorSize(); 1684815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mGL.mColor.offset = mElement->getFieldOffsetBytes(ct); 169d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams mGL.mColor.type = c.getGLType(); 170433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mColor.normalized = c.getType() != RS_TYPE_FLOAT_32; 171433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mColor.name.setTo("Color"); 172e5ffb879ae535a899a486285a23bea05e912480fJason Sams break; 173e5ffb879ae535a899a486285a23bea05e912480fJason Sams 174d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams case RS_KIND_NORMAL: 175e5ffb879ae535a899a486285a23bea05e912480fJason Sams rsAssert(mGL.mNorm.size == 0); 176d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams mGL.mNorm.size = c.getVectorSize(); 1774815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mGL.mNorm.offset = mElement->getFieldOffsetBytes(ct); 178d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams mGL.mNorm.type = c.getGLType(); 179433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mNorm.normalized = false; 180433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mNorm.name.setTo("Normal"); 181d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams break; 182e5ffb879ae535a899a486285a23bea05e912480fJason Sams 183d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams case RS_KIND_TEXTURE: 184433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams rsAssert(mGL.mTex.size == 0); 185433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mTex.size = c.getVectorSize(); 186433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mTex.offset = mElement->getFieldOffsetBytes(ct); 187433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mTex.type = c.getGLType(); 188433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mTex.normalized = false; 189433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mTex.name.setTo("Texture"); 190d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams break; 191e5ffb879ae535a899a486285a23bea05e912480fJason Sams 1924815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams case RS_KIND_POINT_SIZE: 193e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams rsAssert(!mGL.mPointSize.size); 194d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams mGL.mPointSize.size = c.getVectorSize(); 1954815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mGL.mPointSize.offset = mElement->getFieldOffsetBytes(ct); 196d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams mGL.mPointSize.type = c.getGLType(); 197433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mPointSize.normalized = false; 198433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mGL.mPointSize.name.setTo("PointSize"); 199e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams break; 200e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams 201e5ffb879ae535a899a486285a23bea05e912480fJason Sams default: 202e5ffb879ae535a899a486285a23bea05e912480fJason Sams break; 203e5ffb879ae535a899a486285a23bea05e912480fJason Sams } 204e5ffb879ae535a899a486285a23bea05e912480fJason Sams } 205e5ffb879ae535a899a486285a23bea05e912480fJason Sams} 206e5ffb879ae535a899a486285a23bea05e912480fJason Sams 207c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid Type::enableGLVertexBuffer(VertexArray *va) const 208e5ffb879ae535a899a486285a23bea05e912480fJason Sams{ 209e5ffb879ae535a899a486285a23bea05e912480fJason Sams // Note: We are only going to enable buffers and never disable them 210433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams // here. The reason is more than one Allocation may be used as a vertex 211e5ffb879ae535a899a486285a23bea05e912480fJason Sams // source. So we cannot disable arrays that may have been in use by 212e5ffb879ae535a899a486285a23bea05e912480fJason Sams // another allocation. 213e5ffb879ae535a899a486285a23bea05e912480fJason Sams 214e5ffb879ae535a899a486285a23bea05e912480fJason Sams uint32_t stride = mElement->getSizeBytes(); 215e5ffb879ae535a899a486285a23bea05e912480fJason Sams if (mGL.mVtx.size) { 216be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams va->addLegacy(mGL.mVtx.type, 217be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mGL.mVtx.size, 218be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams stride, 219be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams RS_KIND_POSITION, 220be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams false, 221be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mGL.mVtx.offset); 222e5ffb879ae535a899a486285a23bea05e912480fJason Sams } 223e5ffb879ae535a899a486285a23bea05e912480fJason Sams 224e5ffb879ae535a899a486285a23bea05e912480fJason Sams if (mGL.mNorm.size) { 225be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams va->addLegacy(mGL.mNorm.type, 226be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams 3, 227be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams stride, 228be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams RS_KIND_NORMAL, 229be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams false, 230be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mGL.mNorm.offset); 231e5ffb879ae535a899a486285a23bea05e912480fJason Sams } 232e5ffb879ae535a899a486285a23bea05e912480fJason Sams 233e5ffb879ae535a899a486285a23bea05e912480fJason Sams if (mGL.mColor.size) { 234be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams va->addLegacy(mGL.mColor.type, 235be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mGL.mColor.size, 236c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams stride, 237be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams RS_KIND_COLOR, 238be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams true, 239c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mGL.mColor.offset); 240e5ffb879ae535a899a486285a23bea05e912480fJason Sams } 241e5ffb879ae535a899a486285a23bea05e912480fJason Sams 242433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams if (mGL.mTex.size) { 243be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams va->addLegacy(mGL.mTex.type, 244be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mGL.mTex.size, 245be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams stride, 246be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams RS_KIND_TEXTURE, 247be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams false, 248be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mGL.mTex.offset); 249e5ffb879ae535a899a486285a23bea05e912480fJason Sams } 250e5ffb879ae535a899a486285a23bea05e912480fJason Sams 251e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams if (mGL.mPointSize.size) { 252be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams va->addLegacy(mGL.mPointSize.type, 253be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams 1, 254be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams stride, 255be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams RS_KIND_POINT_SIZE, 256be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams false, 257be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mGL.mPointSize.offset); 258e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams } 259e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams 260e5ffb879ae535a899a486285a23bea05e912480fJason Sams} 261e5ffb879ae535a899a486285a23bea05e912480fJason Sams 262433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Samsvoid Type::enableGLVertexBuffer2(VertexArray *va) const 263433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams{ 264433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams // Do legacy buffers 265433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams enableGLVertexBuffer(va); 266433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams 267433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams uint32_t stride = mElement->getSizeBytes(); 268433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) { 269433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams if (mGL.mUser[ct].size) { 270be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams va->addUser(mGL.mUser[ct], stride); 271433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams } 272433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams } 273433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams} 274433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams 275433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams 276e5ffb879ae535a899a486285a23bea05e912480fJason Sams 277e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Type::dumpLOGV(const char *prefix) const 278e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{ 279e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams char buf[1024]; 280e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams ObjectBase::dumpLOGV(prefix); 281e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams LOGV("%s Type: x=%i y=%i z=%i mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces); 282e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams sprintf(buf, "%s element: ", prefix); 283e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams mElement->dumpLOGV(buf); 284e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams} 285e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 286ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Samsbool Type::getIsNp2() const 287ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams{ 288ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams uint32_t x = getDimX(); 289ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams uint32_t y = getDimY(); 290ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams uint32_t z = getDimZ(); 291ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams 292ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams if (x && (x & (x-1))) { 293ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return true; 294ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams } 295ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams if (y && (y & (y-1))) { 296ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return true; 297ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams } 298ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams if (z && (z & (z-1))) { 299ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return true; 300ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams } 301ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return false; 302ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams} 303ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams 304e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams////////////////////////////////////////////////// 306e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 307326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 308326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 309326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 310326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeBegin(Context *rsc, RsElement vse) 311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams TypeState * stc = &rsc->mStateType; 313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mX = 0; 315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mY = 0; 316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mZ = 0; 317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mLOD = false; 318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mFaces = false; 319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mElement.set(static_cast<const Element *>(vse)); 320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 321326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 322326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value) 323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 324326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams TypeState * stc = &rsc->mStateType; 325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (dim < 0) { 327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //error 328326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 329326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 331326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 332326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams switch (dim) { 333326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_X: 334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mX = value; 335326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Y: 337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mY = value; 338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Z: 340326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mZ = value; 341326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 342326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_FACE: 343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mFaces = (value != 0); 344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_LOD: 346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams stc->mLOD = (value != 0); 347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams default: 349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 353326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0; 354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if ((dim < 0) || (dim > RS_DIMENSION_MAX)) { 355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("rsTypeAdd: Bad dimension"); 356326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //error 357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // todo: implement array support 361326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 363326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 364326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsType rsi_TypeCreate(Context *rsc) 365326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams TypeState * stc = &rsc->mStateType; 367326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 3688154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) { 3698154954868694e1f233d87d4933a474518b1cb81Jason Sams Type *t = stc->mTypes[ct]; 3708154954868694e1f233d87d4933a474518b1cb81Jason Sams if (t->getElement() != stc->mElement.get()) continue; 3718154954868694e1f233d87d4933a474518b1cb81Jason Sams if (t->getDimX() != stc->mX) continue; 3728154954868694e1f233d87d4933a474518b1cb81Jason Sams if (t->getDimY() != stc->mY) continue; 3738154954868694e1f233d87d4933a474518b1cb81Jason Sams if (t->getDimZ() != stc->mZ) continue; 3748154954868694e1f233d87d4933a474518b1cb81Jason Sams if (t->getDimLOD() != stc->mLOD) continue; 3758154954868694e1f233d87d4933a474518b1cb81Jason Sams if (t->getDimFaces() != stc->mFaces) continue; 3768154954868694e1f233d87d4933a474518b1cb81Jason Sams t->incUserRef(); 3778154954868694e1f233d87d4933a474518b1cb81Jason Sams return t; 3788154954868694e1f233d87d4933a474518b1cb81Jason Sams } 3798154954868694e1f233d87d4933a474518b1cb81Jason Sams 380e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams Type * st = new Type(rsc); 3819397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams st->incUserRef(); 382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setDimX(stc->mX); 383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setDimY(stc->mY); 384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setDimZ(stc->mZ); 385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setElement(stc->mElement.get()); 386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setDimLOD(stc->mLOD); 387326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->setDimFaces(stc->mFaces); 388326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams st->compute(); 3898312801ccbed0c86cb2592f7ca2fd1cb9847ab8dJason Sams stc->mElement.clear(); 3908154954868694e1f233d87d4933a474518b1cb81Jason Sams stc->mTypes.push(st); 391326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return st; 392326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 393326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 394326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 395326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 396326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 397326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 398