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