Element.cpp revision 221a4b17cda03916a0599628fcbb5f48605a0e5a
1221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/* 2221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * Copyright (C) 2008-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 17221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <utils/Log.h> 18221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <malloc.h> 19221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <string.h> 20221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 21221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "RenderScript.h" 22221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "Element.h" 23221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 24221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 25221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsconst Element * Element::getSubElement(uint32_t index) { 26221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mVisibleElementMap.size()) { 27221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Element contains no sub-elements"); 28221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return NULL; 29221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 30221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 31221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Illegal sub-element index"); 32221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mElements[mVisibleElementMap[index]]; 34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsconst char * Element::getSubElementName(uint32_t index) { 37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mVisibleElementMap.size()) { 38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Element contains no sub-elements"); 39221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 40221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 41221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Illegal sub-element index"); 42221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 43221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mElementNames[mVisibleElementMap[index]]; 44221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samssize_t Element::getSubElementArraySize(uint32_t index) { 47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mVisibleElementMap.size()) { 48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Element contains no sub-elements"); 49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 50221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 51221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Illegal sub-element index"); 52221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 53221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mArraySizes[mVisibleElementMap[index]]; 54221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 55221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsuint32_t Element::getSubElementOffsetBytes(uint32_t index) { 57221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mVisibleElementMap.size()) { 58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Element contains no sub-elements"); 59221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Illegal sub-element index"); 62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mOffsetInBytes[mVisibleElementMap[index]]; 64221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 67221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#define CREATE_USER(N, T) const Element * Element::N(RenderScript *rs) { \ 68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createUser(rs, RS_TYPE_##T); \ 69221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 70221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(BOOLEAN, BOOLEAN); 71221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U8, UNSIGNED_8); 72221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I8, SIGNED_8); 73221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U16, UNSIGNED_16); 74221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I16, SIGNED_16); 75221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U32, UNSIGNED_32); 76221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I32, SIGNED_32); 77221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U64, UNSIGNED_64); 78221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I64, SIGNED_64); 79221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(F32, FLOAT_32); 80221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(F64, FLOAT_64); 81221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(ELEMENT, ELEMENT); 82221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(TYPE, TYPE); 83221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(ALLOCATION, ALLOCATION); 84221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(SAMPLER, SAMPLER); 85221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(SCRIPT, SCRIPT); 86221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MESH, MESH); 87221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_FRAGMENT, PROGRAM_FRAGMENT); 88221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_VERTEX, PROGRAM_VERTEX); 89221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_RASTER, PROGRAM_RASTER); 90221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_STORE, PROGRAM_STORE); 91221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_4X4, MATRIX_4X4); 92221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_3X3, MATRIX_3X3); 93221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_2X2, MATRIX_2X2); 94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#define CREATE_PIXEL(N, T, K) const Element * Element::N(RenderScript *rs) { \ 96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createPixel(rs, RS_TYPE_##T, RS_KIND_##K); \ 97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 98221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(A_8, UNSIGNED_8, PIXEL_A); 99221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGB_565, UNSIGNED_5_6_5, PIXEL_RGB); 100221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGB_888, UNSIGNED_8, PIXEL_RGB); 101221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGBA_4444, UNSIGNED_4_4_4_4, PIXEL_RGBA); 102221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGBA_8888, UNSIGNED_8, PIXEL_RGBA); 103221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 104221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#define CREATE_VECTOR(N, T) const Element * Element::N##_2(RenderScript *rs) { \ 105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createVector(rs, RS_TYPE_##T, 2); \ 106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} \ 107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsconst Element * Element::N##_3(RenderScript *rs) { \ 108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createVector(rs, RS_TYPE_##T, 3); \ 109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} \ 110221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsconst Element * Element::N##_4(RenderScript *rs) { \ 111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createVector(rs, RS_TYPE_##T, 4); \ 112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 113221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U8, UNSIGNED_8); 114221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I8, SIGNED_8); 115221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U16, UNSIGNED_16); 116221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I16, SIGNED_16); 117221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U32, UNSIGNED_32); 118221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I32, SIGNED_32); 119221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U64, UNSIGNED_64); 120221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I64, SIGNED_64); 121221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(F32, FLOAT_32); 122221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(F64, FLOAT_64); 123221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 124221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Element::updateVisibleSubElements() { 126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mElements.size()) { 127221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVisibleElementMap.clear(); 130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int noPaddingFieldCount = 0; 132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t fieldCount = mElementNames.size(); 133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Find out how many elements are not padding 134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct ++) { 135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mElementNames[ct].string()[0] != '#') { 136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams noPaddingFieldCount ++; 137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Make a map that points us at non-padding elements 141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct ++) { 142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mElementNames[ct].string()[0] != '#') { 143221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVisibleElementMap.push((uint32_t)ct); 144221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 145221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 146221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 148221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsElement::Element(void *id, RenderScript *rs, 149221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams android::Vector<const Element *> &elements, 150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams android::Vector<android::String8> &elementNames, 151221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams android::Vector<uint32_t> &arraySizes) : BaseObj(id, rs) { 152221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = 0; 153221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVectorSize = 1; 154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElements = elements; 155221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mArraySizes = arraySizes; 156221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElementNames = elementNames; 157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 158221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = RS_TYPE_NONE; 159221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mKind = RS_KIND_USER; 160221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < mElements.size(); ct++ ) { 162221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mOffsetInBytes.push(mSizeBytes); 163221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes += mElements[ct]->mSizeBytes * mArraySizes[ct]; 164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 165221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateVisibleSubElements(); 166221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 168221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 169221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsstatic uint32_t GetSizeInBytesForType(RsDataType dt) { 170221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams switch(dt) { 171221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_NONE: 172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 0; 173221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_8: 174221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_8: 175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_BOOLEAN: 176221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 1; 177221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 178221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_16: 179221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_16: 180221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_16: 181221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_5_6_5: 182221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_5_5_5_1: 183221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_4_4_4_4: 184221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 2; 185221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 186221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_32: 187221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_32: 188221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_32: 189221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4; 190221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 191221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_64: 192221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_64: 193221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_64: 194221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 8; 195221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 196221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_4X4: 197221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 16 * 4; 198221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_3X3: 199221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 9 * 4; 200221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_2X2: 201221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4 * 4; 202221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 203221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_TYPE: 204221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_ALLOCATION: 205221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SAMPLER: 206221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SCRIPT: 207221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MESH: 208221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_FRAGMENT: 209221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_VERTEX: 210221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_RASTER: 211221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_STORE: 212221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4; 213221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams default: 215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 216221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 217221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 218221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Missing type %i", dt); 219221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 0; 220221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 221221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 222221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsElement::Element(void *id, RenderScript *rs, 223221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt, RsDataKind dk, bool norm, uint32_t size) : 224221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams BaseObj(id, rs) 225221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams{ 226221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t tsize = GetSizeInBytesForType(dt); 227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt != RS_TYPE_UNSIGNED_5_6_5) && 228221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt != RS_TYPE_UNSIGNED_4_4_4_4) && 229221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt != RS_TYPE_UNSIGNED_5_5_5_1)) { 230221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (size == 3) { 231221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize * 4; 232221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 233221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize * size; 234221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 235221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 236221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize; 237221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 238221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = dt; 239221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mKind = dk; 240221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mNormalized = norm; 241221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVectorSize = size; 242221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 243221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 244221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsElement::~Element() { 245221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 246221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 247221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams /* 248221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams Element(int id, RenderScript rs) { 249221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams super(id, rs); 250221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 251221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams */ 252221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 253221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Element::updateFromNative() { 254221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams BaseObj::updateFromNative(); 255221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/* 256221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements 257221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int[] dataBuffer = new int[5]; 258221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS.nElementGetNativeData(getID(), dataBuffer); 259221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 260221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mNormalized = dataBuffer[2] == 1 ? true : false; 261221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVectorSize = dataBuffer[3]; 262221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSize = 0; 263221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (DataType dt: DataType.values()) { 264221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(dt.mID == dataBuffer[0]){ 265221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = dt; 266221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSize = mType.mSize * mVectorSize; 267221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 268221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 269221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (DataKind dk: DataKind.values()) { 270221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(dk.mID == dataBuffer[1]){ 271221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mKind = dk; 272221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 273221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 274221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 275221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int numSubElements = dataBuffer[4]; 276221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(numSubElements > 0) { 277221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElements = new Element[numSubElements]; 278221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElementNames = new String[numSubElements]; 279221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mArraySizes = new int[numSubElements]; 280221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mOffsetInBytes = new int[numSubElements]; 281221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 282221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int[] subElementIds = new int[numSubElements]; 283221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS.nElementGetSubElements(getID(), subElementIds, mElementNames, mArraySizes); 284221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for(int i = 0; i < numSubElements; i ++) { 285221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElements[i] = new Element(subElementIds[i], mRS); 286221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElements[i].updateFromNative(); 287221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mOffsetInBytes[i] = mSize; 288221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSize += mElements[i].mSize * mArraySizes[i]; 289221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 290221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 291221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams */ 292221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateVisibleSubElements(); 293221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 294221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 295221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsconst Element * Element::createUser(RenderScript *rs, RsDataType dt) { 296221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("createUser %p %i", rs, dt); 297221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams void * id = rsElementCreate(rs->mContext, dt, RS_KIND_USER, false, 1); 298221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, RS_KIND_USER, false, 1); 299221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 300221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 301221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsconst Element * Element::createVector(RenderScript *rs, RsDataType dt, uint32_t size) { 302221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (size < 2 || size > 4) { 303221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Vector size out of range 2-4."); 304221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return NULL; 305221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 306221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams void *id = rsElementCreate(rs->mContext, dt, RS_KIND_USER, false, size); 307221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, RS_KIND_USER, false, size); 308221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 309221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 310221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsconst Element * Element::createPixel(RenderScript *rs, RsDataType dt, RsDataKind dk) { 311221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("createPixel %p %i %i", rs, dt, 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)) { 318221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Unsupported DataKind"); 319221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return NULL; 320221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 321221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!(dt == RS_TYPE_UNSIGNED_8 || 322221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_16 || 323221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_5_6_5 || 324221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_4_4_4_4 || 325221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_5_5_5_1)) { 326221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Unsupported DataType"); 327221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return NULL; 328221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 329221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_5_6_5 && dk != RS_KIND_PIXEL_RGB) { 330221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Bad kind and type combo"); 331221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return NULL; 332221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 333221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_5_5_5_1 && dk != RS_KIND_PIXEL_RGBA) { 334221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Bad kind and type combo"); 335221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return NULL; 336221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 337221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_4_4_4_4 && dk != RS_KIND_PIXEL_RGBA) { 338221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Bad kind and type combo"); 339221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return NULL; 340221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 341221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_16 && dk != RS_KIND_PIXEL_DEPTH) { 342221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Bad kind and type combo"); 343221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return NULL; 344221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 345221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 346221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int size = 1; 347221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams switch (dk) { 348221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_LA: 349221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 2; 350221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 351221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_RGB: 352221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 3; 353221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 354221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_RGBA: 355221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 4; 356221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 357221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_DEPTH: 358221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 2; 359221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 360221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams default: 361221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 362221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 363221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 364221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams void * id = rsElementCreate(rs->mContext, dt, dk, true, size); 365221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, dk, true, size); 366221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 367221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 368221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsbool Element::isCompatible(const Element *e) { 369221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Try strict BaseObj equality to start with. 370221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (this == e) { 371221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return true; 372221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 373221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 374221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Ignore mKind because it is allowed to be different (user vs. pixel). 375221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // We also ignore mNormalized because it can be different. The mType 376221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // field must be non-null since we require name equivalence for 377221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // user-created Elements. 378221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return ((mSizeBytes == e->mSizeBytes) && 379221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (mType != NULL) && 380221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (mType == e->mType) && 381221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (mVectorSize == e->mVectorSize)); 382221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 383221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 384221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsElement::Builder::Builder(RenderScript *rs) { 385221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS = rs; 386221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 387221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 388221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 389221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Element::Builder::add(const Element *e, android::String8 &name, uint32_t arraySize) { 390221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Skip padding fields after a vector 3 type. 391221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mSkipPadding) { 392221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams const char *s1 = "#padding_"; 393221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams const char *s2 = name; 394221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t len = strlen(s1); 395221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (strlen(s2) >= len) { 396221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!memcmp(s1, s2, len)) { 397221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 398221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 399221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 400221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 401221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 402221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 403221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (e->mVectorSize == 3) { 404221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = true; 405221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 406221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 407221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 408221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 409221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElements.add(e); 410221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElementNames.add(name); 411221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mArraySizes.add(arraySize); 412221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 413221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 414221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsconst Element * Element::Builder::create() { 415221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t fieldCount = mElements.size(); 416221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams const char ** nameArray = (const char **)calloc(fieldCount, sizeof(char *)); 417221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t* sizeArray = (size_t*)calloc(fieldCount, sizeof(size_t)); 418221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 419221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct++) { 420221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams nameArray[ct] = mElementNames[ct].string(); 421221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams sizeArray[ct] = mElementNames[ct].length(); 422221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 423221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 424221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams void *id = rsElementCreate2(mRS->mContext, 425221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (RsElement *)mElements.array(), fieldCount, 426221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams nameArray, fieldCount * sizeof(size_t), sizeArray, 427221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (const uint32_t *)mArraySizes.array(), fieldCount); 428221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 429221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 430221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams free(nameArray); 431221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams free(sizeArray); 432221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 433221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams Element *e = new Element(id, mRS, mElements, mElementNames, mArraySizes); 434221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return e; 435221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 436221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 437