rsElement.h revision c700e649ca44d0dcff8b271e42d949ea72fe3c63
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#ifndef ANDROID_STRUCTURED_ELEMENT_H 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define ANDROID_STRUCTURED_ELEMENT_H 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 20d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams#include "rsComponent.h" 214815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams#include "rsUtils.h" 224815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams#include "rsObjectBase.h" 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// --------------------------------------------------------------------------- 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// An element is a group of Components that occupies one cell in a structure. 29afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass Element : public ObjectBase { 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic: 31c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk class Builder { 32c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk public: 33c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk void add(const Element *e, const char *nameStr, uint32_t arraySize); 34c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> create(Context *rsc); 35c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk private: 36c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<ObjectBaseRef<const Element> > mBuilderElementRefs; 37c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<const Element *> mBuilderElements; 38c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<const char*> mBuilderNameStrings; 39c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<size_t> mBuilderNameLengths; 40c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<uint32_t> mBuilderArrays; 41c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk }; 42565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t getGLType() const; 43565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t getGLFormat() const; 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t getSizeBits() const; 46e5ffb879ae535a899a486285a23bea05e912480fJason Sams size_t getSizeBytes() const { 47e5ffb879ae535a899a486285a23bea05e912480fJason Sams return (getSizeBits() + 7) >> 3; 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 50e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams size_t getFieldOffsetBits(uint32_t componentNumber) const { 51e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return mFields[componentNumber].offsetBits; 52e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 534815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams size_t getFieldOffsetBytes(uint32_t componentNumber) const { 54e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return mFields[componentNumber].offsetBits >> 3; 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 574815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t getFieldCount() const {return mFieldCount;} 584815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams const Element * getField(uint32_t idx) const {return mFields[idx].e.get();} 594815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams const char * getFieldName(uint32_t idx) const {return mFields[idx].name.string();} 6039f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;} 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 62d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const Component & getComponent() const {return mComponent;} 63d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType getType() const {return mComponent.getType();} 64d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind getKind() const {return mComponent.getKind();} 654815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t getBits() const {return mBits;} 66e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 67d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams void dumpLOGV(const char *prefix) const; 68fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk virtual void serialize(OStream *stream) const; 69b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; } 70fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk static Element *createFromStream(Context *rsc, IStream *stream); 714815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 72c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static ObjectBaseRef<const Element> createRef(Context *rsc, 73c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataType dt, 74c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataKind dk, 75c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool isNorm, 76c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t vecSize); 77c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static ObjectBaseRef<const Element> createRef(Context *rsc, size_t count, 78c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **, 79c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **, 80c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const size_t * lengths, 81c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const uint32_t *asin); 82c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 83c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static const Element* create(Context *rsc, 84c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataType dt, 85c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataKind dk, 86c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool isNorm, 87c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t vecSize) { 88c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> elem = createRef(rsc, dt, dk, isNorm, vecSize); 89c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk elem->incUserRef(); 90c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return elem.get(); 91c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 92c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static const Element* create(Context *rsc, size_t count, 93c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **ein, 94c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **nin, 95c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const size_t * lengths, 96c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const uint32_t *asin) { 97c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin); 98c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk elem->incUserRef(); 99c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return elem.get(); 100c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 1014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 102e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams void incRefs(const void *) const; 103e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams void decRefs(const void *) const; 104e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bool getHasReferences() const {return mHasReference;} 105e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 106326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsprotected: 107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // deallocate any components that are part of this element. 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void clear(); 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1104815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams typedef struct { 1114815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams String8 name; 112d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams ObjectBaseRef<const Element> e; 113e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t offsetBits; 11446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams uint32_t arraySize; 1154815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } ElementField_t; 1164815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ElementField_t *mFields; 1174815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams size_t mFieldCount; 118e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bool mHasReference; 1194815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 121c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk virtual ~Element(); 122e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams Element(Context *); 1234815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 124d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams Component mComponent; 1254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t mBits; 12654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 12754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk void compute(); 128c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 129c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk virtual void preDestroy() const; 130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}; 131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 133326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsclass ElementState { 134326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic: 135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ElementState(); 136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ~ElementState(); 137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 138e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk void elementBuilderBegin(); 139e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk void elementBuilderAdd(const Element *e, const char *nameStr, uint32_t arraySize); 140e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *elementBuilderCreate(Context *rsc); 141e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 1428154954868694e1f233d87d4933a474518b1cb81Jason Sams // Cache of all existing elements. 143fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Vector<Element *> mElements; 144e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukprivate: 145e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Vector<const Element *> mBuilderElements; 146e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Vector<const char*> mBuilderNameStrings; 147e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Vector<size_t> mBuilderNameLengths; 148e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Vector<uint32_t> mBuilderArrays; 149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}; 150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif //ANDROID_STRUCTURED_ELEMENT_H 155