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" 21eeaf7142d7e06efb3e0ddc7ef542884ab1d527dcTim Murray#include "rsCppInternal.h" 22221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 23dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::Element; 24221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2589daad6bae798779e57f252e9da4fe4e62337124Tim Murrayandroid::RSC::sp<const Element> Element::getSubElement(uint32_t index) { 26bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (!mVisibleElementMapSize) { 2721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Element contains no sub-elements"); 2844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 29221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 30bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (index >= mVisibleElementMapSize) { 3121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Illegal sub-element index"); 3244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return mElements[mVisibleElementMap[index]]; 35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsconst char * Element::getSubElementName(uint32_t index) { 38bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (!mVisibleElementMapSize) { 3921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Element contains no sub-elements"); 4044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 41221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 42bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (index >= mVisibleElementMapSize) { 4321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Illegal sub-element index"); 4444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 46bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang return mElementNames[mVisibleElementMap[index]]; 47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samssize_t Element::getSubElementArraySize(uint32_t index) { 50bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (!mVisibleElementMapSize) { 5121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Element contains no sub-elements"); 5221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return 0; 53221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 54bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (index >= mVisibleElementMapSize) { 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) { 62bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (!mVisibleElementMapSize) { 6321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Element contains no sub-elements"); 6421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return 0; 65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 66bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (index >= mVisibleElementMapSize) { 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 7445768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsieh#define CREATE_USER(N, T) android::RSC::sp<const Element> Element::N(const android::RSC::sp<RS>& rs) { \ 7544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (rs->mElements.N == nullptr) { \ 76eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray rs->mElements.N = (createUser(rs, RS_TYPE_##T)); \ 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); 90566168431399086c146b2f845f6d0128852c9686Pirama Arumuga NainarCREATE_USER(F16, FLOAT_16); 91221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(F32, FLOAT_32); 92221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(F64, FLOAT_64); 93221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(ELEMENT, ELEMENT); 94221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(TYPE, TYPE); 95221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(ALLOCATION, ALLOCATION); 96221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(SAMPLER, SAMPLER); 97221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(SCRIPT, SCRIPT); 98221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_4X4, MATRIX_4X4); 99221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_3X3, MATRIX_3X3); 100221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_USER(MATRIX_2X2, MATRIX_2X2); 101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 10245768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsieh#define CREATE_PIXEL(N, T, K) android::RSC::sp<const Element> Element::N(const android::RSC::sp<RS> &rs) { \ 10344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (rs->mElements.N == nullptr) { \ 10444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes rs->mElements.N = createPixel(rs, RS_TYPE_##T, RS_KIND_##K); \ 10544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes } \ 10644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return rs->mElements.N; \ 107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 108eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray 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); 114eb4426dfb63983559cf903b2ea984569e990c4fdTim MurrayCREATE_PIXEL(YUV, UNSIGNED_8, PIXEL_YUV); 115071aee6b0cffde1ce3ece5e32e34361db2105547Tim MurrayCREATE_PIXEL(RGBA_5551, UNSIGNED_5_5_5_1, PIXEL_RGBA); 116221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 11745768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsieh#define CREATE_VECTOR(N, T) android::RSC::sp<const Element> Element::N##_2(const android::RSC::sp<RS> &rs) { \ 11844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (rs->mElements.N##_2 == nullptr) { \ 11944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes rs->mElements.N##_2 = createVector(rs, RS_TYPE_##T, 2); \ 12044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes } \ 12144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return rs->mElements.N##_2; \ 12244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes} \ 12345768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehandroid::RSC::sp<const Element> Element::N##_3(const android::RSC::sp<RS> &rs) { \ 12444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (rs->mElements.N##_3 == nullptr) { \ 12544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes rs->mElements.N##_3 = createVector(rs, RS_TYPE_##T, 3); \ 12644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes } \ 12744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return rs->mElements.N##_3; \ 128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} \ 12945768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehandroid::RSC::sp<const Element> Element::N##_4(const android::RSC::sp<RS> &rs) { \ 13044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (rs->mElements.N##_4 == nullptr) { \ 13144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes rs->mElements.N##_4 = createVector(rs, RS_TYPE_##T, 4); \ 13244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes } \ 13344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return rs->mElements.N##_4; \ 134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 135221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U8, UNSIGNED_8); 136221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I8, SIGNED_8); 137221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U16, UNSIGNED_16); 138221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I16, SIGNED_16); 139221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U32, UNSIGNED_32); 140221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I32, SIGNED_32); 141221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(U64, UNSIGNED_64); 142221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(I64, SIGNED_64); 143566168431399086c146b2f845f6d0128852c9686Pirama Arumuga NainarCREATE_VECTOR(F16, FLOAT_16); 144221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(F32, FLOAT_32); 145221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsCREATE_VECTOR(F64, FLOAT_64); 146221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Element::updateVisibleSubElements() { 149bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (!mElementsCount) { 150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 151221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 152bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (mVisibleElementMapSize) { 153bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mVisibleElementMap); 154bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mVisibleElementMapSize = 0; 155bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang } 156bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mVisibleElementMap = (uint32_t*)calloc(mElementsCount, sizeof(uint32_t)); 157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 158221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int noPaddingFieldCount = 0; 159bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang size_t fieldCount = mElementsCount; 160cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang // Find out how many elements are not padding. 161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct ++) { 162bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (mElementNames[ct][0] != '#') { 163221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams noPaddingFieldCount ++; 164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 165221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 166221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 167cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang // Make a map that points us at non-padding elements. 168bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang size_t i = 0; 169221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct ++) { 170bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (mElementNames[ct][0] != '#') { 171bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mVisibleElementMap[i++] = (uint32_t)ct; 172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 173221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 174bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mVisibleElementMapSize = i; 175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 176221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 17789daad6bae798779e57f252e9da4fe4e62337124Tim MurrayElement::Element(void *id, android::RSC::sp<RS> rs, 178bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang android::RSC::sp<const Element> * elements, 179bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang size_t elementCount, 180bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang const char ** elementNames, 181bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang size_t * elementNameLengths, 182bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang uint32_t * arraySizes) : BaseObj(id, rs) { 183221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = 0; 184221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVectorSize = 1; 185bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementsCount = elementCount; 186bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mVisibleElementMap = nullptr; 187bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mVisibleElementMapSize = 0; 188bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang 1899ab11993c8410d27edb5ee4b9239dd96b3416d6bRahul Chaudhry mElements = (android::RSC::sp<const Element> *)calloc(mElementsCount, sizeof(android::RSC::sp<const Element>)); 190bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementNames = (char **)calloc(mElementsCount, sizeof(char *)); 191bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementNameLengths = (size_t*)calloc(mElementsCount, sizeof(size_t)); 192bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mArraySizes = (uint32_t*)calloc(mElementsCount, sizeof(uint32_t)); 193bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mOffsetInBytes = (uint32_t*)calloc(mElementsCount, sizeof(uint32_t)); 194bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang 195bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang memcpy(mElements, elements, mElementsCount * sizeof(android::RSC::sp<Element>)); 196bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang memcpy(mArraySizes, arraySizes, mElementsCount * sizeof(uint32_t)); 197bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang 198cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang // Copy strings (char array). 199bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang memcpy(mElementNameLengths, elementNameLengths, mElementsCount * sizeof(size_t)); 200bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang for (size_t ct = 0; ct < mElementsCount; ct++ ) { 201bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang size_t elemNameLen = mElementNameLengths[ct]; 202bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementNames[ct] = (char *)calloc(elemNameLen, sizeof(char)); 203bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang memcpy(mElementNames[ct], elementNames[ct], elemNameLen); 204bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang } 205221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 206221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = RS_TYPE_NONE; 207221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mKind = RS_KIND_USER; 208221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 209bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang for (size_t ct = 0; ct < mElementsCount; ct++ ) { 210bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mOffsetInBytes[ct] = mSizeBytes; 211221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes += mElements[ct]->mSizeBytes * mArraySizes[ct]; 212221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 213221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateVisibleSubElements(); 214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 21670d8995254ee38173129e4ae4c9372f43716eb4eMiao WangElement::Element(void *id, android::RSC::sp<RS> rs) : 21770d8995254ee38173129e4ae4c9372f43716eb4eMiao Wang BaseObj(id, rs) { 21870d8995254ee38173129e4ae4c9372f43716eb4eMiao Wang} 219221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 220221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsstatic uint32_t GetSizeInBytesForType(RsDataType dt) { 221221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams switch(dt) { 222221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_NONE: 223221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 0; 224221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_8: 225221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_8: 226221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_BOOLEAN: 227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 1; 228221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 229221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_16: 230221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_16: 231221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_16: 232221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_5_6_5: 233221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_5_5_5_1: 234221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_4_4_4_4: 235221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 2; 236221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 237221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_32: 238221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_32: 239221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_32: 240221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4; 241221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 242221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_FLOAT_64: 243221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SIGNED_64: 244221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_UNSIGNED_64: 245221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 8; 246221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 247221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_4X4: 248221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 16 * 4; 249221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_3X3: 250221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 9 * 4; 251221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MATRIX_2X2: 252221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4 * 4; 253221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 254221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_TYPE: 255221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_ALLOCATION: 256221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SAMPLER: 257221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_SCRIPT: 258221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_MESH: 259221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_FRAGMENT: 260221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_VERTEX: 261221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_RASTER: 262221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_TYPE_PROGRAM_STORE: 263221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 4; 264221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 265221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams default: 266221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 267221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 268221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 269221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Missing type %i", dt); 270221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return 0; 271221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 272221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 27389daad6bae798779e57f252e9da4fe4e62337124Tim MurrayElement::Element(void *id, android::RSC::sp<RS> rs, 274221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt, RsDataKind dk, bool norm, uint32_t size) : 275221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams BaseObj(id, rs) 276221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams{ 277221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams uint32_t tsize = GetSizeInBytesForType(dt); 278221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt != RS_TYPE_UNSIGNED_5_6_5) && 279221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt != RS_TYPE_UNSIGNED_4_4_4_4) && 280221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt != RS_TYPE_UNSIGNED_5_5_5_1)) { 281221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (size == 3) { 282221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize * 4; 283221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 284221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize * size; 285221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 286221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 287221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSizeBytes = tsize; 288221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 289221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = dt; 290221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mKind = dk; 291221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mNormalized = norm; 292221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mVectorSize = size; 293bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementsCount = 0; 294bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mVisibleElementMap = 0; 295221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 296221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 297221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsElement::~Element() { 298bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (mElementsCount) { 299bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mElements); 300bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang for (size_t ct = 0; ct < mElementsCount; ct++ ) { 301bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mElementNames[ct]); 302bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang } 303bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mElementNames); 304bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mElementNameLengths); 305bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mArraySizes); 306bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mOffsetInBytes); 307bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang } 308bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (mVisibleElementMapSize) { 309bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mVisibleElementMap); 310bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang } 311221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 312221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 313221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Element::updateFromNative() { 314221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams BaseObj::updateFromNative(); 315221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateVisibleSubElements(); 316221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 317221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 31845768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehandroid::RSC::sp<const Element> Element::createUser(const android::RSC::sp<RS>& rs, RsDataType dt) { 319a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray void * id = RS::dispatch->ElementCreate(rs->getContext(), dt, RS_KIND_USER, false, 1); 320221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, RS_KIND_USER, false, 1); 321221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 322221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 32345768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehandroid::RSC::sp<const Element> Element::createVector(const android::RSC::sp<RS>& rs, RsDataType dt, uint32_t size) { 324221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (size < 2 || size > 4) { 32521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Vector size out of range 2-4."); 32644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 327221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 328a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray void *id = RS::dispatch->ElementCreate(rs->getContext(), dt, RS_KIND_USER, false, size); 329221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, RS_KIND_USER, false, size); 330221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 331221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 33245768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehandroid::RSC::sp<const Element> Element::createPixel(const android::RSC::sp<RS>& rs, RsDataType dt, RsDataKind dk) { 333221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!(dk == RS_KIND_PIXEL_L || 334221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_A || 335221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_LA || 336221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_RGB || 337221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dk == RS_KIND_PIXEL_RGBA || 33843a6cba1be3ef984cd619c85373973cbb93edf5eMiao Wang dk == RS_KIND_PIXEL_DEPTH || 33943a6cba1be3ef984cd619c85373973cbb93edf5eMiao Wang dk == RS_KIND_PIXEL_YUV)) { 34021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Unsupported DataKind"); 34144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 342221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 343221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!(dt == RS_TYPE_UNSIGNED_8 || 344221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_16 || 345221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_5_6_5 || 346221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_4_4_4_4 || 347221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams dt == RS_TYPE_UNSIGNED_5_5_5_1)) { 34821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Unsupported DataType"); 34944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 350221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 351221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_5_6_5 && dk != RS_KIND_PIXEL_RGB) { 35221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Bad kind and type combo"); 35344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 354221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 355221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_5_5_5_1 && dk != RS_KIND_PIXEL_RGBA) { 35621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Bad kind and type combo"); 35744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 358221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 359221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_4_4_4_4 && dk != RS_KIND_PIXEL_RGBA) { 36021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Bad kind and type combo"); 36144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 362221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 363221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_UNSIGNED_16 && dk != RS_KIND_PIXEL_DEPTH) { 36421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray rs->throwError(RS_ERROR_INVALID_PARAMETER, "Bad kind and type combo"); 36544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 366221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 367221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 368221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int size = 1; 369221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams switch (dk) { 370221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_LA: 371221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 2; 372221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 373221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_RGB: 374221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 3; 375221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 376221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_RGBA: 377221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 4; 378221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 379221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_KIND_PIXEL_DEPTH: 380221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size = 2; 381221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 382221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams default: 383221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 384221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 385221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 386a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray void * id = RS::dispatch->ElementCreate(rs->getContext(), dt, dk, true, size); 387221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Element(id, rs, dt, dk, true, size); 388221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 389221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 39045768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehbool Element::isCompatible(const android::RSC::sp<const Element>&e) const { 391221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Try strict BaseObj equality to start with. 39269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams if (this == e.get()) { 393221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return true; 394221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 395221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 396cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang /* 397cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang * Ignore mKind because it is allowed to be different (user vs. pixel). 398cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang * We also ignore mNormalized because it can be different. The mType 399cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang * field must be non-null since we require name equivalence for 400cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang * user-created Elements. 401cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang */ 402221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return ((mSizeBytes == e->mSizeBytes) && 40369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams (mType != RS_TYPE_NONE) && 404221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (mType == e->mType) && 405221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (mVectorSize == e->mVectorSize)); 406221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 407221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 40889daad6bae798779e57f252e9da4fe4e62337124Tim MurrayElement::Builder::Builder(android::RSC::sp<RS> rs) { 4093560907fa9b1624eefbd6db5e9c3ccc25ab23b92Tim Murray mRS = rs.get(); 410221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 411bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementsVecSize = 8; 412bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementsCount = 0; 413cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang // Initialize space. 4149ab11993c8410d27edb5ee4b9239dd96b3416d6bRahul Chaudhry mElements = (android::RSC::sp<const Element> *)calloc(mElementsVecSize, sizeof(android::RSC::sp<const Element>)); 415bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementNames = (char **)calloc(mElementsVecSize, sizeof(char *)); 416bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementNameLengths = (size_t*)calloc(mElementsVecSize, sizeof(size_t)); 417bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mArraySizes = (uint32_t*)calloc(mElementsVecSize, sizeof(uint32_t)); 418221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 419221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 420bc10dff26207bb8c02051b28326bb134a8f28eb3Miao WangElement::Builder::~Builder() { 421cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang // Free allocated space. 422bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mElements); 423bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang for (size_t ct = 0; ct < mElementsCount; ct++ ) { 424bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mElementNames[ct]); 425bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang } 426bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mElementNameLengths); 427bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mElementNames); 428bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mArraySizes); 429bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang} 430bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang 43145768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid Element::Builder::add(const android::RSC::sp<const Element>&e, const char * name, uint32_t arraySize) { 432221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams // Skip padding fields after a vector 3 type. 433221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mSkipPadding) { 434221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams const char *s1 = "#padding_"; 435bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang const char *s2 = name; 436221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams size_t len = strlen(s1); 437221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (strlen(s2) >= len) { 438221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (!memcmp(s1, s2, len)) { 439221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 440221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 441221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 442221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 443221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 444221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 445221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (e->mVectorSize == 3) { 446221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = true; 447221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 448221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSkipPadding = false; 449221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 450221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 451bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang if (mElementsCount >= mElementsVecSize) { 452cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang // If pre-allocated space is full, allocate a larger one. 453bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementsVecSize += 8; 454bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang 4559ab11993c8410d27edb5ee4b9239dd96b3416d6bRahul Chaudhry android::RSC::sp<const Element> * newElements = (android::RSC::sp<const Element> *)calloc(mElementsVecSize, sizeof(android::RSC::sp<const Element>)); 456bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang char ** newElementNames = (char **)calloc(mElementsVecSize, sizeof(char *)); 457bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang size_t * newElementNameLengths = (size_t*)calloc(mElementsVecSize, sizeof(size_t)); 458bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang uint32_t * newArraySizes = (uint32_t*)calloc(mElementsVecSize, sizeof(uint32_t)); 459bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang 460bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang memcpy(newElements, mElements, mElementsCount * sizeof(android::RSC::sp<Element>)); 461bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang memcpy(newElementNames, mElementNames, mElementsCount * sizeof(char *)); 462bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang memcpy(newElementNameLengths, mElementNameLengths, mElementsCount * sizeof(size_t)); 463bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang memcpy(newArraySizes, mArraySizes, mElementsCount * sizeof(uint32_t)); 464bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang 465cf067b8c4d1e53bc4768fbad239851c579717f2cMiao Wang // Free the old arrays. 466bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mElements); 467bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mElementNames); 468bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mArraySizes); 469bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang free(mElementNameLengths); 470bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang 471bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElements = newElements; 472bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementNames = newElementNames; 473bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mArraySizes = newArraySizes; 474bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementNameLengths = newElementNameLengths; 475bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang } 476bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElements[mElementsCount] = e; 477bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mArraySizes[mElementsCount] = arraySize; 478bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang 479bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang size_t nameLen = strlen(name); 480bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementNameLengths[mElementsCount] = nameLen + 1; 481bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementNames[mElementsCount] = (char *)calloc(nameLen + 1, sizeof(char)); 482bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang memcpy(mElementNames[mElementsCount], name, nameLen); 483bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementNames[mElementsCount][nameLen] = 0; 484bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang 485bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mElementsCount++; 486221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 487221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 48889daad6bae798779e57f252e9da4fe4e62337124Tim Murrayandroid::RSC::sp<const Element> Element::Builder::create() { 489bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang size_t fieldCount = mElementsCount; 490bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang void ** elementArray = (void **)calloc(fieldCount, sizeof(void *)); 491221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 492221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams for (size_t ct = 0; ct < fieldCount; ct++) { 493bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang elementArray[ct] = mElements[ct]->getID(); 494221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 495221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 496a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray void *id = RS::dispatch->ElementCreate2(mRS->getContext(), 497bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang (RsElement *)elementArray, fieldCount, 498bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang (const char **)mElementNames, fieldCount, mElementNameLengths, 499bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang mArraySizes, fieldCount); 50069cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams free(elementArray); 501bc10dff26207bb8c02051b28326bb134a8f28eb3Miao Wang return new Element(id, mRS, mElements, mElementsCount, (const char **)mElementNames, mElementNameLengths, mArraySizes); 502221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 503