rsElement.h revision 49a87772b9abe620d28cbe110260424b8950055d
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 6049a87772b9abe620d28cbe110260424b8950055dTim Murray void operator delete(void* ptr); 6149a87772b9abe620d28cbe110260424b8950055dTim Murray 62565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t getGLType() const; 63565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t getGLFormat() const; 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 652d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getSizeBitsUnpadded() const; 662d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getSizeBytesUnpadded() const { 672d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return (getSizeBitsUnpadded() + 7) >> 3; 682d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 692d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t getSizeBits() const; 71e5ffb879ae535a899a486285a23bea05e912480fJason Sams size_t getSizeBytes() const { 72e5ffb879ae535a899a486285a23bea05e912480fJason Sams return (getSizeBits() + 7) >> 3; 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 75e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams size_t getFieldOffsetBits(uint32_t componentNumber) const { 76e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return mFields[componentNumber].offsetBits; 77e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 784815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams size_t getFieldOffsetBytes(uint32_t componentNumber) const { 79e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return mFields[componentNumber].offsetBits >> 3; 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 822d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t getFieldOffsetBytesUnpadded(uint32_t componentNumber) const { 832d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return mFields[componentNumber].offsetBitsUnpadded >> 3; 842d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 852d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 864815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t getFieldCount() const {return mFieldCount;} 874815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams const Element * getField(uint32_t idx) const {return mFields[idx].e.get();} 8848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams const char * getFieldName(uint32_t idx) const {return mFields[idx].name;} 8939f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;} 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 91d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const Component & getComponent() const {return mComponent;} 92d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType getType() const {return mComponent.getType();} 93d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind getKind() const {return mComponent.getKind();} 944815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t getBits() const {return mBits;} 952d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t getBitsUnpadded() const {return mBitsUnpadded;} 96c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams uint32_t getVectorSize() const {return mComponent.getVectorSize();} 97e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 98d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams void dumpLOGV(const char *prefix) const; 99e3150cfb3edb028407669e4a65e087eae77e718cJason Sams virtual void serialize(Context *rsc, OStream *stream) const; 100b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; } 101fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk static Element *createFromStream(Context *rsc, IStream *stream); 1024815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 103c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static ObjectBaseRef<const Element> createRef(Context *rsc, 104c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataType dt, 105c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataKind dk, 106c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool isNorm, 107c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t vecSize); 108c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static ObjectBaseRef<const Element> createRef(Context *rsc, size_t count, 109c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **, 110c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **, 111c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const size_t * lengths, 112c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const uint32_t *asin); 113c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 114c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static const Element* create(Context *rsc, 115c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataType dt, 116c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDataKind dk, 117c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool isNorm, 118c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t vecSize) { 119c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> elem = createRef(rsc, dt, dk, isNorm, vecSize); 120c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk elem->incUserRef(); 121c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return elem.get(); 122c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 123c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk static const Element* create(Context *rsc, size_t count, 124c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **ein, 125c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **nin, 126f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams const size_t * lengths = NULL, 127f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams const uint32_t *asin = NULL) { 128c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin); 129c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk elem->incUserRef(); 130c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return elem.get(); 131c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 1324815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 133e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams void incRefs(const void *) const; 134e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams void decRefs(const void *) const; 135a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams virtual void callUpdateCacheObject(const Context *rsc, void *dstObj) const; 136e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bool getHasReferences() const {return mHasReference;} 137e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 138326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsprotected: 139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // deallocate any components that are part of this element. 140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void clear(); 141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams typedef struct { 14348ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams const char *name; 144d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams ObjectBaseRef<const Element> e; 145e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t offsetBits; 1462d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t offsetBitsUnpadded; 14746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams uint32_t arraySize; 1484815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } ElementField_t; 1494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ElementField_t *mFields; 1504815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams size_t mFieldCount; 151e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bool mHasReference; 1524815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 154c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk virtual ~Element(); 155e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams Element(Context *); 1564815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 157d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams Component mComponent; 1582d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t mBitsUnpadded; 1594815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t mBits; 16054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 16154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk void compute(); 162c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 163c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk virtual void preDestroy() const; 164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}; 165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 167326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsclass ElementState { 168326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic: 169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ElementState(); 170326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ~ElementState(); 171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1728154954868694e1f233d87d4933a474518b1cb81Jason Sams // Cache of all existing elements. 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Vector<Element *> mElements; 174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}; 175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif //ANDROID_STRUCTURED_ELEMENT_H 180