rsElement.h revision 4a43e3ea8a0328c56ace0af1869b4c8c781a7b26
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 { 274a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk/***************************************************************************** 284a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * CAUTION 294a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * 304a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * Any layout changes for this class may require a corresponding change to be 314a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains 324a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * a partial copy of the information below. 334a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * 344a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk *****************************************************************************/ 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// An element is a group of Components that occupies one cell in a structure. 36afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass Element : public ObjectBase { 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic: 38253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk struct Hal { 39253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk mutable void *drv; 40253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk 41253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk struct State { 42253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk RsDataType dataType; 43253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk RsDataKind dataKind; 44253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t vectorSize; 45253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t elementSizeBytes; 46253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk 47253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk // Subelements 48253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk const Element **fields; 49253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t *fieldArraySizes; 50253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk const char **fieldNames; 51253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t *fieldNameLengths; 52253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t *fieldOffsetBytes; 53253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t fieldsCount; 54253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk }; 55253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk State state; 56253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk }; 57253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk Hal mHal; 58253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk 59c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk class Builder { 60c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk public: 6198cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk Builder(); 62c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk void add(const Element *e, const char *nameStr, uint32_t arraySize); 63c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> create(Context *rsc); 64c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk private: 65c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<ObjectBaseRef<const Element> > mBuilderElementRefs; 66c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<const Element *> mBuilderElements; 67c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<const char*> mBuilderNameStrings; 68c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<size_t> mBuilderNameLengths; 69c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<uint32_t> mBuilderArrays; 70c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk }; 71565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t getGLType() const; 72565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t getGLFormat() const; 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 742d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getSizeBitsUnpadded() const; 752d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getSizeBytesUnpadded() const { 762d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return (getSizeBitsUnpadded() + 7) >> 3; 772d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 782d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t getSizeBits() const; 80e5ffb879ae535a899a486285a23bea05e912480fJason Sams size_t getSizeBytes() const { 81e5ffb879ae535a899a486285a23bea05e912480fJason Sams return (getSizeBits() + 7) >> 3; 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 84e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams size_t getFieldOffsetBits(uint32_t componentNumber) const { 85e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return mFields[componentNumber].offsetBits; 86e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 874815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams size_t getFieldOffsetBytes(uint32_t componentNumber) const { 88e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return mFields[componentNumber].offsetBits >> 3; 89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 912d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getFieldOffsetBytesUnpadded(uint32_t componentNumber) const { 922d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return mFields[componentNumber].offsetBitsUnpadded >> 3; 932d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 942d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 954815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t getFieldCount() const {return mFieldCount;} 964815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams const Element * getField(uint32_t idx) const {return mFields[idx].e.get();} 974815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams const char * getFieldName(uint32_t idx) const {return mFields[idx].name.string();} 9839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;} 99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 100d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const Component & getComponent() const {return mComponent;} 101d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType getType() const {return mComponent.getType();} 102d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind getKind() const {return mComponent.getKind();} 1034815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t getBits() const {return mBits;} 1042d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t getBitsUnpadded() const {return mBitsUnpadded;} 105e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 106d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams void dumpLOGV(const char *prefix) const; 107fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk virtual void serialize(OStream *stream) const; 108b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; } 109fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk static Element *createFromStream(Context *rsc, IStream *stream); 1104815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 111c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static ObjectBaseRef<const Element> createRef(Context *rsc, 112c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataType dt, 113c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataKind dk, 114c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool isNorm, 115c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t vecSize); 116c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static ObjectBaseRef<const Element> createRef(Context *rsc, size_t count, 117c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **, 118c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **, 119c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const size_t * lengths, 120c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const uint32_t *asin); 121c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 122c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static const Element* create(Context *rsc, 123c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataType dt, 124c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataKind dk, 125c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool isNorm, 126c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t vecSize) { 127c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> elem = createRef(rsc, dt, dk, isNorm, vecSize); 128c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk elem->incUserRef(); 129c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return elem.get(); 130c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 131c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static const Element* create(Context *rsc, size_t count, 132c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **ein, 133c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **nin, 134c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const size_t * lengths, 135c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const uint32_t *asin) { 136c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin); 137c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk elem->incUserRef(); 138c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return elem.get(); 139c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 1404815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 141e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams void incRefs(const void *) const; 142e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams void decRefs(const void *) const; 143e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bool getHasReferences() const {return mHasReference;} 144e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 145326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsprotected: 146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // deallocate any components that are part of this element. 147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void clear(); 148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams typedef struct { 1504815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams String8 name; 151d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams ObjectBaseRef<const Element> e; 152e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t offsetBits; 1532d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t offsetBitsUnpadded; 15446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams uint32_t arraySize; 1554815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } ElementField_t; 1564815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ElementField_t *mFields; 1574815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams size_t mFieldCount; 158e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bool mHasReference; 1594815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 161c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk virtual ~Element(); 162e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams Element(Context *); 1634815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 164d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams Component mComponent; 1652d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t mBitsUnpadded; 1664815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t mBits; 16754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 16854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk void compute(); 169c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 170c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk virtual void preDestroy() const; 171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}; 172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 174326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsclass ElementState { 175326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic: 176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ElementState(); 177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ~ElementState(); 178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1798154954868694e1f233d87d4933a474518b1cb81Jason Sams // Cache of all existing elements. 180fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Vector<Element *> mElements; 181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}; 182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif //ANDROID_STRUCTURED_ELEMENT_H 187