rs_structs.h revision ce5cb899cf40c3b6d6549410d9cdfcb5712fbf27
18e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk#ifndef _RS_CORE_H_
28e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk#define _RS_CORE_H_
38e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk
48e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk/*****************************************************************************
58e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * CAUTION
68e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
78e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * The following structure layout provides a more efficient way to access
88e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * internal members of the C++ class Allocation owned by librs. Unfortunately,
98e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * since this class has virtual members, we can't simply use offsetof() or any
108e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * other compiler trickery to dynamically get the appropriate values at
118e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * build-time. This layout may need to be updated whenever
128e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * frameworks/base/libs/rs/rsAllocation.h is modified.
138e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
148e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * Having the layout information available in this file allows us to
158e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * accelerate functionality like rsAllocationGetDimX(). Without this
168e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * information, we would not be able to inline the bitcode, thus resulting in
178e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * potential runtime performance penalties for tight loops operating on
188e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * allocations.
198e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
208e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *****************************************************************************/
218e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouktypedef enum {
228e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    RS_ALLOCATION_MIPMAP_NONE = 0,
238e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    RS_ALLOCATION_MIPMAP_FULL = 1,
248e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    RS_ALLOCATION_MIPMAP_ON_SYNC_TO_TEXTURE = 2
258e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk} rs_allocation_mipmap_control;
268e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk
278e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouktypedef struct Allocation {
288e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    char __pad[28];
298e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    struct {
308e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        void * drv;
318e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        struct {
328e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            const void *type;
338e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t usageFlags;
348e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_allocation_mipmap_control mipmapControl;
358e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t dimensionX;
368e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t dimensionY;
378e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t dimensionZ;
388e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t elementSizeBytes;
398e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            bool hasMipmaps;
408e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            bool hasFaces;
418e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            bool hasReferences;
428e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            void * usrPtr;
438e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            int32_t surfaceTextureID;
448e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            void * wndSurface;
459d0c4ac3620b32c4b312ceec6c3d07612a662870Jason Sams            void * surfaceTexture;
468e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        } state;
478e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk
488e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        struct DrvState {
498e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            void * mallocPtr;
50ce5cb899cf40c3b6d6549410d9cdfcb5712fbf27Jason Sams            uint32_t stride;
518e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        } drvState;
528e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    } mHal;
538e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk} Allocation_t;
548e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk
558e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk/*****************************************************************************
568e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * CAUTION
578e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
588e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * The following structure layout provides a more efficient way to access
598e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * internal members of the C++ class ProgramStore owned by librs. Unfortunately,
608e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * since this class has virtual members, we can't simply use offsetof() or any
618e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * other compiler trickery to dynamically get the appropriate values at
628e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * build-time. This layout may need to be updated whenever
638e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * frameworks/base/libs/rs/rsProgramStore.h is modified.
648e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
658e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * Having the layout information available in this file allows us to
668e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * accelerate functionality like rsgProgramStoreGetDepthFunc(). Without this
678e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * information, we would not be able to inline the bitcode, thus resulting in
688e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * potential runtime performance penalties for tight loops operating on
698e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * program store.
708e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
718e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *****************************************************************************/
728e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouktypedef struct ProgramStore {
738e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    char __pad[36];
748e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    struct {
758e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        struct {
768e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            bool ditherEnable;
778e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            bool colorRWriteEnable;
788e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            bool colorGWriteEnable;
798e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            bool colorBWriteEnable;
808e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            bool colorAWriteEnable;
818e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_blend_src_func blendSrc;
828e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_blend_dst_func blendDst;
838e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            bool depthWriteEnable;
848e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_depth_func depthFunc;
858e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        } state;
868e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    } mHal;
878e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk} ProgramStore_t;
888e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk
898e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk/*****************************************************************************
908e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * CAUTION
918e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
928e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * The following structure layout provides a more efficient way to access
938e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * internal members of the C++ class ProgramRaster owned by librs. Unfortunately,
948e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * since this class has virtual members, we can't simply use offsetof() or any
958e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * other compiler trickery to dynamically get the appropriate values at
968e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * build-time. This layout may need to be updated whenever
978e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * frameworks/base/libs/rs/rsProgramRaster.h is modified.
988e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
998e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * Having the layout information available in this file allows us to
1008e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * accelerate functionality like rsgProgramRasterGetCullMode(). Without this
1018e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * information, we would not be able to inline the bitcode, thus resulting in
1028e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * potential runtime performance penalties for tight loops operating on
1038e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * program raster.
1048e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
1058e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *****************************************************************************/
1068e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouktypedef struct ProgramRaster {
1078e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    char __pad[36];
1088e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    struct {
1098e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        struct {
1108e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            bool pointSprite;
1118e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_cull_mode cull;
1128e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        } state;
1138e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    } mHal;
1148e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk} ProgramRaster_t;
1158e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk
1168e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk/*****************************************************************************
1178e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * CAUTION
1188e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
1198e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * The following structure layout provides a more efficient way to access
1208e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * internal members of the C++ class Sampler owned by librs. Unfortunately,
1218e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * since this class has virtual members, we can't simply use offsetof() or any
1228e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * other compiler trickery to dynamically get the appropriate values at
1238e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * build-time. This layout may need to be updated whenever
1248e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * frameworks/base/libs/rs/rsSampler.h is modified.
1258e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
1268e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * Having the layout information available in this file allows us to
1278e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * accelerate functionality like rsgProgramRasterGetMagFilter(). Without this
1288e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * information, we would not be able to inline the bitcode, thus resulting in
1298e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * potential runtime performance penalties for tight loops operating on
1308e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * samplers.
1318e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
1328e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *****************************************************************************/
1338e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouktypedef struct Sampler {
1348e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    char __pad[32];
1358e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    struct {
1368e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        struct {
1378e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_sampler_value magFilter;
1388e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_sampler_value minFilter;
1398e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_sampler_value wrapS;
1408e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_sampler_value wrapT;
1418e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_sampler_value wrapR;
1428e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            float aniso;
1438e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        } state;
1448e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    } mHal;
1458e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk} Sampler_t;
1468e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk
1478e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk/*****************************************************************************
1488e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * CAUTION
1498e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
1508e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * The following structure layout provides a more efficient way to access
1518e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * internal members of the C++ class Element owned by librs. Unfortunately,
1528e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * since this class has virtual members, we can't simply use offsetof() or any
1538e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * other compiler trickery to dynamically get the appropriate values at
1548e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * build-time. This layout may need to be updated whenever
1558e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * frameworks/base/libs/rs/rsElement.h is modified.
1568e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
1578e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * Having the layout information available in this file allows us to
1588e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * accelerate functionality like rsElementGetSubElementCount(). Without this
1598e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * information, we would not be able to inline the bitcode, thus resulting in
1608e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * potential runtime performance penalties for tight loops operating on
1618e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * elements.
1628e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
1638e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *****************************************************************************/
1648e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouktypedef struct Element {
1658e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    char __pad[28];
1668e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    struct {
1678e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        void *drv;
1688e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        struct {
1698e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_data_type dataType;
1708e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_data_kind dataKind;
1718e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t vectorSize;
1728e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t elementSizeBytes;
1738e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk
1748e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            // Subelements
1758e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            const void **fields;
1768e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t *fieldArraySizes;
1778e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            const char **fieldNames;
1788e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t *fieldNameLengths;
1798e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t *fieldOffsetBytes;
1808e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t fieldsCount;
1818e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        } state;
1828e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    } mHal;
1838e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk} Element_t;
1848e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk
1858e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk/*****************************************************************************
1868e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * CAUTION
1878e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
1888e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * The following structure layout provides a more efficient way to access
1898e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * internal members of the C++ class Type owned by librs. Unfortunately,
1908e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * since this class has virtual members, we can't simply use offsetof() or any
1918e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * other compiler trickery to dynamically get the appropriate values at
1928e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * build-time. This layout may need to be updated whenever
1938e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * frameworks/base/libs/rs/rsType.h is modified.
1948e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
1958e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * Having the layout information available in this file allows us to
1968e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * accelerate functionality like rsAllocationGetElement(). Without this
1978e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * information, we would not be able to inline the bitcode, thus resulting in
1988e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * potential runtime performance penalties for tight loops operating on
1998e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * types.
2008e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
2018e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *****************************************************************************/
2028e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouktypedef struct Type {
2038e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    char __pad[28];
2048e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    struct {
2058e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        void *drv;
2068e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        struct {
2078e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            const void * element;
2088e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t dimX;
2098e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t dimY;
2108e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t dimZ;
2118e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t *lodDimX;
2128e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t *lodDimY;
2138e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t *lodDimZ;
2148e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t *lodOffset;
2158e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t lodCount;
2168e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            bool faces;
2178e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        } state;
2188e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    } mHal;
2198e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk} Type_t;
2208e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk
2218e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk/*****************************************************************************
2228e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * CAUTION
2238e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
2248e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * The following structure layout provides a more efficient way to access
2258e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * internal members of the C++ class Mesh owned by librs. Unfortunately,
2268e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * since this class has virtual members, we can't simply use offsetof() or any
2278e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * other compiler trickery to dynamically get the appropriate values at
2288e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * build-time. This layout may need to be updated whenever
2298e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * frameworks/base/libs/rs/rsMesh.h is modified.
2308e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
2318e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * Having the layout information available in this file allows us to
2328e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * accelerate functionality like rsMeshGetVertexAllocationCount(). Without this
2338e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * information, we would not be able to inline the bitcode, thus resulting in
2348e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * potential runtime performance penalties for tight loops operating on
2358e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk * meshes.
2368e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *
2378e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk *****************************************************************************/
2388e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouktypedef struct Mesh {
2398e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    char __pad[28];
2408e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    struct {
2418e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        void *drv;
2428e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        struct {
2438e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            void **vertexBuffers;
2448e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t vertexBuffersCount;
2458e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk
2468e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            // indexBuffers[i] could be NULL, in which case only primitives[i] is used
2478e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            void **indexBuffers;
2488e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t indexBuffersCount;
2498e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            rs_primitive *primitives;
2508e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk            uint32_t primitivesCount;
2518e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk        } state;
2528e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk    } mHal;
2538e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk} Mesh_t;
2548e7b2839549af7aa96da2ba503238a245e08c2b3Alex Sakhartchouk#endif // _RS_CORE_H_
255