#define FBD_TYPE (1)
#define FBD_MASK (~0x3f)
+/* ORed into an MFBD address to specify the fbx section is included */
+#define MALI_MFBD_TAG_EXTRA (0x2)
+
struct mali_uniform_buffer_meta {
/* This is actually the size minus 1 (MALI_POSITIVE), in units of 16
* bytes. This gives a maximum of 2^14 bytes, which just so happens to
#define MALI_DRAW_INDEXED_UINT8 (0x10)
#define MALI_DRAW_INDEXED_UINT16 (0x20)
#define MALI_DRAW_INDEXED_UINT32 (0x30)
+#define MALI_DRAW_INDEXED_SIZE (0x30)
+#define MALI_DRAW_INDEXED_SHIFT (4)
+
#define MALI_DRAW_VARYING_SIZE (0x100)
#define MALI_DRAW_PRIMITIVE_RESTART_FIXED_INDEX (0x10000)
/* For each pointer, there is an address and optionally also a stride */
#define MAX_ELEMENTS (2)
-/* Corresponds to the type passed to glTexImage2D and so forth */
+/* It's not known why there are 4-bits allocated -- this enum is almost
+ * certainly incomplete */
+
+enum mali_texture_layout {
+ /* For a Z/S texture, this is linear */
+ MALI_TEXTURE_TILED = 0x1,
+
+ /* Z/S textures cannot be tiled */
+ MALI_TEXTURE_LINEAR = 0x2,
-/* Flags for usage2 */
-#define MALI_TEX_MANUAL_STRIDE (0x20)
+ /* 16x16 sparse */
+ MALI_TEXTURE_AFBC = 0xC
+};
+
+/* Corresponds to the type passed to glTexImage2D and so forth */
struct mali_texture_format {
unsigned swizzle : 12;
unsigned unknown1 : 1;
enum mali_texture_type type : 2;
+ enum mali_texture_layout layout : 4;
+
+ /* Always set */
+ unsigned unknown2 : 1;
+
+ /* Set to allow packing an explicit stride */
+ unsigned manual_stride : 1;
- unsigned usage2 : 8;
+ unsigned zero : 2;
} __attribute__((packed));
struct mali_texture_descriptor {
uint8_t unknown3A;
/* Zero for non-mipmapped, (number of levels - 1) for mipmapped */
- uint8_t nr_mipmap_levels;
+ uint8_t levels;
/* Swizzling is a single 32-bit word, broken up here for convenience.
* Here, swizzling refers to the ES 3.0 texture parameters for channel
#define MALI_TILE_COORD_X(coord) ((coord) & MALI_X_COORD_MASK)
#define MALI_TILE_COORD_Y(coord) (((coord) & MALI_Y_COORD_MASK) >> 16)
-#define MALI_TILE_COORD_FLAGS(coord) ((coord) & ~(MALI_X_COORD_MASK | MALI_Y_COORD_MASK))
-
-/* No known flags yet, but just in case...? */
-
-#define MALI_TILE_NO_FLAG (0)
/* Helpers to generate tile coordinates based on the boundary coordinates in
* screen space. So, with the bounds (0, 0) to (128, 128) for the screen, these
u64 zero1;
- union {
- struct {
- /* Stuff related to ARM Framebuffer Compression. When AFBC is enabled,
- * there is an extra metadata buffer that contains 16 bytes per tile.
- * The framebuffer needs to be the same size as before, since we don't
- * know ahead of time how much space it will take up. The
- * framebuffer_stride is set to 0, since the data isn't stored linearly
- * anymore.
- */
-
- mali_ptr metadata;
- u32 stride; // stride in units of tiles
- u32 unk; // = 0x20000
- } afbc;
-
- struct {
- /* Heck if I know */
- u64 unk;
- mali_ptr pointer;
- } chunknown;
- };
+ struct {
+ /* Stuff related to ARM Framebuffer Compression. When AFBC is enabled,
+ * there is an extra metadata buffer that contains 16 bytes per tile.
+ * The framebuffer needs to be the same size as before, since we don't
+ * know ahead of time how much space it will take up. The
+ * framebuffer_stride is set to 0, since the data isn't stored linearly
+ * anymore.
+ *
+ * When AFBC is disabled, these fields are zero.
+ */
+
+ mali_ptr metadata;
+ u32 stride; // stride in units of tiles
+ u32 unk; // = 0x20000
+ } afbc;
mali_ptr framebuffer;