1 #ifndef _RS_STRUCTS_H_
2 #define _RS_STRUCTS_H_
3 
4 #include "rs_core.rsh"
5 #include "rs_graphics.rsh"
6 
7 /*****************************************************************************
8  * CAUTION
9  *
10  * The following structure layout provides a more efficient way to access
11  * internal members of the C++ class Allocation owned by librs. Unfortunately,
12  * since this class has virtual members, we can't simply use offsetof() or any
13  * other compiler trickery to dynamically get the appropriate values at
14  * build-time. This layout may need to be updated whenever
15  * frameworks/base/libs/rs/rsAllocation.h is modified.
16  *
17  * Having the layout information available in this file allows us to
18  * accelerate functionality like rsAllocationGetDimX(). Without this
19  * information, we would not be able to inline the bitcode, thus resulting in
20  * potential runtime performance penalties for tight loops operating on
21  * allocations.
22  *
23  *****************************************************************************/
24 typedef enum {
25     RS_ALLOCATION_MIPMAP_NONE = 0,
26     RS_ALLOCATION_MIPMAP_FULL = 1,
27     RS_ALLOCATION_MIPMAP_ON_SYNC_TO_TEXTURE = 2
28 } rs_allocation_mipmap_control;
29 
30 typedef struct Allocation {
31 #ifndef __LP64__
32     char __pad[32];
33 #else
34     char __pad[56];
35 #endif
36     struct {
37         void * drv;
38         struct {
39             const void *type;
40             uint32_t usageFlags;
41             rs_allocation_mipmap_control mipmapControl;
42             uint32_t yuv;
43             uint32_t elementSizeBytes;
44             bool hasMipmaps;
45             bool hasFaces;
46             bool hasReferences;
47             void * usrPtr;
48             int32_t surfaceTextureID;
49             void * nativeBuffer;
50             int64_t timestamp;
51 
52             // Allocation adapter state
53             const void *baseAlloc;
54             uint32_t originX;
55             uint32_t originY;
56             uint32_t originZ;
57             uint32_t originLOD;
58             uint32_t originFace;
59             uint32_t originArray[4/*Type::mMaxArrays*/];
60         } state;
61 
62         struct DrvState {
63             struct LodState {
64                 void * mallocPtr;
65                 size_t stride;
66                 uint32_t dimX;
67                 uint32_t dimY;
68                 uint32_t dimZ;
69             } lod[16/*android::renderscript::Allocation::MAX_LOD*/];
70             size_t faceOffset;
71             uint32_t lodCount;
72             uint32_t faceCount;
73 
74             struct YuvState {
75                 uint32_t shift;
76                 uint32_t step;
77             } yuv;
78 
79             int grallocFlags;
80             uint32_t dimArray[4/*Type::mMaxArrays*/];
81         } drvState;
82     } mHal;
83 } Allocation_t;
84 
85 #ifndef __LP64__
86 /*****************************************************************************
87  * CAUTION
88  *
89  * The following structure layout provides a more efficient way to access
90  * internal members of the C++ class ProgramStore owned by librs. Unfortunately,
91  * since this class has virtual members, we can't simply use offsetof() or any
92  * other compiler trickery to dynamically get the appropriate values at
93  * build-time. This layout may need to be updated whenever
94  * frameworks/base/libs/rs/rsProgramStore.h is modified.
95  *
96  * Having the layout information available in this file allows us to
97  * accelerate functionality like rsgProgramStoreGetDepthFunc(). Without this
98  * information, we would not be able to inline the bitcode, thus resulting in
99  * potential runtime performance penalties for tight loops operating on
100  * program store.
101  *
102  *****************************************************************************/
103 typedef struct ProgramStore {
104     char __pad[40];
105     struct {
106         struct {
107             bool ditherEnable;
108             bool colorRWriteEnable;
109             bool colorGWriteEnable;
110             bool colorBWriteEnable;
111             bool colorAWriteEnable;
112             rs_blend_src_func blendSrc;
113             rs_blend_dst_func blendDst;
114             bool depthWriteEnable;
115             rs_depth_func depthFunc;
116         } state;
117     } mHal;
118 } ProgramStore_t;
119 
120 /*****************************************************************************
121  * CAUTION
122  *
123  * The following structure layout provides a more efficient way to access
124  * internal members of the C++ class ProgramRaster owned by librs. Unfortunately,
125  * since this class has virtual members, we can't simply use offsetof() or any
126  * other compiler trickery to dynamically get the appropriate values at
127  * build-time. This layout may need to be updated whenever
128  * frameworks/base/libs/rs/rsProgramRaster.h is modified.
129  *
130  * Having the layout information available in this file allows us to
131  * accelerate functionality like rsgProgramRasterGetCullMode(). Without this
132  * information, we would not be able to inline the bitcode, thus resulting in
133  * potential runtime performance penalties for tight loops operating on
134  * program raster.
135  *
136  *****************************************************************************/
137 typedef struct ProgramRaster {
138     char __pad[36];
139     struct {
140         void * drv;
141         struct {
142             bool pointSprite;
143             rs_cull_mode cull;
144         } state;
145     } mHal;
146 } ProgramRaster_t;
147 #endif //__LP64__
148 
149 /*****************************************************************************
150  * CAUTION
151  *
152  * The following structure layout provides a more efficient way to access
153  * internal members of the C++ class Sampler owned by librs. Unfortunately,
154  * since this class has virtual members, we can't simply use offsetof() or any
155  * other compiler trickery to dynamically get the appropriate values at
156  * build-time. This layout may need to be updated whenever
157  * frameworks/base/libs/rs/rsSampler.h is modified.
158  *
159  * Having the layout information available in this file allows us to
160  * accelerate functionality like rsgProgramRasterGetMagFilter(). Without this
161  * information, we would not be able to inline the bitcode, thus resulting in
162  * potential runtime performance penalties for tight loops operating on
163  * samplers.
164  *
165  *****************************************************************************/
166 typedef struct Sampler {
167 #ifndef __LP64__
168     char __pad[32];
169 #else
170     char __pad[56];
171 #endif
172     struct {
173         void *drv;
174         struct {
175             rs_sampler_value magFilter;
176             rs_sampler_value minFilter;
177             rs_sampler_value wrapS;
178             rs_sampler_value wrapT;
179             rs_sampler_value wrapR;
180             float aniso;
181         } state;
182     } mHal;
183 } Sampler_t;
184 
185 /*****************************************************************************
186  * CAUTION
187  *
188  * The following structure layout provides a more efficient way to access
189  * internal members of the C++ class Element owned by librs. Unfortunately,
190  * since this class has virtual members, we can't simply use offsetof() or any
191  * other compiler trickery to dynamically get the appropriate values at
192  * build-time. This layout may need to be updated whenever
193  * frameworks/base/libs/rs/rsElement.h is modified.
194  *
195  * Having the layout information available in this file allows us to
196  * accelerate functionality like rsElementGetSubElementCount(). Without this
197  * information, we would not be able to inline the bitcode, thus resulting in
198  * potential runtime performance penalties for tight loops operating on
199  * elements.
200  *
201  *****************************************************************************/
202 typedef struct Element {
203 #ifndef __LP64__
204     char __pad[32];
205 #else
206     char __pad[56];
207 #endif
208     struct {
209         void *drv;
210         struct {
211             rs_data_type dataType;
212             rs_data_kind dataKind;
213             uint32_t vectorSize;
214             uint32_t elementSizeBytes;
215 
216             // Subelements
217             const void **fields;
218             uint32_t *fieldArraySizes;
219             const char **fieldNames;
220             uint32_t *fieldNameLengths;
221             uint32_t *fieldOffsetBytes;
222             uint32_t fieldsCount;
223         } state;
224     } mHal;
225 } Element_t;
226 
227 /*****************************************************************************
228  * CAUTION
229  *
230  * The following structure layout provides a more efficient way to access
231  * internal members of the C++ class Type owned by librs. Unfortunately,
232  * since this class has virtual members, we can't simply use offsetof() or any
233  * other compiler trickery to dynamically get the appropriate values at
234  * build-time. This layout may need to be updated whenever
235  * frameworks/base/libs/rs/rsType.h is modified.
236  *
237  * Having the layout information available in this file allows us to
238  * accelerate functionality like rsAllocationGetElement(). Without this
239  * information, we would not be able to inline the bitcode, thus resulting in
240  * potential runtime performance penalties for tight loops operating on
241  * types.
242  *
243  *****************************************************************************/
244 typedef struct Type {
245 #ifndef __LP64__
246     char __pad[32];
247 #else
248     char __pad[56];
249 #endif
250     struct {
251         void *drv;
252         struct {
253             const void * element;
254             uint32_t dimX;
255             uint32_t dimY;
256             uint32_t dimZ;
257             uint32_t *lodDimX;
258             uint32_t *lodDimY;
259             uint32_t *lodDimZ;
260             uint32_t *arrays;
261             uint32_t lodCount;
262             uint32_t dimYuv;
263             uint32_t arrayCount;
264             bool faces;
265         } state;
266     } mHal;
267 } Type_t;
268 
269 #ifndef __LP64__
270 /*****************************************************************************
271  * CAUTION
272  *
273  * The following structure layout provides a more efficient way to access
274  * internal members of the C++ class Mesh owned by librs. Unfortunately,
275  * since this class has virtual members, we can't simply use offsetof() or any
276  * other compiler trickery to dynamically get the appropriate values at
277  * build-time. This layout may need to be updated whenever
278  * frameworks/base/libs/rs/rsMesh.h is modified.
279  *
280  * Having the layout information available in this file allows us to
281  * accelerate functionality like rsMeshGetVertexAllocationCount(). Without this
282  * information, we would not be able to inline the bitcode, thus resulting in
283  * potential runtime performance penalties for tight loops operating on
284  * meshes.
285  *
286  *****************************************************************************/
287 typedef struct Mesh {
288     char __pad[32];
289     struct {
290         void *drv;
291         struct {
292             void **vertexBuffers;
293             uint32_t vertexBuffersCount;
294 
295             // indexBuffers[i] could be nullptr, in which case only primitives[i] is used
296             void **indexBuffers;
297             uint32_t indexBuffersCount;
298             rs_primitive *primitives;
299             uint32_t primitivesCount;
300         } state;
301     } mHal;
302 } Mesh_t;
303 #endif //__LP64__
304 
305 // Null version of _RS_OBJECT_DECL defined in script_api/rs_object_types.spec
306 #ifndef __LP64__
307 #define RS_NULL_OBJ {0}
308 #else
309 #define RS_NULL_OBJ {0, 0, 0, 0}
310 #endif //__LP64__
311 
312 #endif // _RS_CORE_H_
313