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