Element.cpp revision 69cccdf0659a193d6a75420ec745421fb5c436e6
1221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/* 269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams * Copyright (C) 2012 The Android Open Source Project 3221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * 4221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * you may not use this file except in compliance with the License. 6221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * You may obtain a copy of the License at 7221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * 8221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * 10221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * Unless required by applicable law or agreed to in writing, software 11221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * See the License for the specific language governing permissions and 14221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * limitations under the License. 15221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams */ 16221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 17f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams#define LOG_TAG "libRS_cpp" 18f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams 19221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <utils/Log.h> 20221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <malloc.h> 21221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <string.h> 22221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 23221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "RenderScript.h" 24221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "Element.h" 25221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2669cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace android; 2769cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace renderscriptCpp; 28221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2969cccdf0659a193d6a75420ec745421fb5c436e6Jason Samssp<const Element> Element::getSubElement(uint32_t index) { 30221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mVisibleElementMap.size()) { 31b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams mRS->throwError("Element contains no sub-elements"); 32221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 34b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams mRS->throwError("Illegal sub-element index"); 35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mElements[mVisibleElementMap[index]]; 37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 39221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsconst char * Element::getSubElementName(uint32_t index) { 40221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mVisibleElementMap.size()) { 41b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams mRS->throwError("Element contains no sub-elements"); 42221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 43221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 44b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams mRS->throwError("Illegal sub-element index"); 45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mElementNames[mVisibleElementMap[index]]; 47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samssize_t Element::getSubElementArraySize(uint32_t index) { 50221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mVisibleElementMap.size()) { 51b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams mRS->throwError("Element contains no sub-elements"); 52221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 53221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 54b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams mRS->throwError("Illegal sub-element index"); 55221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mArraySizes[mVisibleElementMap[index]]; 57221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 59221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsuint32_t Element::getSubElementOffsetBytes(uint32_t index) { 60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mVisibleElementMap.size()) { 61b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams mRS->throwError("Element contains no sub-elements"); 62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 64b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams mRS->throwError("Illegal sub-element index"); 65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mOffsetInBytes[mVisibleElementMap[index]]; 67221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 69221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 7069cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams#define CREATE_USER(N, T) sp<const Element> Element::N(RenderScript *rs) { \ 71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createUser(rs, RS_TYPE_##T); \ 72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 73221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(BOOLEAN, BOOLEAN); 74221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U8, UNSIGNED_8); 75221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I8, SIGNED_8); 76221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U16, UNSIGNED_16); 77221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I16, SIGNED_16); 78221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U32, UNSIGNED_32); 79221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I32, SIGNED_32); 80221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U64, UNSIGNED_64); 81221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I64, SIGNED_64); 82221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(F32, FLOAT_32); 83221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(F64, FLOAT_64); 84221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(ELEMENT, ELEMENT); 85221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(TYPE, TYPE); 86221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(ALLOCATION, ALLOCATION); 87221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(SAMPLER, SAMPLER); 88221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(SCRIPT, SCRIPT); 89221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MESH, MESH); 90221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_FRAGMENT, PROGRAM_FRAGMENT); 91221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_VERTEX, PROGRAM_VERTEX); 92221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_RASTER, PROGRAM_RASTER); 93221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_STORE, PROGRAM_STORE); 94221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_4X4, MATRIX_4X4); 95221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_3X3, MATRIX_3X3); 96221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_2X2, MATRIX_2X2); 97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 9869cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams#define CREATE_PIXEL(N, T, K) sp<const Element> Element::N(RenderScript *rs) { \ 99221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createPixel(rs, RS_TYPE_##T, RS_KIND_##K); \ 100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 101221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(A_8, UNSIGNED_8, PIXEL_A); 102221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGB_565, UNSIGNED_5_6_5, PIXEL_RGB); 103221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGB_888, UNSIGNED_8, PIXEL_RGB); 104221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGBA_4444, UNSIGNED_4_4_4_4, PIXEL_RGBA); 105221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGBA_8888, UNSIGNED_8, PIXEL_RGBA); 106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 10769cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams#define CREATE_VECTOR(N, T) sp<const Element> Element::N##_2(RenderScript *rs) { \ 108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createVector(rs, RS_TYPE_##T, 2); \ 109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} \ 11069cccdf0659a193d6a75420ec745421fb5c436e6Jason Samssp<const Element> Element::N##_3(RenderScript *rs) { \ 111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createVector(rs, RS_TYPE_##T, 3); \ 112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} \ 11369cccdf0659a193d6a75420ec745421fb5c436e6Jason Samssp<const Element> Element::N##_4(RenderScript *rs) { \ 114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createVector(rs, RS_TYPE_##T, 4); \ 115221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 116221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U8, UNSIGNED_8); 117221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I8, SIGNED_8); 118221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U16, UNSIGNED_16); 119221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I16, SIGNED_16); 120221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U32, UNSIGNED_32); 121221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I32, SIGNED_32); 122221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U64, UNSIGNED_64); 123221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I64, SIGNED_64); 124221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(F32, FLOAT_32); 125221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(F64, FLOAT_64); 126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 127221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Element::updateVisibleSubElements() { 129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mElements.size()) { 130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVisibleElementMap.clear(); 133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int noPaddingFieldCount = 0; 135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t fieldCount = mElementNames.size(); 136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Find out how many elements are not padding 137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct ++) { 138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mElementNames[ct].string()[0] != '#') { 139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams noPaddingFieldCount ++; 140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 143221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Make a map that points us at non-padding elements 144221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct ++) { 145221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mElementNames[ct].string()[0] != '#') { 146221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVisibleElementMap.push((uint32_t)ct); 147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 149221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 151221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsElement::Element(void *id, RenderScript *rs, 15269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams android::Vector<sp</*const*/ Element> > &elements, 153221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams android::Vector<android::String8> &elementNames, 154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams android::Vector<uint32_t> &arraySizes) : BaseObj(id, rs) { 155221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = 0; 156221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVectorSize = 1; 157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElements = elements; 158221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mArraySizes = arraySizes; 159221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElementNames = elementNames; 160221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = RS_TYPE_NONE; 162221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mKind = RS_KIND_USER; 163221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < mElements.size(); ct++ ) { 165221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mOffsetInBytes.push(mSizeBytes); 166221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes += mElements[ct]->mSizeBytes * mArraySizes[ct]; 167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 168221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateVisibleSubElements(); 169221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 170221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 171221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsstatic uint32_t GetSizeInBytesForType(RsDataType dt) { 173221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams switch(dt) { 174221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_NONE: 175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 0; 176221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_8: 177221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_8: 178221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_BOOLEAN: 179221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 1; 180221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 181221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_16: 182221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_16: 183221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_16: 184221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_5_6_5: 185221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_5_5_5_1: 186221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_4_4_4_4: 187221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 2; 188221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 189221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_32: 190221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_32: 191221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_32: 192221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4; 193221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 194221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_64: 195221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_64: 196221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_64: 197221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 8; 198221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 199221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_4X4: 200221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 16 * 4; 201221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_3X3: 202221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 9 * 4; 203221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_2X2: 204221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4 * 4; 205221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 206221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_TYPE: 207221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_ALLOCATION: 208221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SAMPLER: 209221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SCRIPT: 210221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MESH: 211221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_FRAGMENT: 212221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_VERTEX: 213221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_RASTER: 214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_STORE: 215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4; 216221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 217221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams default: 218221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 219221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 220221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 221221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Missing type %i", dt); 222221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 0; 223221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 224221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 225221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsElement::Element(void *id, RenderScript *rs, 226221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt, RsDataKind dk, bool norm, uint32_t size) : 227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams BaseObj(id, rs) 228221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams{ 229221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t tsize = GetSizeInBytesForType(dt); 230221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt != RS_TYPE_UNSIGNED_5_6_5) && 231221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt != RS_TYPE_UNSIGNED_4_4_4_4) && 232221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt != RS_TYPE_UNSIGNED_5_5_5_1)) { 233221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (size == 3) { 234221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize * 4; 235221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 236221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize * size; 237221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 238221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 239221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize; 240221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 241221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = dt; 242221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mKind = dk; 243221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mNormalized = norm; 244221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVectorSize = size; 245221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 246221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 247221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsElement::~Element() { 248221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 249221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 250221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams /* 251221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams Element(int id, RenderScript rs) { 252221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams super(id, rs); 253221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 254221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams */ 255221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 256221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Element::updateFromNative() { 257221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams BaseObj::updateFromNative(); 258221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/* 259221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements 260221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int[] dataBuffer = new int[5]; 261221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS.nElementGetNativeData(getID(), dataBuffer); 262221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 263221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mNormalized = dataBuffer[2] == 1 ? true : false; 264221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVectorSize = dataBuffer[3]; 265221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSize = 0; 266221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (DataType dt: DataType.values()) { 267221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(dt.mID == dataBuffer[0]){ 268221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = dt; 269221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSize = mType.mSize * mVectorSize; 270221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 271221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 272221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (DataKind dk: DataKind.values()) { 273221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(dk.mID == dataBuffer[1]){ 274221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mKind = dk; 275221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 276221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 277221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 278221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int numSubElements = dataBuffer[4]; 279221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(numSubElements > 0) { 280221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElements = new Element[numSubElements]; 281221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElementNames = new String[numSubElements]; 282221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mArraySizes = new int[numSubElements]; 283221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mOffsetInBytes = new int[numSubElements]; 284221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 285221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int[] subElementIds = new int[numSubElements]; 286221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS.nElementGetSubElements(getID(), subElementIds, mElementNames, mArraySizes); 287221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for(int i = 0; i < numSubElements; i ++) { 288221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElements[i] = new Element(subElementIds[i], mRS); 289221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElements[i].updateFromNative(); 290221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mOffsetInBytes[i] = mSize; 291221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSize += mElements[i].mSize * mArraySizes[i]; 292221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 293221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 294221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams */ 295221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateVisibleSubElements(); 296221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 297221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 29869cccdf0659a193d6a75420ec745421fb5c436e6Jason Samssp<const Element> Element::createUser(RenderScript *rs, RsDataType dt) { 299221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams void * id = rsElementCreate(rs->mContext, dt, RS_KIND_USER, false, 1); 300221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, RS_KIND_USER, false, 1); 301221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 302221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 30369cccdf0659a193d6a75420ec745421fb5c436e6Jason Samssp<const Element> Element::createVector(RenderScript *rs, RsDataType dt, uint32_t size) { 304221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (size < 2 || size > 4) { 305b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams rs->throwError("Vector size out of range 2-4."); 306221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 307221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams void *id = rsElementCreate(rs->mContext, dt, RS_KIND_USER, false, size); 308221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, RS_KIND_USER, false, size); 309221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 310221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 31169cccdf0659a193d6a75420ec745421fb5c436e6Jason Samssp<const Element> Element::createPixel(RenderScript *rs, RsDataType dt, RsDataKind dk) { 312221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!(dk == RS_KIND_PIXEL_L || 313221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_A || 314221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_LA || 315221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_RGB || 316221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_RGBA || 317221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_DEPTH)) { 318b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams rs->throwError("Unsupported DataKind"); 319221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 320221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!(dt == RS_TYPE_UNSIGNED_8 || 321221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_16 || 322221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_5_6_5 || 323221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_4_4_4_4 || 324221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_5_5_5_1)) { 325b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams rs->throwError("Unsupported DataType"); 326221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 327221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_5_6_5 && dk != RS_KIND_PIXEL_RGB) { 328b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams rs->throwError("Bad kind and type combo"); 329221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 330221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_5_5_5_1 && dk != RS_KIND_PIXEL_RGBA) { 331b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams rs->throwError("Bad kind and type combo"); 332221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 333221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_4_4_4_4 && dk != RS_KIND_PIXEL_RGBA) { 334b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams rs->throwError("Bad kind and type combo"); 335221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 336221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_16 && dk != RS_KIND_PIXEL_DEPTH) { 337b2e3dc51dcbbe52b5e72d9c6a16de7000de70edfJason Sams rs->throwError("Bad kind and type combo"); 338221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 339221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 340221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int size = 1; 341221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams switch (dk) { 342221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_LA: 343221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 2; 344221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 345221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_RGB: 346221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 3; 347221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 348221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_RGBA: 349221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 4; 350221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 351221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_DEPTH: 352221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 2; 353221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 354221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams default: 355221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 356221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 357221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 358221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams void * id = rsElementCreate(rs->mContext, dt, dk, true, size); 359221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, dk, true, size); 360221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 361221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 36269cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsbool Element::isCompatible(sp<const Element>e) { 363221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Try strict BaseObj equality to start with. 36469cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams if (this == e.get()) { 365221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return true; 366221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 367221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 368221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Ignore mKind because it is allowed to be different (user vs. pixel). 369221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // We also ignore mNormalized because it can be different. The mType 370221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // field must be non-null since we require name equivalence for 371221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // user-created Elements. 372221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return ((mSizeBytes == e->mSizeBytes) && 37369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams (mType != RS_TYPE_NONE) && 374221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (mType == e->mType) && 375221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (mVectorSize == e->mVectorSize)); 376221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 377221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 378221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsElement::Builder::Builder(RenderScript *rs) { 379221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS = rs; 380221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 381221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 382221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 38369cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsvoid Element::Builder::add(sp</*const*/ Element>e, android::String8 &name, uint32_t arraySize) { 384221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Skip padding fields after a vector 3 type. 385221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mSkipPadding) { 386221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams const char *s1 = "#padding_"; 387221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams const char *s2 = name; 388221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t len = strlen(s1); 389221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (strlen(s2) >= len) { 390221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!memcmp(s1, s2, len)) { 391221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 392221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 393221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 394221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 395221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 396221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 397221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (e->mVectorSize == 3) { 398221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = true; 399221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 400221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 401221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 402221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 403221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElements.add(e); 404221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElementNames.add(name); 405221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mArraySizes.add(arraySize); 406221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 407221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 40869cccdf0659a193d6a75420ec745421fb5c436e6Jason Samssp<const Element> Element::Builder::create() { 409221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t fieldCount = mElements.size(); 410221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams const char ** nameArray = (const char **)calloc(fieldCount, sizeof(char *)); 41169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams const Element ** elementArray = (const Element **)calloc(fieldCount, sizeof(Element *)); 412221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t* sizeArray = (size_t*)calloc(fieldCount, sizeof(size_t)); 413221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 414221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct++) { 415221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams nameArray[ct] = mElementNames[ct].string(); 41669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams elementArray[ct] = mElements[ct].get(); 417221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams sizeArray[ct] = mElementNames[ct].length(); 418221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 419221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 420221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams void *id = rsElementCreate2(mRS->mContext, 42169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams (RsElement *)elementArray, fieldCount, 422221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams nameArray, fieldCount * sizeof(size_t), sizeArray, 423221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (const uint32_t *)mArraySizes.array(), fieldCount); 424221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 425221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 426221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams free(nameArray); 427221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams free(sizeArray); 42869cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams free(elementArray); 42969cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams return new Element(id, mRS, mElements, mElementNames, mArraySizes); 430221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 431221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 432