blob: c3ef25038d33f20b3787afa43cd338ea944227c7 [file] [log] [blame]
Jason Samsd19f10d2009-05-22 14:03:28 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_STRUCTURED_ELEMENT_H
18#define ANDROID_STRUCTURED_ELEMENT_H
19
Jason Sams718cd1f2009-12-23 14:35:29 -080020#include "rsComponent.h"
Jason Sams0011bcf2009-12-15 12:58:36 -080021#include "rsUtils.h"
22#include "rsObjectBase.h"
Jason Samsd19f10d2009-05-22 14:03:28 -070023
24// ---------------------------------------------------------------------------
25namespace android {
26namespace renderscript {
27
Jason Samsd19f10d2009-05-22 14:03:28 -070028// An element is a group of Components that occupies one cell in a structure.
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080029class Element : public ObjectBase {
Jason Samsd19f10d2009-05-22 14:03:28 -070030public:
Alex Sakhartchouk117abdb2011-08-16 13:09:46 -070031 class Builder {
32 public:
33 void add(const Element *e, const char *nameStr, uint32_t arraySize);
34 ObjectBaseRef<const Element> create(Context *rsc);
35 private:
36 Vector<ObjectBaseRef<const Element> > mBuilderElementRefs;
37 Vector<const Element *> mBuilderElements;
38 Vector<const char*> mBuilderNameStrings;
39 Vector<size_t> mBuilderNameLengths;
40 Vector<uint32_t> mBuilderArrays;
41 };
Jason Samse2ae85f2009-06-03 16:04:54 -070042 uint32_t getGLType() const;
43 uint32_t getGLFormat() const;
Jason Samsd19f10d2009-05-22 14:03:28 -070044
Jason Samsd19f10d2009-05-22 14:03:28 -070045 size_t getSizeBits() const;
Jason Sams1bada8c2009-08-09 17:01:55 -070046 size_t getSizeBytes() const {
47 return (getSizeBits() + 7) >> 3;
Jason Samsd19f10d2009-05-22 14:03:28 -070048 }
49
Jason Samsb28ca96f2010-08-09 18:13:33 -070050 size_t getFieldOffsetBits(uint32_t componentNumber) const {
51 return mFields[componentNumber].offsetBits;
52 }
Jason Sams0011bcf2009-12-15 12:58:36 -080053 size_t getFieldOffsetBytes(uint32_t componentNumber) const {
Jason Samsb28ca96f2010-08-09 18:13:33 -070054 return mFields[componentNumber].offsetBits >> 3;
Jason Samsd19f10d2009-05-22 14:03:28 -070055 }
56
Jason Sams0011bcf2009-12-15 12:58:36 -080057 uint32_t getFieldCount() const {return mFieldCount;}
58 const Element * getField(uint32_t idx) const {return mFields[idx].e.get();}
59 const char * getFieldName(uint32_t idx) const {return mFields[idx].name.string();}
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -070060 uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;}
Jason Samsd19f10d2009-05-22 14:03:28 -070061
Jason Sams718cd1f2009-12-23 14:35:29 -080062 const Component & getComponent() const {return mComponent;}
63 RsDataType getType() const {return mComponent.getType();}
Jason Sams718cd1f2009-12-23 14:35:29 -080064 RsDataKind getKind() const {return mComponent.getKind();}
Jason Sams0011bcf2009-12-15 12:58:36 -080065 uint32_t getBits() const {return mBits;}
Jason Sams718cd1f2009-12-23 14:35:29 -080066
Jason Sams3c0dfba2009-09-27 17:50:38 -070067 void dumpLOGV(const char *prefix) const;
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -070068 virtual void serialize(OStream *stream) const;
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -070069 virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; }
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -070070 static Element *createFromStream(Context *rsc, IStream *stream);
Jason Sams3c0dfba2009-09-27 17:50:38 -070071
Alex Sakhartchouk117abdb2011-08-16 13:09:46 -070072 static ObjectBaseRef<const Element> createRef(Context *rsc,
73 RsDataType dt,
74 RsDataKind dk,
75 bool isNorm,
76 uint32_t vecSize);
77 static ObjectBaseRef<const Element> createRef(Context *rsc, size_t count,
78 const Element **,
79 const char **,
80 const size_t * lengths,
81 const uint32_t *asin);
82
83 static const Element* create(Context *rsc,
84 RsDataType dt,
85 RsDataKind dk,
86 bool isNorm,
87 uint32_t vecSize) {
88 ObjectBaseRef<const Element> elem = createRef(rsc, dt, dk, isNorm, vecSize);
89 elem->incUserRef();
90 return elem.get();
91 }
92 static const Element* create(Context *rsc, size_t count,
93 const Element **ein,
94 const char **nin,
95 const size_t * lengths,
96 const uint32_t *asin) {
97 ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin);
98 elem->incUserRef();
99 return elem.get();
100 }
Jason Sams0011bcf2009-12-15 12:58:36 -0800101
Jason Samsb28ca96f2010-08-09 18:13:33 -0700102 void incRefs(const void *) const;
103 void decRefs(const void *) const;
104 bool getHasReferences() const {return mHasReference;}
105
Jason Samsd19f10d2009-05-22 14:03:28 -0700106protected:
107 // deallocate any components that are part of this element.
108 void clear();
109
Jason Sams0011bcf2009-12-15 12:58:36 -0800110 typedef struct {
111 String8 name;
Jason Sams718cd1f2009-12-23 14:35:29 -0800112 ObjectBaseRef<const Element> e;
Jason Samsb28ca96f2010-08-09 18:13:33 -0700113 uint32_t offsetBits;
Jason Sams70d4e502010-09-02 17:35:23 -0700114 uint32_t arraySize;
Jason Sams0011bcf2009-12-15 12:58:36 -0800115 } ElementField_t;
116 ElementField_t *mFields;
117 size_t mFieldCount;
Jason Samsb28ca96f2010-08-09 18:13:33 -0700118 bool mHasReference;
Jason Sams0011bcf2009-12-15 12:58:36 -0800119
Jason Samsd19f10d2009-05-22 14:03:28 -0700120
Alex Sakhartchouk117abdb2011-08-16 13:09:46 -0700121 virtual ~Element();
Jason Samsa9e7a052009-09-25 14:51:22 -0700122 Element(Context *);
Jason Sams0011bcf2009-12-15 12:58:36 -0800123
Jason Sams718cd1f2009-12-23 14:35:29 -0800124 Component mComponent;
Jason Sams0011bcf2009-12-15 12:58:36 -0800125 uint32_t mBits;
Alex Sakhartchouk9d71e212010-11-08 15:10:52 -0800126
127 void compute();
Alex Sakhartchouk117abdb2011-08-16 13:09:46 -0700128
129 virtual void preDestroy() const;
Jason Samsd19f10d2009-05-22 14:03:28 -0700130};
131
132
133class ElementState {
134public:
135 ElementState();
136 ~ElementState();
137
Alex Sakhartchoukc984dd72010-09-14 09:50:43 -0700138 void elementBuilderBegin();
139 void elementBuilderAdd(const Element *e, const char *nameStr, uint32_t arraySize);
140 const Element *elementBuilderCreate(Context *rsc);
141
Jason Samse4c487a2010-02-17 15:38:10 -0800142 // Cache of all existing elements.
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -0700143 Vector<Element *> mElements;
Alex Sakhartchoukc984dd72010-09-14 09:50:43 -0700144private:
145 Vector<const Element *> mBuilderElements;
146 Vector<const char*> mBuilderNameStrings;
147 Vector<size_t> mBuilderNameLengths;
148 Vector<uint32_t> mBuilderArrays;
Jason Samsd19f10d2009-05-22 14:03:28 -0700149};
150
151
152}
153}
154#endif //ANDROID_STRUCTURED_ELEMENT_H