Element.cpp revision 10913a5c37ba119bef335320d3e8be25212c05ad
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 17221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <malloc.h> 18221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <string.h> 19221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 20221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "RenderScript.h" 21221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2269cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace android; 239eb7f4b90120ebe4be74343856e86b46495f72dfTim Murrayusing namespace RSC; 24221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2589daad6bae798779e57f252e9da4fe4e62337124Tim Murrayandroid::RSC::sp<const Element> Element::getSubElement(uint32_t index) { 26221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mVisibleElementMap.size()) { 2721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Element contains no sub-elements"); 2821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return NULL; 29221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 30221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 3121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Illegal sub-element index"); 3221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return NULL; 33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mElements[mVisibleElementMap[index]]; 35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsconst char * Element::getSubElementName(uint32_t index) { 38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mVisibleElementMap.size()) { 3921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Element contains no sub-elements"); 4021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return NULL; 41221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 42221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 4321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Illegal sub-element index"); 4421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return NULL; 45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 46ab71636b50db242cead6a3787620d6340156684cTim Murray return mElementNames[mVisibleElementMap[index]].c_str(); 47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samssize_t Element::getSubElementArraySize(uint32_t index) { 50221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mVisibleElementMap.size()) { 5121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Element contains no sub-elements"); 5221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return 0; 53221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 54221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 5521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Illegal sub-element index"); 5621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return 0; 57221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mArraySizes[mVisibleElementMap[index]]; 59221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsuint32_t Element::getSubElementOffsetBytes(uint32_t index) { 62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mVisibleElementMap.size()) { 6321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Element contains no sub-elements"); 6421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return 0; 65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (index >= mVisibleElementMap.size()) { 6721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Illegal sub-element index"); 6821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return 0; 69221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 70221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mOffsetInBytes[mVisibleElementMap[index]]; 71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 73221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 7489daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define CREATE_USER(N, T) android::RSC::sp<const Element> Element::N(android::RSC::sp<RS> rs) { \ 75729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray if (rs->mElements.N == NULL) { \ 76729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray rs->mElements.N = (createUser(rs, RS_TYPE_##T)).get(); \ 77729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray } \ 78729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray return rs->mElements.N; \ 79729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray } 80729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray 81221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(BOOLEAN, BOOLEAN); 82221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U8, UNSIGNED_8); 83221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I8, SIGNED_8); 84221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U16, UNSIGNED_16); 85221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I16, SIGNED_16); 86221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U32, UNSIGNED_32); 87221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I32, SIGNED_32); 88221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(U64, UNSIGNED_64); 89221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(I64, SIGNED_64); 90221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(F32, FLOAT_32); 91221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(F64, FLOAT_64); 92221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(ELEMENT, ELEMENT); 93221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(TYPE, TYPE); 94221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(ALLOCATION, ALLOCATION); 95221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(SAMPLER, SAMPLER); 96221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(SCRIPT, SCRIPT); 97221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MESH, MESH); 98221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_FRAGMENT, PROGRAM_FRAGMENT); 99221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_VERTEX, PROGRAM_VERTEX); 100221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_RASTER, PROGRAM_RASTER); 101221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(PROGRAM_STORE, PROGRAM_STORE); 102221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_4X4, MATRIX_4X4); 103221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_3X3, MATRIX_3X3); 104221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_2X2, MATRIX_2X2); 105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 10689daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define CREATE_PIXEL(N, T, K) android::RSC::sp<const Element> Element::N(android::RSC::sp<RS> rs) { \ 107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createPixel(rs, RS_TYPE_##T, RS_KIND_##K); \ 108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 109221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(A_8, UNSIGNED_8, PIXEL_A); 110221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGB_565, UNSIGNED_5_6_5, PIXEL_RGB); 111221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGB_888, UNSIGNED_8, PIXEL_RGB); 112221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGBA_4444, UNSIGNED_4_4_4_4, PIXEL_RGBA); 113221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_PIXEL(RGBA_8888, UNSIGNED_8, PIXEL_RGBA); 114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 11589daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define CREATE_VECTOR(N, T) android::RSC::sp<const Element> Element::N##_2(android::RSC::sp<RS> rs) { \ 116221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createVector(rs, RS_TYPE_##T, 2); \ 117221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} \ 11889daad6bae798779e57f252e9da4fe4e62337124Tim Murrayandroid::RSC::sp<const Element> Element::N##_3(android::RSC::sp<RS> rs) { \ 119221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createVector(rs, RS_TYPE_##T, 3); \ 120221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} \ 12189daad6bae798779e57f252e9da4fe4e62337124Tim Murrayandroid::RSC::sp<const Element> Element::N##_4(android::RSC::sp<RS> rs) { \ 122221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createVector(rs, RS_TYPE_##T, 4); \ 123221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 124221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U8, UNSIGNED_8); 125221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I8, SIGNED_8); 126221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U16, UNSIGNED_16); 127221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I16, SIGNED_16); 128221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U32, UNSIGNED_32); 129221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I32, SIGNED_32); 130221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U64, UNSIGNED_64); 131221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I64, SIGNED_64); 132221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(F32, FLOAT_32); 133221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(F64, FLOAT_64); 134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Element::updateVisibleSubElements() { 137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!mElements.size()) { 138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVisibleElementMap.clear(); 141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int noPaddingFieldCount = 0; 143221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t fieldCount = mElementNames.size(); 144221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Find out how many elements are not padding 145221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct ++) { 146ab71636b50db242cead6a3787620d6340156684cTim Murray if (mElementNames[ct].c_str()[0] != '#') { 147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams noPaddingFieldCount ++; 148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 149221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 151221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Make a map that points us at non-padding elements 152221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct ++) { 153ab71636b50db242cead6a3787620d6340156684cTim Murray if (mElementNames[ct].c_str()[0] != '#') { 15489daad6bae798779e57f252e9da4fe4e62337124Tim Murray mVisibleElementMap.push_back((uint32_t)ct); 155221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 156221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 158221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 15989daad6bae798779e57f252e9da4fe4e62337124Tim MurrayElement::Element(void *id, android::RSC::sp<RS> rs, 16089daad6bae798779e57f252e9da4fe4e62337124Tim Murray std::vector<android::RSC::sp<Element> > &elements, 161ab71636b50db242cead6a3787620d6340156684cTim Murray std::vector<std::string> &elementNames, 16289daad6bae798779e57f252e9da4fe4e62337124Tim Murray std::vector<uint32_t> &arraySizes) : BaseObj(id, rs) { 163221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = 0; 164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVectorSize = 1; 165221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElements = elements; 166221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mArraySizes = arraySizes; 167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mElementNames = elementNames; 168221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 169221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = RS_TYPE_NONE; 170221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mKind = RS_KIND_USER; 171221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < mElements.size(); ct++ ) { 17389daad6bae798779e57f252e9da4fe4e62337124Tim Murray mOffsetInBytes.push_back(mSizeBytes); 174221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes += mElements[ct]->mSizeBytes * mArraySizes[ct]; 175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 176221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateVisibleSubElements(); 177221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 178221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 179221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 180221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsstatic uint32_t GetSizeInBytesForType(RsDataType dt) { 181221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams switch(dt) { 182221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_NONE: 183221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 0; 184221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_8: 185221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_8: 186221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_BOOLEAN: 187221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 1; 188221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 189221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_16: 190221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_16: 191221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_16: 192221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_5_6_5: 193221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_5_5_5_1: 194221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_4_4_4_4: 195221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 2; 196221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 197221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_32: 198221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_32: 199221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_32: 200221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4; 201221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 202221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_64: 203221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_64: 204221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_64: 205221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 8; 206221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 207221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_4X4: 208221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 16 * 4; 209221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_3X3: 210221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 9 * 4; 211221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_2X2: 212221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4 * 4; 213221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_TYPE: 215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_ALLOCATION: 216221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SAMPLER: 217221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SCRIPT: 218221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MESH: 219221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_FRAGMENT: 220221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_VERTEX: 221221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_RASTER: 222221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_STORE: 223221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4; 224221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 225221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams default: 226221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 228221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 229221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Missing type %i", dt); 230221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 0; 231221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 232221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 23389daad6bae798779e57f252e9da4fe4e62337124Tim MurrayElement::Element(void *id, android::RSC::sp<RS> rs, 234221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt, RsDataKind dk, bool norm, uint32_t size) : 235221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams BaseObj(id, rs) 236221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams{ 237221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t tsize = GetSizeInBytesForType(dt); 238221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt != RS_TYPE_UNSIGNED_5_6_5) && 239221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt != RS_TYPE_UNSIGNED_4_4_4_4) && 240221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt != RS_TYPE_UNSIGNED_5_5_5_1)) { 241221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (size == 3) { 242221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize * 4; 243221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 244221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize * size; 245221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 246221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 247221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize; 248221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 249221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = dt; 250221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mKind = dk; 251221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mNormalized = norm; 252221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVectorSize = size; 253221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 254221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 255221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsElement::~Element() { 256221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 257221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 258221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Element::updateFromNative() { 259221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams BaseObj::updateFromNative(); 260221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateVisibleSubElements(); 261221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 262221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 26389daad6bae798779e57f252e9da4fe4e62337124Tim Murrayandroid::RSC::sp<const Element> Element::createUser(android::RSC::sp<RS> rs, RsDataType dt) { 264a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray void * id = RS::dispatch->ElementCreate(rs->getContext(), dt, RS_KIND_USER, false, 1); 265221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, RS_KIND_USER, false, 1); 266221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 267221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 26889daad6bae798779e57f252e9da4fe4e62337124Tim Murrayandroid::RSC::sp<const Element> Element::createVector(android::RSC::sp<RS> rs, RsDataType dt, uint32_t size) { 269221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (size < 2 || size > 4) { 27021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Vector size out of range 2-4."); 27121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return NULL; 272221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 273a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray void *id = RS::dispatch->ElementCreate(rs->getContext(), dt, RS_KIND_USER, false, size); 274221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, RS_KIND_USER, false, size); 275221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 276221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 27789daad6bae798779e57f252e9da4fe4e62337124Tim Murrayandroid::RSC::sp<const Element> Element::createPixel(android::RSC::sp<RS> rs, RsDataType dt, RsDataKind dk) { 278221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!(dk == RS_KIND_PIXEL_L || 279221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_A || 280221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_LA || 281221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_RGB || 282221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_RGBA || 283221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_DEPTH)) { 28421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Unsupported DataKind"); 28521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return NULL; 286221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 287221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!(dt == RS_TYPE_UNSIGNED_8 || 288221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_16 || 289221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_5_6_5 || 290221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_4_4_4_4 || 291221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_5_5_5_1)) { 29221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Unsupported DataType"); 29321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return NULL; 294221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 295221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_5_6_5 && dk != RS_KIND_PIXEL_RGB) { 29621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Bad kind and type combo"); 29721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return NULL; 298221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 299221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_5_5_5_1 && dk != RS_KIND_PIXEL_RGBA) { 30021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Bad kind and type combo"); 30121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return NULL; 302221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 303221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_4_4_4_4 && dk != RS_KIND_PIXEL_RGBA) { 30421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Bad kind and type combo"); 30521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return NULL; 306221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 307221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_16 && dk != RS_KIND_PIXEL_DEPTH) { 30821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Bad kind and type combo"); 30921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return NULL; 310221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 311221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 312221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int size = 1; 313221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams switch (dk) { 314221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_LA: 315221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 2; 316221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 317221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_RGB: 318221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 3; 319221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 320221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_RGBA: 321221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 4; 322221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 323221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_DEPTH: 324221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 2; 325221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 326221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams default: 327221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 328221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 329221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 330a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray void * id = RS::dispatch->ElementCreate(rs->getContext(), dt, dk, true, size); 331221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, dk, true, size); 332221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 333221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 33410913a5c37ba119bef335320d3e8be25212c05adTim Murraybool Element::isCompatible(android::RSC::sp<const Element>e) const { 335221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Try strict BaseObj equality to start with. 33669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams if (this == e.get()) { 337221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return true; 338221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 339221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 340221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Ignore mKind because it is allowed to be different (user vs. pixel). 341221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // We also ignore mNormalized because it can be different. The mType 342221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // field must be non-null since we require name equivalence for 343221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // user-created Elements. 344221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return ((mSizeBytes == e->mSizeBytes) && 34569cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams (mType != RS_TYPE_NONE) && 346221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (mType == e->mType) && 347221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (mVectorSize == e->mVectorSize)); 348221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 349221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 35089daad6bae798779e57f252e9da4fe4e62337124Tim MurrayElement::Builder::Builder(android::RSC::sp<RS> rs) { 351221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS = rs; 352221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 353221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 354221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 355ab71636b50db242cead6a3787620d6340156684cTim Murrayvoid Element::Builder::add(android::RSC::sp</*const*/ Element>e, std::string &name, uint32_t arraySize) { 356221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Skip padding fields after a vector 3 type. 357221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mSkipPadding) { 358221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams const char *s1 = "#padding_"; 359ab71636b50db242cead6a3787620d6340156684cTim Murray const char *s2 = name.c_str(); 360221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t len = strlen(s1); 361221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (strlen(s2) >= len) { 362221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!memcmp(s1, s2, len)) { 363221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 364221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 365221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 366221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 367221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 368221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 369221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (e->mVectorSize == 3) { 370221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = true; 371221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 372221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 373221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 374221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 37589daad6bae798779e57f252e9da4fe4e62337124Tim Murray mElements.push_back(e); 37689daad6bae798779e57f252e9da4fe4e62337124Tim Murray mElementNames.push_back(name); 37789daad6bae798779e57f252e9da4fe4e62337124Tim Murray mArraySizes.push_back(arraySize); 378221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 379221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 38089daad6bae798779e57f252e9da4fe4e62337124Tim Murrayandroid::RSC::sp<const Element> Element::Builder::create() { 381221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t fieldCount = mElements.size(); 382221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams const char ** nameArray = (const char **)calloc(fieldCount, sizeof(char *)); 38369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams const Element ** elementArray = (const Element **)calloc(fieldCount, sizeof(Element *)); 384221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t* sizeArray = (size_t*)calloc(fieldCount, sizeof(size_t)); 385221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 386221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct++) { 387ab71636b50db242cead6a3787620d6340156684cTim Murray nameArray[ct] = mElementNames[ct].c_str(); 38869cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams elementArray[ct] = mElements[ct].get(); 389221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams sizeArray[ct] = mElementNames[ct].length(); 390221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 391221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 392a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray void *id = RS::dispatch->ElementCreate2(mRS->getContext(), 39369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams (RsElement *)elementArray, fieldCount, 394221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams nameArray, fieldCount * sizeof(size_t), sizeArray, 39589daad6bae798779e57f252e9da4fe4e62337124Tim Murray (const uint32_t *)&mArraySizes[0], fieldCount); 396221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 397221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 398221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams free(nameArray); 399221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams free(sizeArray); 40069cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams free(elementArray); 40169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams return new Element(id, mRS, mElements, mElementNames, mArraySizes); 402221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 403221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 404