rsType.cpp revision dc763f345db3e796efc28dc4b4d8edffda5a803e
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 17fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h" 19e5ffb879ae535a899a486285a23bea05e912480fJason Sams#include <GLES/gl.h> 20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/gl.h> 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 28e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsType::Type(Context *rsc) : ObjectBase(rsc) 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs = 0; 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = 0; 32700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk mAttribs = NULL; 33700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk mAttribsSize = 0; 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 37225afd317e101a7be5fe02c0a86361146ea89f05Jason Samsvoid Type::preDestroy() 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 398154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct = 0; ct < mRSC->mStateType.mTypes.size(); ct++) { 408154954868694e1f233d87d4933a474518b1cb81Jason Sams if (mRSC->mStateType.mTypes[ct] == this) { 418154954868694e1f233d87d4933a474518b1cb81Jason Sams mRSC->mStateType.mTypes.removeAt(ct); 428154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 438154954868694e1f233d87d4933a474518b1cb81Jason Sams } 448154954868694e1f233d87d4933a474518b1cb81Jason Sams } 45225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams} 46225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams 47225afd317e101a7be5fe02c0a86361146ea89f05Jason SamsType::~Type() 48225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams{ 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mLODs) { 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete [] mLODs; 51700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk mLODs = NULL; 52700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk } 53700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk if(mAttribs) { 54700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk delete [] mAttribs; 55700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk mAttribs = NULL; 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::clear() 60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mLODs) { 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete [] mLODs; 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs = NULL; 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimX = 0; 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimY = 0; 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimZ = 0; 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mDimLOD = 0; 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mFaces = false; 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mElement.clear(); 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 73326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::TypeState() 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 77326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::~TypeState() 78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Type::getOffsetForFace(uint32_t face) const 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mFaces); 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 0; 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 87326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::compute() 88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t oldLODCount = mLODCount; 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mDimLOD) { 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t l2x = rsFindHighBit(mDimX) + 1; 92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t l2y = rsFindHighBit(mDimY) + 1; 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t l2z = rsFindHighBit(mDimZ) + 1; 94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = rsMax(l2x, l2y); 96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = rsMax(mLODCount, l2z); 97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } else { 98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODCount = 1; 99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mLODCount != oldLODCount) { 101d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk if(mLODs){ 102d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk delete [] mLODs; 103417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk } 104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs = new LOD[mLODCount]; 105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t tx = mDimX; 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t ty = mDimY; 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t tz = mDimZ; 110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t offset = 0; 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t lod=0; lod < mLODCount; lod++) { 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mX = tx; 113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mY = ty; 114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mZ = tz; 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLODs[lod].mOffset = offset; 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes(); 1177c52898ac201043a26b3edb7526d414684cfb96bJason Sams if (tx > 1) tx >>= 1; 1187c52898ac201043a26b3edb7526d414684cfb96bJason Sams if (ty > 1) ty >>= 1; 1197c52898ac201043a26b3edb7526d414684cfb96bJason Sams if (tz > 1) tz >>= 1; 120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // At this point the offset is the size of a mipmap chain; 123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mMipChainSizeBytes = offset; 124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mFaces) { 126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset *= 6; 127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTotalSizeBytes = offset; 129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 130e5ffb879ae535a899a486285a23bea05e912480fJason Sams makeGLComponents(); 131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 133326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const 134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t offset = mLODs[lod].mOffset; 136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += x * mElement->getSizeBytes(); 137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 140326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const 141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t offset = mLODs[lod].mOffset; 143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes(); 144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 147326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const 148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t offset = mLODs[lod].mOffset; 150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes(); 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 15439f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchoukbool Type::isValidGLComponent(uint32_t fieldIdx) { 15539f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk // Do not create attribs for padding 15639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk if(mElement->getFieldName(fieldIdx)[0] == '#') { 15739f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk return false; 15839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk } 15939f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 16039f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk // Only GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, GL_FLOAT are accepted. 16139f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk // Filter rs types accordingly 16239f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk RsDataType dt = mElement->getField(fieldIdx)->getComponent().getType(); 16339f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk if(dt != RS_TYPE_FLOAT_32 && dt != RS_TYPE_UNSIGNED_8 && 16439f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk dt != RS_TYPE_UNSIGNED_16 && dt != RS_TYPE_SIGNED_8 && 16539f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk dt != RS_TYPE_SIGNED_16) { 16639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk return false; 16739f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk } 16839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 16939f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk // Now make sure they are not arrays 17039f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk uint32_t arraySize = mElement->getFieldArraySize(fieldIdx); 17139f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk if(arraySize != 1) { 17239f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk return false; 17339f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk } 17439f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 17539f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk return true; 17639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk} 177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 178e5ffb879ae535a899a486285a23bea05e912480fJason Samsvoid Type::makeGLComponents() 179e5ffb879ae535a899a486285a23bea05e912480fJason Sams{ 180700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk // Count the number of gl attrs to initialize 181700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk mAttribsSize = 0; 18239f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 18339f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk for (uint32_t ct=0; ct < mElement->getFieldCount(); ct++) { 18439f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk if(isValidGLComponent(ct)) { 185700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk mAttribsSize ++; 186700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk } 187700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk } 188700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk if(mAttribs) { 189700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk delete [] mAttribs; 190700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk mAttribs = NULL; 191700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk } 192700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk if(mAttribsSize) { 193700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk mAttribs = new VertexArray::Attrib[mAttribsSize]; 194700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk } 195700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk 196433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams uint32_t userNum = 0; 19739f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk for (uint32_t ct=0; ct < mElement->getFieldCount(); ct++) { 19839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk const Component &c = mElement->getField(ct)->getComponent(); 199e5ffb879ae535a899a486285a23bea05e912480fJason Sams 20039f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk if(!isValidGLComponent(ct)) { 201886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk continue; 202886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk } 203886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk 20479f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams mAttribs[userNum].size = c.getVectorSize(); 20579f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams mAttribs[userNum].offset = mElement->getFieldOffsetBytes(ct); 20679f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams mAttribs[userNum].type = c.getGLType(); 20779f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized(); 208886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk String8 tmp(RS_SHADER_ATTR); 20939f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk tmp.append(mElement->getFieldName(ct)); 210886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk mAttribs[userNum].name.setTo(tmp.string()); 211886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk 212700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk userNum ++; 213e5ffb879ae535a899a486285a23bea05e912480fJason Sams } 214e5ffb879ae535a899a486285a23bea05e912480fJason Sams} 215e5ffb879ae535a899a486285a23bea05e912480fJason Sams 216e5ffb879ae535a899a486285a23bea05e912480fJason Sams 21779f52df541f87ac07709e770cd79f14dd1a05e93Jason Samsvoid Type::enableGLVertexBuffer(VertexArray *va) const 218433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams{ 219433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams uint32_t stride = mElement->getSizeBytes(); 220700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk for (uint32_t ct=0; ct < mAttribsSize; ct++) { 221700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk // Load up to RS_MAX_ATTRIBS inputs 222700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk // TODO: grow vertexarray dynamically 223700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk if(ct >= RS_MAX_ATTRIBS) { 224700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk LOGE("More GL attributes than we can handle"); 225700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk break; 226700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk } 22779f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams if (mAttribs[ct].size) { 22879f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams va->add(mAttribs[ct], stride); 229433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams } 230433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams } 231433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams} 232433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams 233433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams 234e5ffb879ae535a899a486285a23bea05e912480fJason Sams 235e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Type::dumpLOGV(const char *prefix) const 236e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{ 237e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams char buf[1024]; 238e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams ObjectBase::dumpLOGV(prefix); 239e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams LOGV("%s Type: x=%i y=%i z=%i mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces); 240e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams sprintf(buf, "%s element: ", prefix); 241e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams mElement->dumpLOGV(buf); 242e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams} 243e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 244fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid Type::serialize(OStream *stream) const 245fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 246fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Need to identify ourselves 247fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32((uint32_t)getClassId()); 248fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 249fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name(getName()); 250fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&name); 251fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 252fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mElement->serialize(stream); 253fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 254fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mDimX); 255fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mDimY); 256fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mDimZ); 257fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 258fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU8((uint8_t)(mDimLOD ? 1 : 0)); 259fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU8((uint8_t)(mFaces ? 1 : 0)); 260fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 261fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 262fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukType *Type::createFromStream(Context *rsc, IStream *stream) 263fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 264fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 265b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 266b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if(classID != RS_A3D_CLASS_ID_TYPE) { 267fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("type loading skipped due to invalid class id\n"); 268fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 269fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 270fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 271fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 272fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 273fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 274fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Element *elem = Element::createFromStream(rsc, stream); 275fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(!elem) { 276fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 277fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 278fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 279f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams uint32_t x = stream->loadU32(); 280f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams uint32_t y = stream->loadU32(); 281f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams uint32_t z = stream->loadU32(); 282f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams uint8_t lod = stream->loadU8(); 283f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams uint8_t faces = stream->loadU8(); 284f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return Type::getType(rsc, elem, x, y, z, lod != 0, faces !=0 ); 285fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 286fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 287ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Samsbool Type::getIsNp2() const 288ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams{ 289ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams uint32_t x = getDimX(); 290ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams uint32_t y = getDimY(); 291ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams uint32_t z = getDimZ(); 292ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams 293ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams if (x && (x & (x-1))) { 294ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return true; 295ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams } 296ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams if (y && (y & (y-1))) { 297ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return true; 298ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams } 299ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams if (z && (z & (z-1))) { 300ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return true; 301ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams } 302ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams return false; 303ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams} 304ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams 305383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukbool Type::isEqual(const Type *other) const { 306383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(other == NULL) { 307383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return false; 308383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 309383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if (other->getElement()->isEqual(getElement()) && 310383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk other->getDimX() == mDimX && 311383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk other->getDimY() == mDimY && 312383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk other->getDimZ() == mDimZ && 313383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk other->getDimLOD() == mDimLOD && 314383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk other->getDimFaces() == mFaces) { 315383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return true; 316383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 317383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return false; 318383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk} 319e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 320f0c1df480304a72ce41e7d4b088319cbd7f0938aJason SamsType * Type::getType(Context *rsc, const Element *e, 321f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams uint32_t dimX, uint32_t dimY, uint32_t dimZ, 322f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams bool dimLOD, bool dimFaces) 32396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams{ 32496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams TypeState * stc = &rsc->mStateType; 325f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 326f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncLock(); 32796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) { 32896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Type *t = stc->mTypes[ct]; 329f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (t->getElement() != e) continue; 33096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams if (t->getDimX() != dimX) continue; 331f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (t->getDimY() != dimY) continue; 332f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (t->getDimZ() != dimZ) continue; 333f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (t->getDimLOD() != dimLOD) continue; 334f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (t->getDimFaces() != dimFaces) continue; 33596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams t->incUserRef(); 336f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncUnlock(); 33796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams return t; 33896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 339f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncUnlock(); 340f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 34196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 34296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Type *nt = new Type(rsc); 343f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams nt->mElement.set(e); 34496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams nt->mDimX = dimX; 345f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams nt->mDimY = dimY; 346f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams nt->mDimZ = dimZ; 347f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams nt->mDimLOD = dimLOD; 348f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams nt->mFaces = dimFaces; 34996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams nt->compute(); 350f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams nt->incUserRef(); 351f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 352f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncLock(); 353f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams stc->mTypes.push(nt); 354f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams ObjectBase::asyncUnlock(); 355f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 35696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams return nt; 35796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 35896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 359f0c1df480304a72ce41e7d4b088319cbd7f0938aJason SamsType * Type::cloneAndResize1D(Context *rsc, uint32_t dimX) const 36096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams{ 361f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return getType(rsc, mElement.get(), dimX, 362f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams mDimY, mDimZ, mDimLOD, mFaces); 363f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams} 36496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 365f0c1df480304a72ce41e7d4b088319cbd7f0938aJason SamsType * Type::cloneAndResize2D(Context *rsc, uint32_t dimX, uint32_t dimY) const 366f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams{ 367f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return getType(rsc, mElement.get(), dimX, dimY, 368f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams mDimZ, mDimLOD, mFaces); 36996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 37096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 37196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams////////////////////////////////////////////////// 373e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 374326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 375326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 3782353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams} 379326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 380225afd317e101a7be5fe02c0a86361146ea89f05Jason SamsRsType rsaTypeCreate(RsContext con, RsElement _e, uint32_t dimCount, 3812353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams const RsDimension *dims, const uint32_t *vals) 382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 3832353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams Context *rsc = static_cast<Context *>(con); 3842353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams Element *e = static_cast<Element *>(_e); 385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams TypeState * stc = &rsc->mStateType; 386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 3872353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams uint32_t dimX = 0; 3882353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams uint32_t dimY = 0; 3892353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams uint32_t dimZ = 0; 3902353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams uint32_t dimLOD = 0; 3912353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams uint32_t dimFaces = 0; 3922353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 3932353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams for (uint32_t ct=0; ct < dimCount; ct++) { 3942353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams switch(dims[ct]) { 3952353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams case RS_DIMENSION_X: dimX = vals[ct]; break; 3962353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams case RS_DIMENSION_Y: dimY = vals[ct]; break; 3972353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams case RS_DIMENSION_Z: dimZ = vals[ct]; break; 3982353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams case RS_DIMENSION_LOD: dimLOD = vals[ct]; break; 3992353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams case RS_DIMENSION_FACE: dimFaces = vals[ct]; break; 4002353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 4012353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams default: 4022353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams LOGE("rsaTypeCreate: Bad dimension"); 4032353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams rsAssert(0); 4042353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams } 4052353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams } 4062353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 407f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return Type::getType(rsc, e, dimX, dimY, dimZ, dimLOD, dimFaces); 408326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 409326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 410dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaTypeGetNativeData(RsContext con, RsType type, uint32_t *typeData, uint32_t typeDataSize) 411dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk{ 412dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk rsAssert(typeDataSize == 6); 413dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk // Pack the data in the follofing way mDimX; mDimY; mDimZ; 414dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk // mDimLOD; mDimFaces; mElement; into typeData 415dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk Type *t = static_cast<Type *>(type); 416dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 417dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimX(); 418dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimY(); 419dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimZ(); 420dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimLOD(); 421dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = t->getDimFaces() ? 1 : 0; 422dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk (*typeData++) = (uint32_t)t->getElement(); 423dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk t->getElement()->incUserRef(); 424dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 425