rsElement.h revision 48ecf6a5e85a9a832f41393ed2802385bb8b5db8
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 60565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t getGLType() const; 61565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t getGLFormat() const; 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 632d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getSizeBitsUnpadded() const; 642d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getSizeBytesUnpadded() const { 652d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return (getSizeBitsUnpadded() + 7) >> 3; 662d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 672d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t getSizeBits() const; 69e5ffb879ae535a899a486285a23bea05e912480fJason Sams size_t getSizeBytes() const { 70e5ffb879ae535a899a486285a23bea05e912480fJason Sams return (getSizeBits() + 7) >> 3; 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 73e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams size_t getFieldOffsetBits(uint32_t componentNumber) const { 74e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return mFields[componentNumber].offsetBits; 75e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 764815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams size_t getFieldOffsetBytes(uint32_t componentNumber) const { 77e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return mFields[componentNumber].offsetBits >> 3; 78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 802d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getFieldOffsetBytesUnpadded(uint32_t componentNumber) const { 812d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return mFields[componentNumber].offsetBitsUnpadded >> 3; 822d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 832d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 844815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t getFieldCount() const {return mFieldCount;} 854815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams const Element * getField(uint32_t idx) const {return mFields[idx].e.get();} 8648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams const char * getFieldName(uint32_t idx) const {return mFields[idx].name;} 8739f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;} 88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 89d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const Component & getComponent() const {return mComponent;} 90d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType getType() const {return mComponent.getType();} 91d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind getKind() const {return mComponent.getKind();} 924815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t getBits() const {return mBits;} 932d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t getBitsUnpadded() const {return mBitsUnpadded;} 94c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams uint32_t getVectorSize() const {return mComponent.getVectorSize();} 95e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 96d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams void dumpLOGV(const char *prefix) const; 97e3150cfb3edb028407669e4a65e087eae77e718cJason Sams virtual void serialize(Context *rsc, OStream *stream) const; 98b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; } 99fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk static Element *createFromStream(Context *rsc, IStream *stream); 1004815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 101c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static ObjectBaseRef<const Element> createRef(Context *rsc, 102c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataType dt, 103c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataKind dk, 104c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool isNorm, 105c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t vecSize); 106c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static ObjectBaseRef<const Element> createRef(Context *rsc, size_t count, 107c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **, 108c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **, 109c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const size_t * lengths, 110c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const uint32_t *asin); 111c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 112c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static const Element* create(Context *rsc, 113c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataType dt, 114c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataKind dk, 115c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool isNorm, 116c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t vecSize) { 117c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> elem = createRef(rsc, dt, dk, isNorm, vecSize); 118c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk elem->incUserRef(); 119c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return elem.get(); 120c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 121c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static const Element* create(Context *rsc, size_t count, 122c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **ein, 123c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **nin, 124f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams const size_t * lengths = NULL, 125f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams const uint32_t *asin = NULL) { 126c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin); 127c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk elem->incUserRef(); 128c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return elem.get(); 129c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 1304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 131e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams void incRefs(const void *) const; 132e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams void decRefs(const void *) const; 133e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bool getHasReferences() const {return mHasReference;} 134e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 135326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsprotected: 136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // deallocate any components that are part of this element. 137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void clear(); 138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1394815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams typedef struct { 14048ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams const char *name; 141d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams ObjectBaseRef<const Element> e; 142e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t offsetBits; 1432d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t offsetBitsUnpadded; 14446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams uint32_t arraySize; 1454815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } ElementField_t; 1464815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ElementField_t *mFields; 1474815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams size_t mFieldCount; 148e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bool mHasReference; 1494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 151c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk virtual ~Element(); 152e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams Element(Context *); 1534815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 154d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams Component mComponent; 1552d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t mBitsUnpadded; 1564815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t mBits; 15754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 15854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk void compute(); 159c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 160c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk virtual void preDestroy() const; 161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}; 162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 164326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsclass ElementState { 165326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic: 166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ElementState(); 167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ~ElementState(); 168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1698154954868694e1f233d87d4933a474518b1cb81Jason Sams // Cache of all existing elements. 170fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Vector<Element *> mElements; 171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}; 172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif //ANDROID_STRUCTURED_ELEMENT_H 177