rsElement.h revision e23d239828a229eb7d4d33c9630070f0a87833e1
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" 22e23d239828a229eb7d4d33c9630070f0a87833e1Alex Sakhartchouk#include "rsDefines.h" 234815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams#include "rsObjectBase.h" 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// --------------------------------------------------------------------------- 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 284a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk/***************************************************************************** 294a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * CAUTION 304a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * 314a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * Any layout changes for this class may require a corresponding change to be 324a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains 334a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * a partial copy of the information below. 344a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * 354a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk *****************************************************************************/ 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// An element is a group of Components that occupies one cell in a structure. 37afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass Element : public ObjectBase { 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic: 39253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk struct Hal { 40253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk mutable void *drv; 41253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk 42253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk struct State { 43253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk RsDataType dataType; 44253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk RsDataKind dataKind; 45253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t vectorSize; 46253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t elementSizeBytes; 47253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk 48253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk // Subelements 49253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk const Element **fields; 50253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t *fieldArraySizes; 51253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk const char **fieldNames; 52253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t *fieldNameLengths; 53253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t *fieldOffsetBytes; 54253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk uint32_t fieldsCount; 55253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk }; 56253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk State state; 57253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk }; 58253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk Hal mHal; 59253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk 60c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk class Builder { 61c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk public: 6298cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk Builder(); 63c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk void add(const Element *e, const char *nameStr, uint32_t arraySize); 64c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> create(Context *rsc); 65c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk private: 66c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<ObjectBaseRef<const Element> > mBuilderElementRefs; 67c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<const Element *> mBuilderElements; 68c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<const char*> mBuilderNameStrings; 69c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<size_t> mBuilderNameLengths; 70c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Vector<uint32_t> mBuilderArrays; 71c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk }; 72565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t getGLType() const; 73565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t getGLFormat() const; 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 752d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getSizeBitsUnpadded() const; 762d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getSizeBytesUnpadded() const { 772d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return (getSizeBitsUnpadded() + 7) >> 3; 782d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 792d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t getSizeBits() const; 81e5ffb879ae535a899a486285a23bea05e912480fJason Sams size_t getSizeBytes() const { 82e5ffb879ae535a899a486285a23bea05e912480fJason Sams return (getSizeBits() + 7) >> 3; 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 85e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams size_t getFieldOffsetBits(uint32_t componentNumber) const { 86e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return mFields[componentNumber].offsetBits; 87e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 884815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams size_t getFieldOffsetBytes(uint32_t componentNumber) const { 89e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return mFields[componentNumber].offsetBits >> 3; 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 922d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getFieldOffsetBytesUnpadded(uint32_t componentNumber) const { 932d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return mFields[componentNumber].offsetBitsUnpadded >> 3; 942d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 952d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 964815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t getFieldCount() const {return mFieldCount;} 974815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams const Element * getField(uint32_t idx) const {return mFields[idx].e.get();} 984815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams const char * getFieldName(uint32_t idx) const {return mFields[idx].name.string();} 9939f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;} 100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 101d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const Component & getComponent() const {return mComponent;} 102d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType getType() const {return mComponent.getType();} 103d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind getKind() const {return mComponent.getKind();} 1044815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t getBits() const {return mBits;} 1052d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t getBitsUnpadded() const {return mBitsUnpadded;} 106e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 107d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams void dumpLOGV(const char *prefix) const; 108fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk virtual void serialize(OStream *stream) const; 109b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; } 110fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk static Element *createFromStream(Context *rsc, IStream *stream); 1114815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 112c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static ObjectBaseRef<const Element> createRef(Context *rsc, 113c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataType dt, 114c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataKind dk, 115c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool isNorm, 116c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t vecSize); 117c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static ObjectBaseRef<const Element> createRef(Context *rsc, size_t count, 118c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **, 119c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **, 120c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const size_t * lengths, 121c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const uint32_t *asin); 122c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 123c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static const Element* create(Context *rsc, 124c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataType dt, 125c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataKind dk, 126c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool isNorm, 127c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t vecSize) { 128c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> elem = createRef(rsc, dt, dk, isNorm, vecSize); 129c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk elem->incUserRef(); 130c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return elem.get(); 131c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 132c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static const Element* create(Context *rsc, size_t count, 133c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **ein, 134c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **nin, 135c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const size_t * lengths, 136c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const uint32_t *asin) { 137c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin); 138c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk elem->incUserRef(); 139c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return elem.get(); 140c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 1414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 142e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams void incRefs(const void *) const; 143e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams void decRefs(const void *) const; 144e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bool getHasReferences() const {return mHasReference;} 145e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 146326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsprotected: 147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // deallocate any components that are part of this element. 148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void clear(); 149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1504815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams typedef struct { 1514815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams String8 name; 152d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams ObjectBaseRef<const Element> e; 153e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t offsetBits; 1542d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t offsetBitsUnpadded; 15546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams uint32_t arraySize; 1564815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } ElementField_t; 1574815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ElementField_t *mFields; 1584815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams size_t mFieldCount; 159e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bool mHasReference; 1604815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 162c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk virtual ~Element(); 163e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams Element(Context *); 1644815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 165d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams Component mComponent; 1662d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t mBitsUnpadded; 1674815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t mBits; 16854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 16954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk void compute(); 170c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 171c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk virtual void preDestroy() const; 172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}; 173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 175326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsclass ElementState { 176326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic: 177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ElementState(); 178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ~ElementState(); 179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1808154954868694e1f233d87d4933a474518b1cb81Jason Sams // Cache of all existing elements. 181fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Vector<Element *> mElements; 182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}; 183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 187326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif //ANDROID_STRUCTURED_ELEMENT_H 188