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