1
2/* Generated code, see midgard.xml and gen_pack_header.py
3 *
4 * Packets, enums and structures for Panfrost.
5 *
6 * This file has been generated, do not hand edit.
7 */
8
9#ifndef PAN_PACK_H
10#define PAN_PACK_H
11
12#include <stdio.h>
13#include <stdint.h>
14#include <stdbool.h>
15#include <assert.h>
16#include <math.h>
17#include <inttypes.h>
18#include "util/macros.h"
19#include "util/u_math.h"
20
21#define __gen_unpack_float(x, y, z) uif(__gen_unpack_uint(x, y, z))
22
23static inline uint64_t
24__gen_uint(uint64_t v, uint32_t start, uint32_t end)
25{
26#ifndef NDEBUG
27   const int width = end - start + 1;
28   if (width < 64) {
29      const uint64_t max = (1ull << width) - 1;
30      assert(v <= max);
31   }
32#endif
33
34   return v << start;
35}
36
37static inline uint32_t
38__gen_sint(int32_t v, uint32_t start, uint32_t end)
39{
40#ifndef NDEBUG
41   const int width = end - start + 1;
42   if (width < 64) {
43      const int64_t max = (1ll << (width - 1)) - 1;
44      const int64_t min = -(1ll << (width - 1));
45      assert(min <= v && v <= max);
46   }
47#endif
48
49   return (((uint32_t) v) << start) & ((2ll << end) - 1);
50}
51
52static inline uint32_t
53__gen_padded(uint32_t v, uint32_t start, uint32_t end)
54{
55    unsigned shift = __builtin_ctz(v);
56    unsigned odd = v >> (shift + 1);
57
58#ifndef NDEBUG
59    assert((v >> shift) & 1);
60    assert(shift <= 31);
61    assert(odd <= 7);
62    assert((end - start + 1) == 8);
63#endif
64
65    return __gen_uint(shift | (odd << 5), start, end);
66}
67
68
69static inline uint64_t
70__gen_unpack_uint(const uint8_t *restrict cl, uint32_t start, uint32_t end)
71{
72   uint64_t val = 0;
73   const int width = end - start + 1;
74   const uint64_t mask = (width == 64 ? ~0 : (1ull << width) - 1 );
75
76   for (uint32_t byte = start / 8; byte <= end / 8; byte++) {
77      val |= ((uint64_t) cl[byte]) << ((byte - start / 8) * 8);
78   }
79
80   return (val >> (start % 8)) & mask;
81}
82
83static inline uint64_t
84__gen_unpack_sint(const uint8_t *restrict cl, uint32_t start, uint32_t end)
85{
86   int size = end - start + 1;
87   int64_t val = __gen_unpack_uint(cl, start, end);
88
89   /* Get the sign bit extended. */
90   return (val << (64 - size)) >> (64 - size);
91}
92
93static inline uint64_t
94__gen_unpack_padded(const uint8_t *restrict cl, uint32_t start, uint32_t end)
95{
96   unsigned val = __gen_unpack_uint(cl, start, end);
97   unsigned shift = val & 0b11111;
98   unsigned odd = val >> 5;
99
100   return (2*odd + 1) << shift;
101}
102
103#define PREFIX1(A) MALI_ ## A
104#define PREFIX2(A, B) MALI_ ## A ## _ ## B
105#define PREFIX4(A, B, C, D) MALI_ ## A ## _ ## B ## _ ## C ## _ ## D
106
107#define pan_prepare(dst, T)                                 \
108   *(dst) = (struct PREFIX1(T)){ PREFIX2(T, header) }
109
110#define pan_pack(dst, T, name)                              \
111   for (struct PREFIX1(T) name = { PREFIX2(T, header) }, \
112        *_loop_terminate = (void *) (dst);                  \
113        __builtin_expect(_loop_terminate != NULL, 1);       \
114        ({ PREFIX2(T, pack)((uint32_t *) (dst), &name);  \
115           _loop_terminate = NULL; }))
116
117#define pan_unpack(src, T, name)                        \
118        struct PREFIX1(T) name;                         \
119        PREFIX2(T, unpack)((uint8_t *)(src), &name)
120
121#define pan_print(fp, T, var, indent)                   \
122        PREFIX2(T, print)(fp, &(var), indent)
123
124#define pan_size(T) PREFIX2(T, LENGTH)
125#define pan_alignment(T) PREFIX2(T, ALIGN)
126
127#define pan_section_offset(A, S) \
128        PREFIX4(A, SECTION, S, OFFSET)
129
130#define pan_section_ptr(base, A, S) \
131        ((void *)((uint8_t *)(base) + pan_section_offset(A, S)))
132
133#define pan_section_pack(dst, A, S, name)                                                         \
134   for (PREFIX4(A, SECTION, S, TYPE) name = { PREFIX4(A, SECTION, S, header) }, \
135        *_loop_terminate = (void *) (dst);                                                        \
136        __builtin_expect(_loop_terminate != NULL, 1);                                             \
137        ({ PREFIX4(A, SECTION, S, pack) (pan_section_ptr(dst, A, S), &name);              \
138           _loop_terminate = NULL; }))
139
140#define pan_section_unpack(src, A, S, name)                               \
141        PREFIX4(A, SECTION, S, TYPE) name;                             \
142        PREFIX4(A, SECTION, S, unpack)(pan_section_ptr(src, A, S), &name)
143
144#define pan_section_print(fp, A, S, var, indent)                          \
145        PREFIX4(A, SECTION, S, print)(fp, &(var), indent)
146
147#define pan_merge(packed1, packed2, type)         do {                 for (unsigned i = 0; i < (PREFIX2(type, LENGTH) / 4); ++i)                         (packed1).opaque[i] |= (packed2).opaque[i];         } while(0)
148
149/* From presentations, 16x16 tiles externally. Use shift for fast computation
150 * of tile numbers. */
151
152#define MALI_TILE_SHIFT 4
153#define MALI_TILE_LENGTH (1 << MALI_TILE_SHIFT)
154
155
156
157
158#define mali_pixel_format_print(fp, format) \
159    fprintf(fp, "%*sFormat (v7): %s%s %s%s\n", indent, "", \
160        mali_format_as_str((enum mali_format)((format >> 12) & 0xFF)), \
161        (format & (1 << 20)) ? " sRGB" : "", \
162        mali_rgb_component_order_as_str((enum mali_rgb_component_order)(format & ((1 << 12) - 1))), \
163        (format & (1 << 21)) ? " XXX BAD BIT" : "");
164
165
166enum mali_attribute_type {
167        MALI_ATTRIBUTE_TYPE_1D               =      1,
168        MALI_ATTRIBUTE_TYPE_1D_POT_DIVISOR   =      2,
169        MALI_ATTRIBUTE_TYPE_1D_MODULUS       =      3,
170        MALI_ATTRIBUTE_TYPE_1D_NPOT_DIVISOR  =      4,
171        MALI_ATTRIBUTE_TYPE_3D_LINEAR        =      5,
172        MALI_ATTRIBUTE_TYPE_3D_INTERLEAVED   =      6,
173        MALI_ATTRIBUTE_TYPE_1D_PRIMITIVE_INDEX_BUFFER =      7,
174        MALI_ATTRIBUTE_TYPE_1D_POT_DIVISOR_WRITE_REDUCTION =     10,
175        MALI_ATTRIBUTE_TYPE_1D_MODULUS_WRITE_REDUCTION =     11,
176        MALI_ATTRIBUTE_TYPE_1D_NPOT_DIVISOR_WRITE_REDUCTION =     12,
177        MALI_ATTRIBUTE_TYPE_CONTINUATION     =     32,
178};
179
180static inline const char *
181mali_attribute_type_as_str(enum mali_attribute_type imm)
182{
183    switch (imm) {
184    case MALI_ATTRIBUTE_TYPE_1D: return "1D";
185    case MALI_ATTRIBUTE_TYPE_1D_POT_DIVISOR: return "1D POT Divisor";
186    case MALI_ATTRIBUTE_TYPE_1D_MODULUS: return "1D Modulus";
187    case MALI_ATTRIBUTE_TYPE_1D_NPOT_DIVISOR: return "1D NPOT Divisor";
188    case MALI_ATTRIBUTE_TYPE_3D_LINEAR: return "3D Linear";
189    case MALI_ATTRIBUTE_TYPE_3D_INTERLEAVED: return "3D Interleaved";
190    case MALI_ATTRIBUTE_TYPE_1D_PRIMITIVE_INDEX_BUFFER: return "1D Primitive Index Buffer";
191    case MALI_ATTRIBUTE_TYPE_1D_POT_DIVISOR_WRITE_REDUCTION: return "1D POT Divisor Write Reduction";
192    case MALI_ATTRIBUTE_TYPE_1D_MODULUS_WRITE_REDUCTION: return "1D Modulus Write Reduction";
193    case MALI_ATTRIBUTE_TYPE_1D_NPOT_DIVISOR_WRITE_REDUCTION: return "1D NPOT Divisor Write Reduction";
194    case MALI_ATTRIBUTE_TYPE_CONTINUATION: return "Continuation";
195    default: return "XXX: INVALID";
196    }
197}
198
199enum mali_channel {
200        MALI_CHANNEL_R                       =      0,
201        MALI_CHANNEL_G                       =      1,
202        MALI_CHANNEL_B                       =      2,
203        MALI_CHANNEL_A                       =      3,
204        MALI_CHANNEL_0                       =      4,
205        MALI_CHANNEL_1                       =      5,
206};
207
208static inline const char *
209mali_channel_as_str(enum mali_channel imm)
210{
211    switch (imm) {
212    case MALI_CHANNEL_R: return "R";
213    case MALI_CHANNEL_G: return "G";
214    case MALI_CHANNEL_B: return "B";
215    case MALI_CHANNEL_A: return "A";
216    case MALI_CHANNEL_0: return "0";
217    case MALI_CHANNEL_1: return "1";
218    default: return "XXX: INVALID";
219    }
220}
221
222enum mali_depth_source {
223        MALI_DEPTH_SOURCE_MINIMUM            =      0,
224        MALI_DEPTH_SOURCE_MAXIMUM            =      1,
225        MALI_DEPTH_SOURCE_FIXED_FUNCTION     =      2,
226        MALI_DEPTH_SOURCE_SHADER             =      3,
227};
228
229static inline const char *
230mali_depth_source_as_str(enum mali_depth_source imm)
231{
232    switch (imm) {
233    case MALI_DEPTH_SOURCE_MINIMUM: return "Minimum";
234    case MALI_DEPTH_SOURCE_MAXIMUM: return "Maximum";
235    case MALI_DEPTH_SOURCE_FIXED_FUNCTION: return "Fixed function";
236    case MALI_DEPTH_SOURCE_SHADER: return "Shader";
237    default: return "XXX: INVALID";
238    }
239}
240
241enum mali_job_type {
242        MALI_JOB_TYPE_NOT_STARTED            =      0,
243        MALI_JOB_TYPE_NULL                   =      1,
244        MALI_JOB_TYPE_WRITE_VALUE            =      2,
245        MALI_JOB_TYPE_CACHE_FLUSH            =      3,
246        MALI_JOB_TYPE_COMPUTE                =      4,
247        MALI_JOB_TYPE_VERTEX                 =      5,
248        MALI_JOB_TYPE_GEOMETRY               =      6,
249        MALI_JOB_TYPE_TILER                  =      7,
250        MALI_JOB_TYPE_FUSED                  =      8,
251        MALI_JOB_TYPE_FRAGMENT               =      9,
252        MALI_JOB_TYPE_INDEXED_VERTEX         =     10,
253};
254
255static inline const char *
256mali_job_type_as_str(enum mali_job_type imm)
257{
258    switch (imm) {
259    case MALI_JOB_TYPE_NOT_STARTED: return "Not started";
260    case MALI_JOB_TYPE_NULL: return "Null";
261    case MALI_JOB_TYPE_WRITE_VALUE: return "Write value";
262    case MALI_JOB_TYPE_CACHE_FLUSH: return "Cache flush";
263    case MALI_JOB_TYPE_COMPUTE: return "Compute";
264    case MALI_JOB_TYPE_VERTEX: return "Vertex";
265    case MALI_JOB_TYPE_GEOMETRY: return "Geometry";
266    case MALI_JOB_TYPE_TILER: return "Tiler";
267    case MALI_JOB_TYPE_FUSED: return "Fused";
268    case MALI_JOB_TYPE_FRAGMENT: return "Fragment";
269    case MALI_JOB_TYPE_INDEXED_VERTEX: return "Indexed Vertex";
270    default: return "XXX: INVALID";
271    }
272}
273
274enum mali_draw_mode {
275        MALI_DRAW_MODE_NONE                  =      0,
276        MALI_DRAW_MODE_POINTS                =      1,
277        MALI_DRAW_MODE_LINES                 =      2,
278        MALI_DRAW_MODE_LINE_STRIP            =      4,
279        MALI_DRAW_MODE_LINE_LOOP             =      6,
280        MALI_DRAW_MODE_TRIANGLES             =      8,
281        MALI_DRAW_MODE_TRIANGLE_STRIP        =     10,
282        MALI_DRAW_MODE_TRIANGLE_FAN          =     12,
283        MALI_DRAW_MODE_POLYGON               =     13,
284        MALI_DRAW_MODE_QUADS                 =     14,
285};
286
287static inline const char *
288mali_draw_mode_as_str(enum mali_draw_mode imm)
289{
290    switch (imm) {
291    case MALI_DRAW_MODE_NONE: return "None";
292    case MALI_DRAW_MODE_POINTS: return "Points";
293    case MALI_DRAW_MODE_LINES: return "Lines";
294    case MALI_DRAW_MODE_LINE_STRIP: return "Line strip";
295    case MALI_DRAW_MODE_LINE_LOOP: return "Line loop";
296    case MALI_DRAW_MODE_TRIANGLES: return "Triangles";
297    case MALI_DRAW_MODE_TRIANGLE_STRIP: return "Triangle strip";
298    case MALI_DRAW_MODE_TRIANGLE_FAN: return "Triangle fan";
299    case MALI_DRAW_MODE_POLYGON: return "Polygon";
300    case MALI_DRAW_MODE_QUADS: return "Quads";
301    default: return "XXX: INVALID";
302    }
303}
304
305enum mali_exception_access {
306        MALI_EXCEPTION_ACCESS_NONE           =      0,
307        MALI_EXCEPTION_ACCESS_EXECUTE        =      2,
308        MALI_EXCEPTION_ACCESS_READ           =      1,
309        MALI_EXCEPTION_ACCESS_WRITE          =      3,
310};
311
312static inline const char *
313mali_exception_access_as_str(enum mali_exception_access imm)
314{
315    switch (imm) {
316    case MALI_EXCEPTION_ACCESS_NONE: return "None";
317    case MALI_EXCEPTION_ACCESS_EXECUTE: return "Execute";
318    case MALI_EXCEPTION_ACCESS_READ: return "Read";
319    case MALI_EXCEPTION_ACCESS_WRITE: return "Write";
320    default: return "XXX: INVALID";
321    }
322}
323
324enum mali_func {
325        MALI_FUNC_NEVER                      =      0,
326        MALI_FUNC_LESS                       =      1,
327        MALI_FUNC_EQUAL                      =      2,
328        MALI_FUNC_LEQUAL                     =      3,
329        MALI_FUNC_GREATER                    =      4,
330        MALI_FUNC_NOT_EQUAL                  =      5,
331        MALI_FUNC_GEQUAL                     =      6,
332        MALI_FUNC_ALWAYS                     =      7,
333};
334
335static inline const char *
336mali_func_as_str(enum mali_func imm)
337{
338    switch (imm) {
339    case MALI_FUNC_NEVER: return "Never";
340    case MALI_FUNC_LESS: return "Less";
341    case MALI_FUNC_EQUAL: return "Equal";
342    case MALI_FUNC_LEQUAL: return "Lequal";
343    case MALI_FUNC_GREATER: return "Greater";
344    case MALI_FUNC_NOT_EQUAL: return "Not Equal";
345    case MALI_FUNC_GEQUAL: return "Gequal";
346    case MALI_FUNC_ALWAYS: return "Always";
347    default: return "XXX: INVALID";
348    }
349}
350
351enum mali_format {
352        MALI_ETC2_RGB8                       =      1,
353        MALI_ETC2_R11_UNORM                  =      2,
354        MALI_ETC2_RGBA8                      =      3,
355        MALI_ETC2_RG11_UNORM                 =      4,
356        MALI_R4A4_UNORM                      =      5,
357        MALI_A4R4_UNORM                      =      6,
358        MALI_BC1_UNORM                       =      7,
359        MALI_BC2_UNORM                       =      8,
360        MALI_BC3_UNORM                       =      9,
361        MALI_BC4_UNORM                       =     10,
362        MALI_BC4_SNORM                       =     11,
363        MALI_BC5_UNORM                       =     12,
364        MALI_BC5_SNORM                       =     13,
365        MALI_BC6H_UF16                       =     14,
366        MALI_BC6H_SF16                       =     15,
367        MALI_BC7_UNORM                       =     16,
368        MALI_ETC2_R11_SNORM                  =     17,
369        MALI_ETC2_RG11_SNORM                 =     18,
370        MALI_ETC2_RGB8A1                     =     19,
371        MALI_ASTC_3D_LDR                     =     20,
372        MALI_ASTC_3D_HDR                     =     21,
373        MALI_ASTC_2D_LDR                     =     22,
374        MALI_ASTC_2D_HDR                     =     23,
375        MALI_R8A8_UNORM                      =     24,
376        MALI_A8R8_UNORM                      =     25,
377        MALI_A8_UNORM                        =     26,
378        MALI_RAW10                           =     28,
379        MALI_RAW12                           =     29,
380        MALI_R8G8B8G8                        =     30,
381        MALI_G8R8G8B8                        =     31,
382        MALI_YUV8                            =     32,
383        MALI_YUVA8                           =     33,
384        MALI_YUYV8                           =     34,
385        MALI_VYUY8                           =     35,
386        MALI_Y8_UV8_422                      =     36,
387        MALI_Y8_U8_V8_422                    =     37,
388        MALI_Y8_UV8_420                      =     38,
389        MALI_Y8_U8_V8_420                    =     39,
390        MALI_YUV10_A2                        =     40,
391        MALI_A2_YUV10                        =     41,
392        MALI_YUYAAYVYAA                      =     42,
393        MALI_YUYV10                          =     44,
394        MALI_VYUY10                          =     45,
395        MALI_Y10_UV10_422                    =     46,
396        MALI_Y10_UV10_420                    =     47,
397        MALI_YUV16                           =     48,
398        MALI_YUVA16                          =     49,
399        MALI_YUYV16                          =     50,
400        MALI_VYUY16                          =     51,
401        MALI_Y10X6_U10X6V10X6_422            =     52,
402        MALI_Y16_UV16_422                    =     53,
403        MALI_Y10X6_U10X6V10X6_420            =     54,
404        MALI_Y16_UV16_420                    =     55,
405        MALI_Y8_UV8_BL_422                   =     56,
406        MALI_Y8_UV8_BL_420                   =     57,
407        MALI_CUSTOM_YUV_2                    =     58,
408        MALI_CUSTOM_YUV_3                    =     59,
409        MALI_CUSTOM_YUV_4                    =     60,
410        MALI_CUSTOM_YUV_5                    =     61,
411        MALI_ASTC_2D_NARROW                  =     62,
412        MALI_ASTC_3D_NARROW                  =     63,
413        MALI_RGB565                          =     64,
414        MALI_RGB5_A1_UNORM                   =     65,
415        MALI_A1_BGR5_UNORM                   =     66,
416        MALI_RGB10_A2_UNORM                  =     67,
417        MALI_A2_BGR10_UNORM                  =     68,
418        MALI_RGB10_A2_SNORM                  =     69,
419        MALI_A2_BGR10_SNORM                  =     70,
420        MALI_RGB10_A2UI                      =     71,
421        MALI_A2_BGR10UI                      =     72,
422        MALI_RGB10_A2I                       =     73,
423        MALI_A2_BGR10I                       =     74,
424        MALI_Z16_UNORM                       =     75,
425        MALI_Z32                             =     76,
426        MALI_Z24X8_UNORM                     =     77,
427        MALI_X8Z24                           =     78,
428        MALI_X32_S8X24                       =     79,
429        MALI_X24S8_X32                       =     80,
430        MALI_R32_FIXED                       =     81,
431        MALI_RG32_FIXED                      =     82,
432        MALI_RGB32_FIXED                     =     83,
433        MALI_RGBA32_FIXED                    =     84,
434        MALI_X24S8                           =     85,
435        MALI_S8X24                           =     86,
436        MALI_Z32_X32                         =     87,
437        MALI_X32_Z32                         =     88,
438        MALI_R11F_G11F_B10F                  =     89,
439        MALI_B10F_G11F_R11F                  =     90,
440        MALI_R9F_G9F_B9F_E5F                 =     91,
441        MALI_E5F_B9F_G9F_R9F                 =     92,
442        MALI_S8                              =     93,
443        MALI_SNAP_4                          =     94,
444        MALI_CONSTANT                        =     95,
445        MALI_R8_SNORM                        =     99,
446        MALI_R16_SNORM                       =    100,
447        MALI_R32_SNORM                       =    101,
448        MALI_RG4_SNORM                       =    106,
449        MALI_RG8_SNORM                       =    107,
450        MALI_RG16_SNORM                      =    108,
451        MALI_RG32_SNORM                      =    109,
452        MALI_RGB8_SNORM                      =    115,
453        MALI_RGB16_SNORM                     =    116,
454        MALI_RGB32_SNORM                     =    117,
455        MALI_RGBA2_SNORM                     =    121,
456        MALI_RGBA4_SNORM                     =    122,
457        MALI_RGBA8_SNORM                     =    123,
458        MALI_RGBA16_SNORM                    =    124,
459        MALI_RGBA32_SNORM                    =    125,
460        MALI_R8UI                            =    131,
461        MALI_R16UI                           =    132,
462        MALI_R32UI                           =    133,
463        MALI_RG4UI                           =    138,
464        MALI_RG8UI                           =    139,
465        MALI_RG16UI                          =    140,
466        MALI_RG32UI                          =    141,
467        MALI_RGB8UI                          =    147,
468        MALI_RGB16UI                         =    148,
469        MALI_RGB32UI                         =    149,
470        MALI_RGBA2UI                         =    153,
471        MALI_RGBA4UI                         =    154,
472        MALI_RGBA8UI                         =    155,
473        MALI_RGBA16UI                        =    156,
474        MALI_RGBA32UI                        =    157,
475        MALI_R8_UNORM                        =    163,
476        MALI_R16_UNORM                       =    164,
477        MALI_R32_UNORM                       =    165,
478        MALI_R32F                            =    167,
479        MALI_RG4_UNORM                       =    170,
480        MALI_RG8_UNORM                       =    171,
481        MALI_RG16_UNORM                      =    172,
482        MALI_RG32_UNORM                      =    173,
483        MALI_RG32F                           =    175,
484        MALI_RGB8_UNORM                      =    179,
485        MALI_RGB16_UNORM                     =    180,
486        MALI_RGB32_UNORM                     =    181,
487        MALI_RGB32F                          =    183,
488        MALI_RGBA2_UNORM                     =    185,
489        MALI_RGBA4_UNORM                     =    186,
490        MALI_RGBA8_UNORM                     =    187,
491        MALI_RGBA16_UNORM                    =    188,
492        MALI_RGBA32_UNORM                    =    189,
493        MALI_RGBA32F                         =    191,
494        MALI_R8I                             =    195,
495        MALI_R16I                            =    196,
496        MALI_R32I                            =    197,
497        MALI_R16F                            =    199,
498        MALI_RG4I                            =    202,
499        MALI_RG8I                            =    203,
500        MALI_RG16I                           =    204,
501        MALI_RG32I                           =    205,
502        MALI_RG16F                           =    207,
503        MALI_RGB8I                           =    211,
504        MALI_RGB16I                          =    212,
505        MALI_RGB32I                          =    213,
506        MALI_RGB16F                          =    215,
507        MALI_RGBA2I                          =    217,
508        MALI_RGBA4I                          =    218,
509        MALI_RGBA8I                          =    219,
510        MALI_RGBA16I                         =    220,
511        MALI_RGBA32I                         =    221,
512        MALI_RGBA16F                         =    223,
513        MALI_RGB5_A1_AU                      =    224,
514        MALI_RGB5_A1_PU                      =    225,
515        MALI_R5G6B5_AU                       =    226,
516        MALI_R5G6B5_PU                       =    227,
517        MALI_SNAP4_V                         =    230,
518        MALI_R32F_RTZ                        =    231,
519        MALI_RGBA4_AU                        =    232,
520        MALI_RGBA4_PU                        =    233,
521        MALI_RGBA8_TB                        =    237,
522        MALI_RGB10_A2_TB                     =    238,
523        MALI_RG32F_RTZ                       =    239,
524        MALI_TESS_VERTEX_PACK                =    240,
525        MALI_RGB8_A2_AU                      =    241,
526        MALI_RGB8_A2_PU                      =    242,
527        MALI_RGB32F_RTZ                      =    247,
528        MALI_RGBA32F_RTZ                     =    255,
529};
530
531static inline const char *
532mali_format_as_str(enum mali_format imm)
533{
534    switch (imm) {
535    case MALI_ETC2_RGB8: return "ETC2 RGB8";
536    case MALI_ETC2_R11_UNORM: return "ETC2 R11 UNORM";
537    case MALI_ETC2_RGBA8: return "ETC2 RGBA8";
538    case MALI_ETC2_RG11_UNORM: return "ETC2 RG11 UNORM";
539    case MALI_R4A4_UNORM: return "R4A4 UNORM";
540    case MALI_A4R4_UNORM: return "A4R4 UNORM";
541    case MALI_BC1_UNORM: return "BC1 UNORM";
542    case MALI_BC2_UNORM: return "BC2 UNORM";
543    case MALI_BC3_UNORM: return "BC3 UNORM";
544    case MALI_BC4_UNORM: return "BC4 UNORM";
545    case MALI_BC4_SNORM: return "BC4 SNORM";
546    case MALI_BC5_UNORM: return "BC5 UNORM";
547    case MALI_BC5_SNORM: return "BC5 SNORM";
548    case MALI_BC6H_UF16: return "BC6H UF16";
549    case MALI_BC6H_SF16: return "BC6H SF16";
550    case MALI_BC7_UNORM: return "BC7 UNORM";
551    case MALI_ETC2_R11_SNORM: return "ETC2 R11 SNORM";
552    case MALI_ETC2_RG11_SNORM: return "ETC2 RG11 SNORM";
553    case MALI_ETC2_RGB8A1: return "ETC2 RGB8A1";
554    case MALI_ASTC_3D_LDR: return "ASTC 3D LDR";
555    case MALI_ASTC_3D_HDR: return "ASTC 3D HDR";
556    case MALI_ASTC_2D_LDR: return "ASTC 2D LDR";
557    case MALI_ASTC_2D_HDR: return "ASTC 2D HDR";
558    case MALI_R8A8_UNORM: return "R8A8 UNORM";
559    case MALI_A8R8_UNORM: return "A8R8 UNORM";
560    case MALI_A8_UNORM: return "A8 UNORM";
561    case MALI_RAW10: return "RAW10";
562    case MALI_RAW12: return "RAW12";
563    case MALI_R8G8B8G8: return "R8G8B8G8";
564    case MALI_G8R8G8B8: return "G8R8G8B8";
565    case MALI_YUV8: return "YUV8";
566    case MALI_YUVA8: return "YUVA8";
567    case MALI_YUYV8: return "YUYV8";
568    case MALI_VYUY8: return "VYUY8";
569    case MALI_Y8_UV8_422: return "Y8 UV8 422";
570    case MALI_Y8_U8_V8_422: return "Y8 U8 V8 422";
571    case MALI_Y8_UV8_420: return "Y8 UV8 420";
572    case MALI_Y8_U8_V8_420: return "Y8 U8 V8 420";
573    case MALI_YUV10_A2: return "YUV10 A2";
574    case MALI_A2_YUV10: return "A2 YUV10";
575    case MALI_YUYAAYVYAA: return "YUYAAYVYAA";
576    case MALI_YUYV10: return "YUYV10";
577    case MALI_VYUY10: return "VYUY10";
578    case MALI_Y10_UV10_422: return "Y10 UV10 422";
579    case MALI_Y10_UV10_420: return "Y10 UV10 420";
580    case MALI_YUV16: return "YUV16";
581    case MALI_YUVA16: return "YUVA16";
582    case MALI_YUYV16: return "YUYV16";
583    case MALI_VYUY16: return "VYUY16";
584    case MALI_Y10X6_U10X6V10X6_422: return "Y10X6 U10X6V10X6 422";
585    case MALI_Y16_UV16_422: return "Y16 UV16 422";
586    case MALI_Y10X6_U10X6V10X6_420: return "Y10X6 U10X6V10X6 420";
587    case MALI_Y16_UV16_420: return "Y16 UV16 420";
588    case MALI_Y8_UV8_BL_422: return "Y8 UV8 BL 422";
589    case MALI_Y8_UV8_BL_420: return "Y8 UV8 BL 420";
590    case MALI_CUSTOM_YUV_2: return "CUSTOM YUV 2";
591    case MALI_CUSTOM_YUV_3: return "CUSTOM YUV 3";
592    case MALI_CUSTOM_YUV_4: return "CUSTOM YUV 4";
593    case MALI_CUSTOM_YUV_5: return "CUSTOM YUV 5";
594    case MALI_ASTC_2D_NARROW: return "ASTC 2D NARROW";
595    case MALI_ASTC_3D_NARROW: return "ASTC 3D NARROW";
596    case MALI_RGB565: return "RGB565";
597    case MALI_RGB5_A1_UNORM: return "RGB5 A1 UNORM";
598    case MALI_A1_BGR5_UNORM: return "A1 BGR5 UNORM";
599    case MALI_RGB10_A2_UNORM: return "RGB10 A2 UNORM";
600    case MALI_A2_BGR10_UNORM: return "A2 BGR10 UNORM";
601    case MALI_RGB10_A2_SNORM: return "RGB10 A2 SNORM";
602    case MALI_A2_BGR10_SNORM: return "A2 BGR10 SNORM";
603    case MALI_RGB10_A2UI: return "RGB10 A2UI";
604    case MALI_A2_BGR10UI: return "A2 BGR10UI";
605    case MALI_RGB10_A2I: return "RGB10 A2I";
606    case MALI_A2_BGR10I: return "A2 BGR10I";
607    case MALI_Z16_UNORM: return "Z16 UNORM";
608    case MALI_Z32: return "Z32";
609    case MALI_Z24X8_UNORM: return "Z24X8 UNORM";
610    case MALI_X8Z24: return "X8Z24";
611    case MALI_X32_S8X24: return "X32 S8X24";
612    case MALI_X24S8_X32: return "X24S8 X32";
613    case MALI_R32_FIXED: return "R32 FIXED";
614    case MALI_RG32_FIXED: return "RG32 FIXED";
615    case MALI_RGB32_FIXED: return "RGB32 FIXED";
616    case MALI_RGBA32_FIXED: return "RGBA32 FIXED";
617    case MALI_X24S8: return "X24S8";
618    case MALI_S8X24: return "S8X24";
619    case MALI_Z32_X32: return "Z32 X32";
620    case MALI_X32_Z32: return "X32 Z32";
621    case MALI_R11F_G11F_B10F: return "R11F G11F B10F";
622    case MALI_B10F_G11F_R11F: return "B10F G11F R11F";
623    case MALI_R9F_G9F_B9F_E5F: return "R9F G9F B9F E5F";
624    case MALI_E5F_B9F_G9F_R9F: return "E5F B9F G9F R9F";
625    case MALI_S8: return "S8";
626    case MALI_SNAP_4: return "Snap 4";
627    case MALI_CONSTANT: return "Constant";
628    case MALI_R8_SNORM: return "R8 SNORM";
629    case MALI_R16_SNORM: return "R16 SNORM";
630    case MALI_R32_SNORM: return "R32 SNORM";
631    case MALI_RG4_SNORM: return "RG4 SNORM";
632    case MALI_RG8_SNORM: return "RG8 SNORM";
633    case MALI_RG16_SNORM: return "RG16 SNORM";
634    case MALI_RG32_SNORM: return "RG32 SNORM";
635    case MALI_RGB8_SNORM: return "RGB8 SNORM";
636    case MALI_RGB16_SNORM: return "RGB16 SNORM";
637    case MALI_RGB32_SNORM: return "RGB32 SNORM";
638    case MALI_RGBA2_SNORM: return "RGBA2 SNORM";
639    case MALI_RGBA4_SNORM: return "RGBA4 SNORM";
640    case MALI_RGBA8_SNORM: return "RGBA8 SNORM";
641    case MALI_RGBA16_SNORM: return "RGBA16 SNORM";
642    case MALI_RGBA32_SNORM: return "RGBA32 SNORM";
643    case MALI_R8UI: return "R8UI";
644    case MALI_R16UI: return "R16UI";
645    case MALI_R32UI: return "R32UI";
646    case MALI_RG4UI: return "RG4UI";
647    case MALI_RG8UI: return "RG8UI";
648    case MALI_RG16UI: return "RG16UI";
649    case MALI_RG32UI: return "RG32UI";
650    case MALI_RGB8UI: return "RGB8UI";
651    case MALI_RGB16UI: return "RGB16UI";
652    case MALI_RGB32UI: return "RGB32UI";
653    case MALI_RGBA2UI: return "RGBA2UI";
654    case MALI_RGBA4UI: return "RGBA4UI";
655    case MALI_RGBA8UI: return "RGBA8UI";
656    case MALI_RGBA16UI: return "RGBA16UI";
657    case MALI_RGBA32UI: return "RGBA32UI";
658    case MALI_R8_UNORM: return "R8 UNORM";
659    case MALI_R16_UNORM: return "R16 UNORM";
660    case MALI_R32_UNORM: return "R32 UNORM";
661    case MALI_R32F: return "R32F";
662    case MALI_RG4_UNORM: return "RG4 UNORM";
663    case MALI_RG8_UNORM: return "RG8 UNORM";
664    case MALI_RG16_UNORM: return "RG16 UNORM";
665    case MALI_RG32_UNORM: return "RG32 UNORM";
666    case MALI_RG32F: return "RG32F";
667    case MALI_RGB8_UNORM: return "RGB8 UNORM";
668    case MALI_RGB16_UNORM: return "RGB16 UNORM";
669    case MALI_RGB32_UNORM: return "RGB32 UNORM";
670    case MALI_RGB32F: return "RGB32F";
671    case MALI_RGBA2_UNORM: return "RGBA2 UNORM";
672    case MALI_RGBA4_UNORM: return "RGBA4 UNORM";
673    case MALI_RGBA8_UNORM: return "RGBA8 UNORM";
674    case MALI_RGBA16_UNORM: return "RGBA16 UNORM";
675    case MALI_RGBA32_UNORM: return "RGBA32 UNORM";
676    case MALI_RGBA32F: return "RGBA32F";
677    case MALI_R8I: return "R8I";
678    case MALI_R16I: return "R16I";
679    case MALI_R32I: return "R32I";
680    case MALI_R16F: return "R16F";
681    case MALI_RG4I: return "RG4I";
682    case MALI_RG8I: return "RG8I";
683    case MALI_RG16I: return "RG16I";
684    case MALI_RG32I: return "RG32I";
685    case MALI_RG16F: return "RG16F";
686    case MALI_RGB8I: return "RGB8I";
687    case MALI_RGB16I: return "RGB16I";
688    case MALI_RGB32I: return "RGB32I";
689    case MALI_RGB16F: return "RGB16F";
690    case MALI_RGBA2I: return "RGBA2I";
691    case MALI_RGBA4I: return "RGBA4I";
692    case MALI_RGBA8I: return "RGBA8I";
693    case MALI_RGBA16I: return "RGBA16I";
694    case MALI_RGBA32I: return "RGBA32I";
695    case MALI_RGBA16F: return "RGBA16F";
696    case MALI_RGB5_A1_AU: return "RGB5 A1 AU";
697    case MALI_RGB5_A1_PU: return "RGB5 A1 PU";
698    case MALI_R5G6B5_AU: return "R5G6B5 AU";
699    case MALI_R5G6B5_PU: return "R5G6B5 PU";
700    case MALI_SNAP4_V: return "Snap4 V";
701    case MALI_R32F_RTZ: return "R32F RTZ";
702    case MALI_RGBA4_AU: return "RGBA4 AU";
703    case MALI_RGBA4_PU: return "RGBA4 PU";
704    case MALI_RGBA8_TB: return "RGBA8 TB";
705    case MALI_RGB10_A2_TB: return "RGB10 A2 TB";
706    case MALI_RG32F_RTZ: return "RG32F RTZ";
707    case MALI_TESS_VERTEX_PACK: return "Tess Vertex Pack";
708    case MALI_RGB8_A2_AU: return "RGB8 A2 AU";
709    case MALI_RGB8_A2_PU: return "RGB8 A2 PU";
710    case MALI_RGB32F_RTZ: return "RGB32F RTZ";
711    case MALI_RGBA32F_RTZ: return "RGBA32F RTZ";
712    default: return "XXX: INVALID";
713    }
714}
715
716enum mali_rgb_component_order {
717        MALI_RGB_COMPONENT_ORDER_RGBA        =      0,
718        MALI_RGB_COMPONENT_ORDER_GRBA        =      2,
719        MALI_RGB_COMPONENT_ORDER_BGRA        =      4,
720        MALI_RGB_COMPONENT_ORDER_ARGB        =      8,
721        MALI_RGB_COMPONENT_ORDER_AGRB        =     10,
722        MALI_RGB_COMPONENT_ORDER_ABGR        =     12,
723        MALI_RGB_COMPONENT_ORDER_RGB1        =     16,
724        MALI_RGB_COMPONENT_ORDER_GRB1        =     18,
725        MALI_RGB_COMPONENT_ORDER_BGR1        =     20,
726        MALI_RGB_COMPONENT_ORDER_1RGB        =     24,
727        MALI_RGB_COMPONENT_ORDER_1GRB        =     26,
728        MALI_RGB_COMPONENT_ORDER_1BGR        =     28,
729        MALI_RGB_COMPONENT_ORDER_RRRR        =    226,
730        MALI_RGB_COMPONENT_ORDER_RRR1        =    227,
731        MALI_RGB_COMPONENT_ORDER_RRRA        =    228,
732        MALI_RGB_COMPONENT_ORDER_000A        =    229,
733        MALI_RGB_COMPONENT_ORDER_0001        =    230,
734        MALI_RGB_COMPONENT_ORDER_0000        =    231,
735        MALI_RGB_COMPONENT_ORDER_SNAP4_V9    =    232,
736        MALI_RGB_COMPONENT_ORDER_SNAP4_V10   =    233,
737        MALI_RGB_COMPONENT_ORDER_SNAP4_V11   =    234,
738        MALI_RGB_COMPONENT_ORDER_SNAP4_V12   =    235,
739        MALI_RGB_COMPONENT_ORDER_SNAP4_V13   =    236,
740        MALI_RGB_COMPONENT_ORDER_SNAP4_V14   =    237,
741        MALI_RGB_COMPONENT_ORDER_SNAP4_V15   =    238,
742        MALI_RGB_COMPONENT_ORDER_SNAP4_V16   =    239,
743        MALI_RGB_COMPONENT_ORDER_R000        =    240,
744        MALI_RGB_COMPONENT_ORDER_RBGA        =    242,
745};
746
747static inline const char *
748mali_rgb_component_order_as_str(enum mali_rgb_component_order imm)
749{
750    switch (imm) {
751    case MALI_RGB_COMPONENT_ORDER_RGBA: return "RGBA";
752    case MALI_RGB_COMPONENT_ORDER_GRBA: return "GRBA";
753    case MALI_RGB_COMPONENT_ORDER_BGRA: return "BGRA";
754    case MALI_RGB_COMPONENT_ORDER_ARGB: return "ARGB";
755    case MALI_RGB_COMPONENT_ORDER_AGRB: return "AGRB";
756    case MALI_RGB_COMPONENT_ORDER_ABGR: return "ABGR";
757    case MALI_RGB_COMPONENT_ORDER_RGB1: return "RGB1";
758    case MALI_RGB_COMPONENT_ORDER_GRB1: return "GRB1";
759    case MALI_RGB_COMPONENT_ORDER_BGR1: return "BGR1";
760    case MALI_RGB_COMPONENT_ORDER_1RGB: return "1RGB";
761    case MALI_RGB_COMPONENT_ORDER_1GRB: return "1GRB";
762    case MALI_RGB_COMPONENT_ORDER_1BGR: return "1BGR";
763    case MALI_RGB_COMPONENT_ORDER_RRRR: return "RRRR";
764    case MALI_RGB_COMPONENT_ORDER_RRR1: return "RRR1";
765    case MALI_RGB_COMPONENT_ORDER_RRRA: return "RRRA";
766    case MALI_RGB_COMPONENT_ORDER_000A: return "000A";
767    case MALI_RGB_COMPONENT_ORDER_0001: return "0001";
768    case MALI_RGB_COMPONENT_ORDER_0000: return "0000";
769    case MALI_RGB_COMPONENT_ORDER_SNAP4_V9: return "Snap4 v9";
770    case MALI_RGB_COMPONENT_ORDER_SNAP4_V10: return "Snap4 v10";
771    case MALI_RGB_COMPONENT_ORDER_SNAP4_V11: return "Snap4 v11";
772    case MALI_RGB_COMPONENT_ORDER_SNAP4_V12: return "Snap4 v12";
773    case MALI_RGB_COMPONENT_ORDER_SNAP4_V13: return "Snap4 v13";
774    case MALI_RGB_COMPONENT_ORDER_SNAP4_V14: return "Snap4 v14";
775    case MALI_RGB_COMPONENT_ORDER_SNAP4_V15: return "Snap4 v15";
776    case MALI_RGB_COMPONENT_ORDER_SNAP4_V16: return "Snap4 v16";
777    case MALI_RGB_COMPONENT_ORDER_R000: return "R000";
778    case MALI_RGB_COMPONENT_ORDER_RBGA: return "RBGA";
779    default: return "XXX: INVALID";
780    }
781}
782
783enum mali_yuv_swizzle {
784        MALI_YUV_SWIZZLE_YUVA                =      0,
785        MALI_YUV_SWIZZLE_YVUA                =      1,
786        MALI_YUV_SWIZZLE_UYVA                =      2,
787        MALI_YUV_SWIZZLE_UVYA                =      3,
788        MALI_YUV_SWIZZLE_VUYA                =      4,
789        MALI_YUV_SWIZZLE_VYUA                =      5,
790        MALI_YUV_SWIZZLE_Y00A                =      6,
791        MALI_YUV_SWIZZLE_YXXA                =      7,
792};
793
794static inline const char *
795mali_yuv_swizzle_as_str(enum mali_yuv_swizzle imm)
796{
797    switch (imm) {
798    case MALI_YUV_SWIZZLE_YUVA: return "YUVA";
799    case MALI_YUV_SWIZZLE_YVUA: return "YVUA";
800    case MALI_YUV_SWIZZLE_UYVA: return "UYVA";
801    case MALI_YUV_SWIZZLE_UVYA: return "UVYA";
802    case MALI_YUV_SWIZZLE_VUYA: return "VUYA";
803    case MALI_YUV_SWIZZLE_VYUA: return "VYUA";
804    case MALI_YUV_SWIZZLE_Y00A: return "Y00A";
805    case MALI_YUV_SWIZZLE_YXXA: return "YXXA";
806    default: return "XXX: INVALID";
807    }
808}
809
810enum mali_yuv_conversion_mode {
811        MALI_YUV_CONVERSION_MODE_NO_CONVERSION =      0,
812        MALI_YUV_CONVERSION_MODE_BT_601      =      3,
813        MALI_YUV_CONVERSION_MODE_BT_709      =      4,
814        MALI_YUV_CONVERSION_MODE_BT_2020     =      6,
815};
816
817static inline const char *
818mali_yuv_conversion_mode_as_str(enum mali_yuv_conversion_mode imm)
819{
820    switch (imm) {
821    case MALI_YUV_CONVERSION_MODE_NO_CONVERSION: return "No Conversion";
822    case MALI_YUV_CONVERSION_MODE_BT_601: return "BT 601";
823    case MALI_YUV_CONVERSION_MODE_BT_709: return "BT 709";
824    case MALI_YUV_CONVERSION_MODE_BT_2020: return "BT 2020";
825    default: return "XXX: INVALID";
826    }
827}
828
829enum mali_yuv_cr_siting {
830        MALI_YUV_CR_SITING_CO_SITED          =      0,
831        MALI_YUV_CR_SITING_CENTER_Y          =      1,
832        MALI_YUV_CR_SITING_CENTER_X          =      2,
833        MALI_YUV_CR_SITING_CENTER            =      3,
834        MALI_YUV_CR_SITING_ONE_QUARTER       =      4,
835        MALI_YUV_CR_SITING_THREE_QUARTERS    =      5,
836        MALI_YUV_CR_SITING_REPLICATED        =      7,
837};
838
839static inline const char *
840mali_yuv_cr_siting_as_str(enum mali_yuv_cr_siting imm)
841{
842    switch (imm) {
843    case MALI_YUV_CR_SITING_CO_SITED: return "Co-Sited";
844    case MALI_YUV_CR_SITING_CENTER_Y: return "Center Y";
845    case MALI_YUV_CR_SITING_CENTER_X: return "Center X";
846    case MALI_YUV_CR_SITING_CENTER: return "Center";
847    case MALI_YUV_CR_SITING_ONE_QUARTER: return "One Quarter";
848    case MALI_YUV_CR_SITING_THREE_QUARTERS: return "Three Quarters";
849    case MALI_YUV_CR_SITING_REPLICATED: return "Replicated";
850    default: return "XXX: INVALID";
851    }
852}
853
854enum mali_astc_2d_dimension {
855        MALI_ASTC_2D_DIMENSION_4             =      0,
856        MALI_ASTC_2D_DIMENSION_5             =      1,
857        MALI_ASTC_2D_DIMENSION_6             =      2,
858        MALI_ASTC_2D_DIMENSION_8             =      4,
859        MALI_ASTC_2D_DIMENSION_10            =      6,
860        MALI_ASTC_2D_DIMENSION_12            =      7,
861};
862
863static inline const char *
864mali_astc_2d_dimension_as_str(enum mali_astc_2d_dimension imm)
865{
866    switch (imm) {
867    case MALI_ASTC_2D_DIMENSION_4: return "4";
868    case MALI_ASTC_2D_DIMENSION_5: return "5";
869    case MALI_ASTC_2D_DIMENSION_6: return "6";
870    case MALI_ASTC_2D_DIMENSION_8: return "8";
871    case MALI_ASTC_2D_DIMENSION_10: return "10";
872    case MALI_ASTC_2D_DIMENSION_12: return "12";
873    default: return "XXX: INVALID";
874    }
875}
876
877enum mali_astc_3d_dimension {
878        MALI_ASTC_3D_DIMENSION_4             =      0,
879        MALI_ASTC_3D_DIMENSION_5             =      1,
880        MALI_ASTC_3D_DIMENSION_6             =      2,
881        MALI_ASTC_3D_DIMENSION_3             =      3,
882};
883
884static inline const char *
885mali_astc_3d_dimension_as_str(enum mali_astc_3d_dimension imm)
886{
887    switch (imm) {
888    case MALI_ASTC_3D_DIMENSION_4: return "4";
889    case MALI_ASTC_3D_DIMENSION_5: return "5";
890    case MALI_ASTC_3D_DIMENSION_6: return "6";
891    case MALI_ASTC_3D_DIMENSION_3: return "3";
892    default: return "XXX: INVALID";
893    }
894}
895
896enum mali_pixel_kill {
897        MALI_PIXEL_KILL_FORCE_EARLY          =      0,
898        MALI_PIXEL_KILL_STRONG_EARLY         =      1,
899        MALI_PIXEL_KILL_WEAK_EARLY           =      2,
900        MALI_PIXEL_KILL_FORCE_LATE           =      3,
901};
902
903static inline const char *
904mali_pixel_kill_as_str(enum mali_pixel_kill imm)
905{
906    switch (imm) {
907    case MALI_PIXEL_KILL_FORCE_EARLY: return "Force Early";
908    case MALI_PIXEL_KILL_STRONG_EARLY: return "Strong Early";
909    case MALI_PIXEL_KILL_WEAK_EARLY: return "Weak Early";
910    case MALI_PIXEL_KILL_FORCE_LATE: return "Force Late";
911    default: return "XXX: INVALID";
912    }
913}
914
915enum mali_block_format {
916        MALI_BLOCK_FORMAT_NO_WRITE           =      0,
917        MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED =      1,
918        MALI_BLOCK_FORMAT_LINEAR             =      2,
919        MALI_BLOCK_FORMAT_AFBC               =     12,
920        MALI_BLOCK_FORMAT_AFBC_TILED         =     13,
921};
922
923static inline const char *
924mali_block_format_as_str(enum mali_block_format imm)
925{
926    switch (imm) {
927    case MALI_BLOCK_FORMAT_NO_WRITE: return "No Write";
928    case MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED: return "Tiled U-Interleaved";
929    case MALI_BLOCK_FORMAT_LINEAR: return "Linear";
930    case MALI_BLOCK_FORMAT_AFBC: return "AFBC";
931    case MALI_BLOCK_FORMAT_AFBC_TILED: return "AFBC Tiled";
932    default: return "XXX: INVALID";
933    }
934}
935
936enum mali_mipmap_mode {
937        MALI_MIPMAP_MODE_NEAREST             =      0,
938        MALI_MIPMAP_MODE_NONE                =      1,
939        MALI_MIPMAP_MODE_TRILINEAR           =      3,
940};
941
942static inline const char *
943mali_mipmap_mode_as_str(enum mali_mipmap_mode imm)
944{
945    switch (imm) {
946    case MALI_MIPMAP_MODE_NEAREST: return "Nearest";
947    case MALI_MIPMAP_MODE_NONE: return "None";
948    case MALI_MIPMAP_MODE_TRILINEAR: return "Trilinear";
949    default: return "XXX: INVALID";
950    }
951}
952
953enum mali_lod_algorithm {
954        MALI_LOD_ALGORITHM_ISOTROPIC         =      0,
955        MALI_LOD_ALGORITHM_ANISOTROPIC       =      3,
956};
957
958static inline const char *
959mali_lod_algorithm_as_str(enum mali_lod_algorithm imm)
960{
961    switch (imm) {
962    case MALI_LOD_ALGORITHM_ISOTROPIC: return "Isotropic";
963    case MALI_LOD_ALGORITHM_ANISOTROPIC: return "Anisotropic";
964    default: return "XXX: INVALID";
965    }
966}
967
968enum mali_msaa {
969        MALI_MSAA_SINGLE                     =      0,
970        MALI_MSAA_AVERAGE                    =      1,
971        MALI_MSAA_MULTIPLE                   =      2,
972        MALI_MSAA_LAYERED                    =      3,
973};
974
975static inline const char *
976mali_msaa_as_str(enum mali_msaa imm)
977{
978    switch (imm) {
979    case MALI_MSAA_SINGLE: return "Single";
980    case MALI_MSAA_AVERAGE: return "Average";
981    case MALI_MSAA_MULTIPLE: return "Multiple";
982    case MALI_MSAA_LAYERED: return "Layered";
983    default: return "XXX: INVALID";
984    }
985}
986
987enum mali_index_type {
988        MALI_INDEX_TYPE_NONE                 =      0,
989        MALI_INDEX_TYPE_UINT8                =      1,
990        MALI_INDEX_TYPE_UINT16               =      2,
991        MALI_INDEX_TYPE_UINT32               =      3,
992};
993
994static inline const char *
995mali_index_type_as_str(enum mali_index_type imm)
996{
997    switch (imm) {
998    case MALI_INDEX_TYPE_NONE: return "None";
999    case MALI_INDEX_TYPE_UINT8: return "UINT8";
1000    case MALI_INDEX_TYPE_UINT16: return "UINT16";
1001    case MALI_INDEX_TYPE_UINT32: return "UINT32";
1002    default: return "XXX: INVALID";
1003    }
1004}
1005
1006enum mali_occlusion_mode {
1007        MALI_OCCLUSION_MODE_DISABLED         =      0,
1008        MALI_OCCLUSION_MODE_PREDICATE        =      1,
1009        MALI_OCCLUSION_MODE_COUNTER          =      3,
1010};
1011
1012static inline const char *
1013mali_occlusion_mode_as_str(enum mali_occlusion_mode imm)
1014{
1015    switch (imm) {
1016    case MALI_OCCLUSION_MODE_DISABLED: return "Disabled";
1017    case MALI_OCCLUSION_MODE_PREDICATE: return "Predicate";
1018    case MALI_OCCLUSION_MODE_COUNTER: return "Counter";
1019    default: return "XXX: INVALID";
1020    }
1021}
1022
1023enum mali_stencil_op {
1024        MALI_STENCIL_OP_KEEP                 =      0,
1025        MALI_STENCIL_OP_REPLACE              =      1,
1026        MALI_STENCIL_OP_ZERO                 =      2,
1027        MALI_STENCIL_OP_INVERT               =      3,
1028        MALI_STENCIL_OP_INCR_WRAP            =      4,
1029        MALI_STENCIL_OP_DECR_WRAP            =      5,
1030        MALI_STENCIL_OP_INCR_SAT             =      6,
1031        MALI_STENCIL_OP_DECR_SAT             =      7,
1032};
1033
1034static inline const char *
1035mali_stencil_op_as_str(enum mali_stencil_op imm)
1036{
1037    switch (imm) {
1038    case MALI_STENCIL_OP_KEEP: return "Keep";
1039    case MALI_STENCIL_OP_REPLACE: return "Replace";
1040    case MALI_STENCIL_OP_ZERO: return "Zero";
1041    case MALI_STENCIL_OP_INVERT: return "Invert";
1042    case MALI_STENCIL_OP_INCR_WRAP: return "Incr Wrap";
1043    case MALI_STENCIL_OP_DECR_WRAP: return "Decr Wrap";
1044    case MALI_STENCIL_OP_INCR_SAT: return "Incr Sat";
1045    case MALI_STENCIL_OP_DECR_SAT: return "Decr Sat";
1046    default: return "XXX: INVALID";
1047    }
1048}
1049
1050enum mali_texture_dimension {
1051        MALI_TEXTURE_DIMENSION_CUBE          =      0,
1052        MALI_TEXTURE_DIMENSION_1D            =      1,
1053        MALI_TEXTURE_DIMENSION_2D            =      2,
1054        MALI_TEXTURE_DIMENSION_3D            =      3,
1055};
1056
1057static inline const char *
1058mali_texture_dimension_as_str(enum mali_texture_dimension imm)
1059{
1060    switch (imm) {
1061    case MALI_TEXTURE_DIMENSION_CUBE: return "Cube";
1062    case MALI_TEXTURE_DIMENSION_1D: return "1D";
1063    case MALI_TEXTURE_DIMENSION_2D: return "2D";
1064    case MALI_TEXTURE_DIMENSION_3D: return "3D";
1065    default: return "XXX: INVALID";
1066    }
1067}
1068
1069enum mali_texture_layout {
1070        MALI_TEXTURE_LAYOUT_TILED            =      1,
1071        MALI_TEXTURE_LAYOUT_LINEAR           =      2,
1072        MALI_TEXTURE_LAYOUT_AFBC             =     12,
1073};
1074
1075static inline const char *
1076mali_texture_layout_as_str(enum mali_texture_layout imm)
1077{
1078    switch (imm) {
1079    case MALI_TEXTURE_LAYOUT_TILED: return "Tiled";
1080    case MALI_TEXTURE_LAYOUT_LINEAR: return "Linear";
1081    case MALI_TEXTURE_LAYOUT_AFBC: return "AFBC";
1082    default: return "XXX: INVALID";
1083    }
1084}
1085
1086enum mali_afbc_surface_flag {
1087        MALI_AFBC_SURFACE_FLAG_YTR           =      1,
1088        MALI_AFBC_SURFACE_FLAG_SPLIT_BLOCK   =      2,
1089        MALI_AFBC_SURFACE_FLAG_WIDE_BLOCK    =      4,
1090        MALI_AFBC_SURFACE_FLAG_TILED_HEADER  =      8,
1091        MALI_AFBC_SURFACE_FLAG_PREFETCH      =     16,
1092        MALI_AFBC_SURFACE_FLAG_CHECK_PAYLOAD_RANGE =     32,
1093};
1094
1095static inline const char *
1096mali_afbc_surface_flag_as_str(enum mali_afbc_surface_flag imm)
1097{
1098    switch (imm) {
1099    case MALI_AFBC_SURFACE_FLAG_YTR: return "YTR";
1100    case MALI_AFBC_SURFACE_FLAG_SPLIT_BLOCK: return "Split Block";
1101    case MALI_AFBC_SURFACE_FLAG_WIDE_BLOCK: return "Wide Block";
1102    case MALI_AFBC_SURFACE_FLAG_TILED_HEADER: return "Tiled Header";
1103    case MALI_AFBC_SURFACE_FLAG_PREFETCH: return "Prefetch";
1104    case MALI_AFBC_SURFACE_FLAG_CHECK_PAYLOAD_RANGE: return "Check Payload Range";
1105    default: return "XXX: INVALID";
1106    }
1107}
1108
1109enum mali_wrap_mode {
1110        MALI_WRAP_MODE_REPEAT                =      8,
1111        MALI_WRAP_MODE_CLAMP_TO_EDGE         =      9,
1112        MALI_WRAP_MODE_CLAMP_TO_BORDER       =     11,
1113        MALI_WRAP_MODE_MIRRORED_REPEAT       =     12,
1114        MALI_WRAP_MODE_MIRRORED_CLAMP_TO_EDGE =     13,
1115        MALI_WRAP_MODE_MIRRORED_CLAMP_TO_BORDER =     15,
1116};
1117
1118static inline const char *
1119mali_wrap_mode_as_str(enum mali_wrap_mode imm)
1120{
1121    switch (imm) {
1122    case MALI_WRAP_MODE_REPEAT: return "Repeat";
1123    case MALI_WRAP_MODE_CLAMP_TO_EDGE: return "Clamp to Edge";
1124    case MALI_WRAP_MODE_CLAMP_TO_BORDER: return "Clamp to Border";
1125    case MALI_WRAP_MODE_MIRRORED_REPEAT: return "Mirrored Repeat";
1126    case MALI_WRAP_MODE_MIRRORED_CLAMP_TO_EDGE: return "Mirrored Clamp to Edge";
1127    case MALI_WRAP_MODE_MIRRORED_CLAMP_TO_BORDER: return "Mirrored Clamp to Border";
1128    default: return "XXX: INVALID";
1129    }
1130}
1131
1132struct MALI_ATTRIBUTE {
1133   uint32_t                             buffer_index;
1134   bool                                 offset_enable;
1135   uint32_t                             format;
1136   int32_t                              offset;
1137};
1138
1139#define MALI_ATTRIBUTE_header                   \
1140   .offset_enable = true
1141
1142static inline void
1143MALI_ATTRIBUTE_pack(uint32_t * restrict cl,
1144                    const struct MALI_ATTRIBUTE * restrict values)
1145{
1146   cl[ 0] = __gen_uint(values->buffer_index, 0, 8) |
1147            __gen_uint(values->offset_enable, 9, 9) |
1148            __gen_uint(values->format, 10, 31);
1149   cl[ 1] = __gen_sint(values->offset, 0, 31);
1150}
1151
1152
1153#define MALI_ATTRIBUTE_LENGTH 8
1154#define MALI_ATTRIBUTE_ALIGN 8
1155struct mali_attribute_packed { uint32_t opaque[2]; };
1156static inline void
1157MALI_ATTRIBUTE_unpack(const uint8_t * restrict cl,
1158                      struct MALI_ATTRIBUTE * restrict values)
1159{
1160   values->buffer_index = __gen_unpack_uint(cl, 0, 8);
1161   values->offset_enable = __gen_unpack_uint(cl, 9, 9);
1162   values->format = __gen_unpack_uint(cl, 10, 31);
1163   values->offset = __gen_unpack_sint(cl, 32, 63);
1164}
1165
1166static inline void
1167MALI_ATTRIBUTE_print(FILE *fp, const struct MALI_ATTRIBUTE * values, unsigned indent)
1168{
1169   fprintf(fp, "%*sBuffer index: %u\n", indent, "", values->buffer_index);
1170   fprintf(fp, "%*sOffset enable: %s\n", indent, "", values->offset_enable ? "true" : "false");
1171   mali_pixel_format_print(fp, values->format);
1172   fprintf(fp, "%*sOffset: %d\n", indent, "", values->offset);
1173}
1174
1175struct MALI_ATTRIBUTE_BUFFER {
1176   enum mali_attribute_type             type;
1177   uint64_t                             pointer;
1178   uint32_t                             stride;
1179   uint32_t                             size;
1180   uint32_t                             divisor;
1181   uint32_t                             divisor_r;
1182   uint32_t                             divisor_p;
1183   uint32_t                             divisor_e;
1184};
1185
1186#define MALI_ATTRIBUTE_BUFFER_header            \
1187   .type = MALI_ATTRIBUTE_TYPE_1D,  \
1188   .divisor = 1
1189
1190static inline void
1191MALI_ATTRIBUTE_BUFFER_pack(uint32_t * restrict cl,
1192                           const struct MALI_ATTRIBUTE_BUFFER * restrict values)
1193{
1194   assert((values->pointer & 0x3f) == 0);
1195   cl[ 0] = __gen_uint(values->type, 0, 5) |
1196            __gen_uint(values->pointer >> 6, 6, 55);
1197   cl[ 1] = __gen_uint(values->pointer >> 6, 6, 55) >> 32 |
1198            __gen_padded(values->divisor, 24, 31) |
1199            __gen_uint(values->divisor_r, 24, 28) |
1200            __gen_uint(values->divisor_p, 29, 31) |
1201            __gen_uint(values->divisor_e, 29, 29);
1202   cl[ 2] = __gen_uint(values->stride, 0, 31);
1203   cl[ 3] = __gen_uint(values->size, 0, 31);
1204}
1205
1206
1207#define MALI_ATTRIBUTE_BUFFER_LENGTH 16
1208#define MALI_ATTRIBUTE_BUFFER_ALIGN 32
1209struct mali_attribute_buffer_packed { uint32_t opaque[4]; };
1210static inline void
1211MALI_ATTRIBUTE_BUFFER_unpack(const uint8_t * restrict cl,
1212                             struct MALI_ATTRIBUTE_BUFFER * restrict values)
1213{
1214   values->type = (enum mali_attribute_type)__gen_unpack_uint(cl, 0, 5);
1215   values->pointer = __gen_unpack_uint(cl, 6, 55) << 6;
1216   values->stride = __gen_unpack_uint(cl, 64, 95);
1217   values->size = __gen_unpack_uint(cl, 96, 127);
1218   values->divisor = __gen_unpack_padded(cl, 56, 63);
1219   values->divisor_r = __gen_unpack_uint(cl, 56, 60);
1220   values->divisor_p = __gen_unpack_uint(cl, 61, 63);
1221   values->divisor_e = __gen_unpack_uint(cl, 61, 61);
1222}
1223
1224static inline void
1225MALI_ATTRIBUTE_BUFFER_print(FILE *fp, const struct MALI_ATTRIBUTE_BUFFER * values, unsigned indent)
1226{
1227   fprintf(fp, "%*sType: %s\n", indent, "", mali_attribute_type_as_str(values->type));
1228   fprintf(fp, "%*sPointer: 0x%" PRIx64 "\n", indent, "", values->pointer);
1229   fprintf(fp, "%*sStride: %u\n", indent, "", values->stride);
1230   fprintf(fp, "%*sSize: %u\n", indent, "", values->size);
1231   fprintf(fp, "%*sDivisor: %u\n", indent, "", values->divisor);
1232   fprintf(fp, "%*sDivisor R: %u\n", indent, "", values->divisor_r);
1233   fprintf(fp, "%*sDivisor P: %u\n", indent, "", values->divisor_p);
1234   fprintf(fp, "%*sDivisor E: %u\n", indent, "", values->divisor_e);
1235}
1236
1237struct MALI_ATTRIBUTE_BUFFER_CONTINUATION_NPOT {
1238   enum mali_attribute_type             type;
1239   uint32_t                             divisor_numerator;
1240   uint32_t                             divisor;
1241};
1242
1243#define MALI_ATTRIBUTE_BUFFER_CONTINUATION_NPOT_header\
1244   .type = MALI_ATTRIBUTE_TYPE_CONTINUATION
1245
1246static inline void
1247MALI_ATTRIBUTE_BUFFER_CONTINUATION_NPOT_pack(uint32_t * restrict cl,
1248                                             const struct MALI_ATTRIBUTE_BUFFER_CONTINUATION_NPOT * restrict values)
1249{
1250   cl[ 0] = __gen_uint(values->type, 0, 5);
1251   cl[ 1] = __gen_uint(values->divisor_numerator, 0, 31);
1252   cl[ 2] = 0;
1253   cl[ 3] = __gen_uint(values->divisor, 0, 31);
1254}
1255
1256
1257#define MALI_ATTRIBUTE_BUFFER_CONTINUATION_NPOT_LENGTH 16
1258struct mali_attribute_buffer_continuation_npot_packed { uint32_t opaque[4]; };
1259static inline void
1260MALI_ATTRIBUTE_BUFFER_CONTINUATION_NPOT_unpack(const uint8_t * restrict cl,
1261                                               struct MALI_ATTRIBUTE_BUFFER_CONTINUATION_NPOT * restrict values)
1262{
1263   if (((const uint32_t *) cl)[0] & 0xffffffc0) fprintf(stderr, "XXX: Invalid field of Attribute Buffer Continuation NPOT unpacked at word 0\n");
1264   if (((const uint32_t *) cl)[2] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Attribute Buffer Continuation NPOT unpacked at word 2\n");
1265   values->type = (enum mali_attribute_type)__gen_unpack_uint(cl, 0, 5);
1266   values->divisor_numerator = __gen_unpack_uint(cl, 32, 63);
1267   values->divisor = __gen_unpack_uint(cl, 96, 127);
1268}
1269
1270static inline void
1271MALI_ATTRIBUTE_BUFFER_CONTINUATION_NPOT_print(FILE *fp, const struct MALI_ATTRIBUTE_BUFFER_CONTINUATION_NPOT * values, unsigned indent)
1272{
1273   fprintf(fp, "%*sType: %s\n", indent, "", mali_attribute_type_as_str(values->type));
1274   fprintf(fp, "%*sDivisor Numerator: %u\n", indent, "", values->divisor_numerator);
1275   fprintf(fp, "%*sDivisor: %u\n", indent, "", values->divisor);
1276}
1277
1278struct MALI_ATTRIBUTE_BUFFER_CONTINUATION_3D {
1279   enum mali_attribute_type             type;
1280   uint32_t                             s_dimension;
1281   uint32_t                             t_dimension;
1282   uint32_t                             r_dimension;
1283   uint32_t                             row_stride;
1284   uint32_t                             slice_stride;
1285};
1286
1287#define MALI_ATTRIBUTE_BUFFER_CONTINUATION_3D_header\
1288   .type = MALI_ATTRIBUTE_TYPE_CONTINUATION
1289
1290static inline void
1291MALI_ATTRIBUTE_BUFFER_CONTINUATION_3D_pack(uint32_t * restrict cl,
1292                                           const struct MALI_ATTRIBUTE_BUFFER_CONTINUATION_3D * restrict values)
1293{
1294   assert(values->s_dimension >= 1);
1295   assert(values->t_dimension >= 1);
1296   assert(values->r_dimension >= 1);
1297   cl[ 0] = __gen_uint(values->type, 0, 5) |
1298            __gen_uint(values->s_dimension - 1, 16, 31);
1299   cl[ 1] = __gen_uint(values->t_dimension - 1, 0, 15) |
1300            __gen_uint(values->r_dimension - 1, 16, 31);
1301   cl[ 2] = __gen_uint(values->row_stride, 0, 31);
1302   cl[ 3] = __gen_uint(values->slice_stride, 0, 31);
1303}
1304
1305
1306#define MALI_ATTRIBUTE_BUFFER_CONTINUATION_3D_LENGTH 16
1307struct mali_attribute_buffer_continuation_3d_packed { uint32_t opaque[4]; };
1308static inline void
1309MALI_ATTRIBUTE_BUFFER_CONTINUATION_3D_unpack(const uint8_t * restrict cl,
1310                                             struct MALI_ATTRIBUTE_BUFFER_CONTINUATION_3D * restrict values)
1311{
1312   if (((const uint32_t *) cl)[0] & 0xffc0) fprintf(stderr, "XXX: Invalid field of Attribute Buffer Continuation 3D unpacked at word 0\n");
1313   values->type = (enum mali_attribute_type)__gen_unpack_uint(cl, 0, 5);
1314   values->s_dimension = __gen_unpack_uint(cl, 16, 31) + 1;
1315   values->t_dimension = __gen_unpack_uint(cl, 32, 47) + 1;
1316   values->r_dimension = __gen_unpack_uint(cl, 48, 63) + 1;
1317   values->row_stride = __gen_unpack_uint(cl, 64, 95);
1318   values->slice_stride = __gen_unpack_uint(cl, 96, 127);
1319}
1320
1321static inline void
1322MALI_ATTRIBUTE_BUFFER_CONTINUATION_3D_print(FILE *fp, const struct MALI_ATTRIBUTE_BUFFER_CONTINUATION_3D * values, unsigned indent)
1323{
1324   fprintf(fp, "%*sType: %s\n", indent, "", mali_attribute_type_as_str(values->type));
1325   fprintf(fp, "%*sS dimension: %u\n", indent, "", values->s_dimension);
1326   fprintf(fp, "%*sT dimension: %u\n", indent, "", values->t_dimension);
1327   fprintf(fp, "%*sR dimension: %u\n", indent, "", values->r_dimension);
1328   fprintf(fp, "%*sRow Stride: %u\n", indent, "", values->row_stride);
1329   fprintf(fp, "%*sSlice Stride: %u\n", indent, "", values->slice_stride);
1330}
1331
1332enum mali_blend_operand_a {
1333        MALI_BLEND_OPERAND_A_ZERO            =      1,
1334        MALI_BLEND_OPERAND_A_SRC             =      2,
1335        MALI_BLEND_OPERAND_A_DEST            =      3,
1336};
1337
1338static inline const char *
1339mali_blend_operand_a_as_str(enum mali_blend_operand_a imm)
1340{
1341    switch (imm) {
1342    case MALI_BLEND_OPERAND_A_ZERO: return "Zero";
1343    case MALI_BLEND_OPERAND_A_SRC: return "Src";
1344    case MALI_BLEND_OPERAND_A_DEST: return "Dest";
1345    default: return "XXX: INVALID";
1346    }
1347}
1348
1349enum mali_blend_operand_b {
1350        MALI_BLEND_OPERAND_B_SRC_MINUS_DEST  =      0,
1351        MALI_BLEND_OPERAND_B_SRC_PLUS_DEST   =      1,
1352        MALI_BLEND_OPERAND_B_SRC             =      2,
1353        MALI_BLEND_OPERAND_B_DEST            =      3,
1354};
1355
1356static inline const char *
1357mali_blend_operand_b_as_str(enum mali_blend_operand_b imm)
1358{
1359    switch (imm) {
1360    case MALI_BLEND_OPERAND_B_SRC_MINUS_DEST: return "Src Minus Dest";
1361    case MALI_BLEND_OPERAND_B_SRC_PLUS_DEST: return "Src Plus Dest";
1362    case MALI_BLEND_OPERAND_B_SRC: return "Src";
1363    case MALI_BLEND_OPERAND_B_DEST: return "Dest";
1364    default: return "XXX: INVALID";
1365    }
1366}
1367
1368enum mali_blend_operand_c {
1369        MALI_BLEND_OPERAND_C_ZERO            =      1,
1370        MALI_BLEND_OPERAND_C_SRC             =      2,
1371        MALI_BLEND_OPERAND_C_DEST            =      3,
1372        MALI_BLEND_OPERAND_C_SRC_X_2         =      4,
1373        MALI_BLEND_OPERAND_C_SRC_ALPHA       =      5,
1374        MALI_BLEND_OPERAND_C_DEST_ALPHA      =      6,
1375        MALI_BLEND_OPERAND_C_CONSTANT        =      7,
1376};
1377
1378static inline const char *
1379mali_blend_operand_c_as_str(enum mali_blend_operand_c imm)
1380{
1381    switch (imm) {
1382    case MALI_BLEND_OPERAND_C_ZERO: return "Zero";
1383    case MALI_BLEND_OPERAND_C_SRC: return "Src";
1384    case MALI_BLEND_OPERAND_C_DEST: return "Dest";
1385    case MALI_BLEND_OPERAND_C_SRC_X_2: return "Src x 2";
1386    case MALI_BLEND_OPERAND_C_SRC_ALPHA: return "Src Alpha";
1387    case MALI_BLEND_OPERAND_C_DEST_ALPHA: return "Dest Alpha";
1388    case MALI_BLEND_OPERAND_C_CONSTANT: return "Constant";
1389    default: return "XXX: INVALID";
1390    }
1391}
1392
1393struct MALI_BLEND_FUNCTION {
1394   enum mali_blend_operand_a            a;
1395   bool                                 negate_a;
1396   enum mali_blend_operand_b            b;
1397   bool                                 negate_b;
1398   enum mali_blend_operand_c            c;
1399   bool                                 invert_c;
1400};
1401
1402#define MALI_BLEND_FUNCTION_header              \
1403   0
1404
1405static inline void
1406MALI_BLEND_FUNCTION_print(FILE *fp, const struct MALI_BLEND_FUNCTION * values, unsigned indent)
1407{
1408   fprintf(fp, "%*sA: %s\n", indent, "", mali_blend_operand_a_as_str(values->a));
1409   fprintf(fp, "%*sNegate A: %s\n", indent, "", values->negate_a ? "true" : "false");
1410   fprintf(fp, "%*sB: %s\n", indent, "", mali_blend_operand_b_as_str(values->b));
1411   fprintf(fp, "%*sNegate B: %s\n", indent, "", values->negate_b ? "true" : "false");
1412   fprintf(fp, "%*sC: %s\n", indent, "", mali_blend_operand_c_as_str(values->c));
1413   fprintf(fp, "%*sInvert C: %s\n", indent, "", values->invert_c ? "true" : "false");
1414}
1415
1416struct MALI_BLEND_EQUATION {
1417   struct MALI_BLEND_FUNCTION           rgb;
1418   struct MALI_BLEND_FUNCTION           alpha;
1419   uint32_t                             color_mask;
1420};
1421
1422#define MALI_BLEND_EQUATION_header              \
1423   .rgb = { MALI_BLEND_FUNCTION_header },  \
1424   .alpha = { MALI_BLEND_FUNCTION_header }
1425
1426static inline void
1427MALI_BLEND_EQUATION_pack(uint32_t * restrict cl,
1428                         const struct MALI_BLEND_EQUATION * restrict values)
1429{
1430   cl[ 0] = __gen_uint(values->rgb.a, 0, 1) |
1431            __gen_uint(values->rgb.negate_a, 3, 3) |
1432            __gen_uint(values->rgb.b, 4, 5) |
1433            __gen_uint(values->rgb.negate_b, 7, 7) |
1434            __gen_uint(values->rgb.c, 8, 10) |
1435            __gen_uint(values->rgb.invert_c, 11, 11) |
1436            __gen_uint(values->alpha.a, 12, 13) |
1437            __gen_uint(values->alpha.negate_a, 15, 15) |
1438            __gen_uint(values->alpha.b, 16, 17) |
1439            __gen_uint(values->alpha.negate_b, 19, 19) |
1440            __gen_uint(values->alpha.c, 20, 22) |
1441            __gen_uint(values->alpha.invert_c, 23, 23) |
1442            __gen_uint(values->color_mask, 28, 31);
1443}
1444
1445
1446#define MALI_BLEND_EQUATION_LENGTH 4
1447struct mali_blend_equation_packed { uint32_t opaque[1]; };
1448static inline void
1449MALI_BLEND_EQUATION_unpack(const uint8_t * restrict cl,
1450                           struct MALI_BLEND_EQUATION * restrict values)
1451{
1452   if (((const uint32_t *) cl)[0] & 0xf044044) fprintf(stderr, "XXX: Invalid field of Blend Equation unpacked at word 0\n");
1453   values->rgb.a = (enum mali_blend_operand_a)__gen_unpack_uint(cl, 0, 1);
1454   values->rgb.negate_a = __gen_unpack_uint(cl, 3, 3);
1455   values->rgb.b = (enum mali_blend_operand_b)__gen_unpack_uint(cl, 4, 5);
1456   values->rgb.negate_b = __gen_unpack_uint(cl, 7, 7);
1457   values->rgb.c = (enum mali_blend_operand_c)__gen_unpack_uint(cl, 8, 10);
1458   values->rgb.invert_c = __gen_unpack_uint(cl, 11, 11);
1459   values->alpha.a = (enum mali_blend_operand_a)__gen_unpack_uint(cl, 12, 13);
1460   values->alpha.negate_a = __gen_unpack_uint(cl, 15, 15);
1461   values->alpha.b = (enum mali_blend_operand_b)__gen_unpack_uint(cl, 16, 17);
1462   values->alpha.negate_b = __gen_unpack_uint(cl, 19, 19);
1463   values->alpha.c = (enum mali_blend_operand_c)__gen_unpack_uint(cl, 20, 22);
1464   values->alpha.invert_c = __gen_unpack_uint(cl, 23, 23);
1465   values->color_mask = __gen_unpack_uint(cl, 28, 31);
1466}
1467
1468static inline void
1469MALI_BLEND_EQUATION_print(FILE *fp, const struct MALI_BLEND_EQUATION * values, unsigned indent)
1470{
1471   fprintf(fp, "%*sRGB:\n", indent, "");
1472   MALI_BLEND_FUNCTION_print(fp, &values->rgb, indent + 2);
1473   fprintf(fp, "%*sAlpha:\n", indent, "");
1474   MALI_BLEND_FUNCTION_print(fp, &values->alpha, indent + 2);
1475   fprintf(fp, "%*sColor Mask: %u\n", indent, "", values->color_mask);
1476}
1477
1478enum mali_register_file_format {
1479        MALI_REGISTER_FILE_FORMAT_F16        =      0,
1480        MALI_REGISTER_FILE_FORMAT_F32        =      1,
1481        MALI_REGISTER_FILE_FORMAT_I32        =      2,
1482        MALI_REGISTER_FILE_FORMAT_U32        =      3,
1483        MALI_REGISTER_FILE_FORMAT_I16        =      4,
1484        MALI_REGISTER_FILE_FORMAT_U16        =      5,
1485};
1486
1487static inline const char *
1488mali_register_file_format_as_str(enum mali_register_file_format imm)
1489{
1490    switch (imm) {
1491    case MALI_REGISTER_FILE_FORMAT_F16: return "F16";
1492    case MALI_REGISTER_FILE_FORMAT_F32: return "F32";
1493    case MALI_REGISTER_FILE_FORMAT_I32: return "I32";
1494    case MALI_REGISTER_FILE_FORMAT_U32: return "U32";
1495    case MALI_REGISTER_FILE_FORMAT_I16: return "I16";
1496    case MALI_REGISTER_FILE_FORMAT_U16: return "U16";
1497    default: return "XXX: INVALID";
1498    }
1499}
1500
1501enum mali_message_type {
1502        MALI_MESSAGE_TYPE_DISABLED           =      0,
1503        MALI_MESSAGE_TYPE_LD_VAR             =      1,
1504        MALI_MESSAGE_TYPE_VAR_TEX            =      2,
1505};
1506
1507static inline const char *
1508mali_message_type_as_str(enum mali_message_type imm)
1509{
1510    switch (imm) {
1511    case MALI_MESSAGE_TYPE_DISABLED: return "Disabled";
1512    case MALI_MESSAGE_TYPE_LD_VAR: return "LD_VAR";
1513    case MALI_MESSAGE_TYPE_VAR_TEX: return "VAR_TEX";
1514    default: return "XXX: INVALID";
1515    }
1516}
1517
1518enum mali_message_preload_register_format {
1519        MALI_MESSAGE_PRELOAD_REGISTER_FORMAT_F32 =      0,
1520        MALI_MESSAGE_PRELOAD_REGISTER_FORMAT_F16 =      1,
1521};
1522
1523static inline const char *
1524mali_message_preload_register_format_as_str(enum mali_message_preload_register_format imm)
1525{
1526    switch (imm) {
1527    case MALI_MESSAGE_PRELOAD_REGISTER_FORMAT_F32: return "F32";
1528    case MALI_MESSAGE_PRELOAD_REGISTER_FORMAT_F16: return "F16";
1529    default: return "XXX: INVALID";
1530    }
1531}
1532
1533enum mali_blend_mode {
1534        MALI_BLEND_MODE_SHADER               =      0,
1535        MALI_BLEND_MODE_OPAQUE               =      1,
1536        MALI_BLEND_MODE_FIXED_FUNCTION       =      2,
1537        MALI_BLEND_MODE_OFF                  =      3,
1538};
1539
1540static inline const char *
1541mali_blend_mode_as_str(enum mali_blend_mode imm)
1542{
1543    switch (imm) {
1544    case MALI_BLEND_MODE_SHADER: return "Shader";
1545    case MALI_BLEND_MODE_OPAQUE: return "Opaque";
1546    case MALI_BLEND_MODE_FIXED_FUNCTION: return "Fixed-Function";
1547    case MALI_BLEND_MODE_OFF: return "Off";
1548    default: return "XXX: INVALID";
1549    }
1550}
1551
1552struct MALI_BLEND_SHADER {
1553   uint32_t                             return_value;
1554   uint32_t                             pc;
1555};
1556
1557#define MALI_BLEND_SHADER_header                \
1558   0
1559
1560static inline void
1561MALI_BLEND_SHADER_pack(uint32_t * restrict cl,
1562                       const struct MALI_BLEND_SHADER * restrict values)
1563{
1564   assert((values->return_value & 0x7) == 0);
1565   assert((values->pc & 0xf) == 0);
1566   cl[ 0] = __gen_uint(values->return_value >> 3, 3, 31);
1567   cl[ 1] = __gen_uint(values->pc >> 4, 4, 31);
1568}
1569
1570
1571#define MALI_BLEND_SHADER_LENGTH 8
1572struct mali_blend_shader_packed { uint32_t opaque[2]; };
1573static inline void
1574MALI_BLEND_SHADER_unpack(const uint8_t * restrict cl,
1575                         struct MALI_BLEND_SHADER * restrict values)
1576{
1577   if (((const uint32_t *) cl)[0] & 0x7) fprintf(stderr, "XXX: Invalid field of Blend Shader unpacked at word 0\n");
1578   if (((const uint32_t *) cl)[1] & 0xf) fprintf(stderr, "XXX: Invalid field of Blend Shader unpacked at word 1\n");
1579   values->return_value = __gen_unpack_uint(cl, 3, 31) << 3;
1580   values->pc = __gen_unpack_uint(cl, 36, 63) << 4;
1581}
1582
1583static inline void
1584MALI_BLEND_SHADER_print(FILE *fp, const struct MALI_BLEND_SHADER * values, unsigned indent)
1585{
1586   fprintf(fp, "%*sReturn Value: %u\n", indent, "", values->return_value);
1587   fprintf(fp, "%*sPC: %u\n", indent, "", values->pc);
1588}
1589
1590struct MALI_INTERNAL_CONVERSION {
1591   uint32_t                             memory_format;
1592   bool                                 raw;
1593   enum mali_register_file_format       register_format;
1594};
1595
1596#define MALI_INTERNAL_CONVERSION_header         \
1597   0
1598
1599static inline void
1600MALI_INTERNAL_CONVERSION_pack(uint32_t * restrict cl,
1601                              const struct MALI_INTERNAL_CONVERSION * restrict values)
1602{
1603   cl[ 0] = __gen_uint(values->memory_format, 0, 21) |
1604            __gen_uint(values->raw, 22, 22) |
1605            __gen_uint(values->register_format, 24, 26);
1606}
1607
1608
1609#define MALI_INTERNAL_CONVERSION_LENGTH 4
1610struct mali_internal_conversion_packed { uint32_t opaque[1]; };
1611static inline void
1612MALI_INTERNAL_CONVERSION_unpack(const uint8_t * restrict cl,
1613                                struct MALI_INTERNAL_CONVERSION * restrict values)
1614{
1615   if (((const uint32_t *) cl)[0] & 0xf8800000) fprintf(stderr, "XXX: Invalid field of Internal Conversion unpacked at word 0\n");
1616   values->memory_format = __gen_unpack_uint(cl, 0, 21);
1617   values->raw = __gen_unpack_uint(cl, 22, 22);
1618   values->register_format = (enum mali_register_file_format)__gen_unpack_uint(cl, 24, 26);
1619}
1620
1621static inline void
1622MALI_INTERNAL_CONVERSION_print(FILE *fp, const struct MALI_INTERNAL_CONVERSION * values, unsigned indent)
1623{
1624   mali_pixel_format_print(fp, values->memory_format);
1625   fprintf(fp, "%*sRaw: %s\n", indent, "", values->raw ? "true" : "false");
1626   fprintf(fp, "%*sRegister Format: %s\n", indent, "", mali_register_file_format_as_str(values->register_format));
1627}
1628
1629struct MALI_BLEND_FIXED_FUNCTION {
1630   uint32_t                             num_comps;
1631   bool                                 alpha_zero_nop;
1632   bool                                 alpha_one_store;
1633   uint32_t                             rt;
1634#define MALI_BIFROST_BLEND_MAX_RT                8
1635   struct MALI_INTERNAL_CONVERSION      conversion;
1636};
1637
1638#define MALI_BLEND_FIXED_FUNCTION_header        \
1639   .num_comps = 1,  \
1640   .conversion = { MALI_INTERNAL_CONVERSION_header }
1641
1642static inline void
1643MALI_BLEND_FIXED_FUNCTION_pack(uint32_t * restrict cl,
1644                               const struct MALI_BLEND_FIXED_FUNCTION * restrict values)
1645{
1646   assert(values->num_comps >= 1);
1647   cl[ 0] = __gen_uint(values->num_comps - 1, 3, 4) |
1648            __gen_uint(values->alpha_zero_nop, 5, 5) |
1649            __gen_uint(values->alpha_one_store, 6, 6) |
1650            __gen_uint(values->rt, 16, 19);
1651   cl[ 1] = __gen_uint(values->conversion.memory_format, 0, 21) |
1652            __gen_uint(values->conversion.raw, 22, 22) |
1653            __gen_uint(values->conversion.register_format, 24, 26);
1654}
1655
1656
1657#define MALI_BLEND_FIXED_FUNCTION_LENGTH 8
1658struct mali_blend_fixed_function_packed { uint32_t opaque[2]; };
1659static inline void
1660MALI_BLEND_FIXED_FUNCTION_unpack(const uint8_t * restrict cl,
1661                                 struct MALI_BLEND_FIXED_FUNCTION * restrict values)
1662{
1663   if (((const uint32_t *) cl)[0] & 0xfff0ff87) fprintf(stderr, "XXX: Invalid field of Blend Fixed-Function unpacked at word 0\n");
1664   if (((const uint32_t *) cl)[1] & 0xf8800000) fprintf(stderr, "XXX: Invalid field of Blend Fixed-Function unpacked at word 1\n");
1665   values->num_comps = __gen_unpack_uint(cl, 3, 4) + 1;
1666   values->alpha_zero_nop = __gen_unpack_uint(cl, 5, 5);
1667   values->alpha_one_store = __gen_unpack_uint(cl, 6, 6);
1668   values->rt = __gen_unpack_uint(cl, 16, 19);
1669   values->conversion.memory_format = __gen_unpack_uint(cl, 32, 53);
1670   values->conversion.raw = __gen_unpack_uint(cl, 54, 54);
1671   values->conversion.register_format = (enum mali_register_file_format)__gen_unpack_uint(cl, 56, 58);
1672}
1673
1674static inline void
1675MALI_BLEND_FIXED_FUNCTION_print(FILE *fp, const struct MALI_BLEND_FIXED_FUNCTION * values, unsigned indent)
1676{
1677   fprintf(fp, "%*sNum Comps: %u\n", indent, "", values->num_comps);
1678   fprintf(fp, "%*sAlpha Zero NOP: %s\n", indent, "", values->alpha_zero_nop ? "true" : "false");
1679   fprintf(fp, "%*sAlpha One Store: %s\n", indent, "", values->alpha_one_store ? "true" : "false");
1680   fprintf(fp, "%*sRT: %u\n", indent, "", values->rt);
1681   fprintf(fp, "%*sConversion:\n", indent, "");
1682   MALI_INTERNAL_CONVERSION_print(fp, &values->conversion, indent + 2);
1683}
1684
1685struct MALI_INTERNAL_BLEND {
1686   enum mali_blend_mode                 mode;
1687   struct MALI_BLEND_SHADER             shader;
1688   struct MALI_BLEND_FIXED_FUNCTION     fixed_function;
1689};
1690
1691#define MALI_INTERNAL_BLEND_header              \
1692   .shader = { MALI_BLEND_SHADER_header },  \
1693   .fixed_function = { MALI_BLEND_FIXED_FUNCTION_header }
1694
1695static inline void
1696MALI_INTERNAL_BLEND_pack(uint32_t * restrict cl,
1697                         const struct MALI_INTERNAL_BLEND * restrict values)
1698{
1699   cl[ 0] = __gen_uint(values->mode, 0, 1) |
1700            __gen_uint(values->shader.return_value >> 3, 3, 31) |
1701            __gen_uint(values->fixed_function.num_comps - 1, 3, 4) |
1702            __gen_uint(values->fixed_function.alpha_zero_nop, 5, 5) |
1703            __gen_uint(values->fixed_function.alpha_one_store, 6, 6) |
1704            __gen_uint(values->fixed_function.rt, 16, 19);
1705   cl[ 1] = __gen_uint(values->shader.pc >> 4, 4, 31) |
1706            __gen_uint(values->fixed_function.conversion.memory_format, 0, 21) |
1707            __gen_uint(values->fixed_function.conversion.raw, 22, 22) |
1708            __gen_uint(values->fixed_function.conversion.register_format, 24, 26);
1709}
1710
1711
1712#define MALI_INTERNAL_BLEND_LENGTH 8
1713struct mali_internal_blend_packed { uint32_t opaque[2]; };
1714static inline void
1715MALI_INTERNAL_BLEND_unpack(const uint8_t * restrict cl,
1716                           struct MALI_INTERNAL_BLEND * restrict values)
1717{
1718   if (((const uint32_t *) cl)[0] & 0x4) fprintf(stderr, "XXX: Invalid field of Internal Blend unpacked at word 0\n");
1719   values->mode = (enum mali_blend_mode)__gen_unpack_uint(cl, 0, 1);
1720   values->shader.return_value = __gen_unpack_uint(cl, 3, 31) << 3;
1721   values->shader.pc = __gen_unpack_uint(cl, 36, 63) << 4;
1722   values->fixed_function.num_comps = __gen_unpack_uint(cl, 3, 4) + 1;
1723   values->fixed_function.alpha_zero_nop = __gen_unpack_uint(cl, 5, 5);
1724   values->fixed_function.alpha_one_store = __gen_unpack_uint(cl, 6, 6);
1725   values->fixed_function.rt = __gen_unpack_uint(cl, 16, 19);
1726   values->fixed_function.conversion.memory_format = __gen_unpack_uint(cl, 32, 53);
1727   values->fixed_function.conversion.raw = __gen_unpack_uint(cl, 54, 54);
1728   values->fixed_function.conversion.register_format = (enum mali_register_file_format)__gen_unpack_uint(cl, 56, 58);
1729}
1730
1731static inline void
1732MALI_INTERNAL_BLEND_print(FILE *fp, const struct MALI_INTERNAL_BLEND * values, unsigned indent)
1733{
1734   fprintf(fp, "%*sMode: %s\n", indent, "", mali_blend_mode_as_str(values->mode));
1735   fprintf(fp, "%*sShader:\n", indent, "");
1736   MALI_BLEND_SHADER_print(fp, &values->shader, indent + 2);
1737   fprintf(fp, "%*sFixed-Function:\n", indent, "");
1738   MALI_BLEND_FIXED_FUNCTION_print(fp, &values->fixed_function, indent + 2);
1739}
1740
1741struct MALI_BLEND {
1742   bool                                 load_destination;
1743   bool                                 alpha_to_one;
1744   bool                                 enable;
1745   bool                                 srgb;
1746   bool                                 round_to_fb_precision;
1747   uint32_t                             constant;
1748   struct MALI_BLEND_EQUATION           equation;
1749   struct MALI_INTERNAL_BLEND           internal;
1750};
1751
1752#define MALI_BLEND_header                       \
1753   .load_destination = false,  \
1754   .enable = true,  \
1755   .srgb = false,  \
1756   .round_to_fb_precision = false,  \
1757   .equation = { MALI_BLEND_EQUATION_header },  \
1758   .internal = { MALI_INTERNAL_BLEND_header }
1759
1760static inline void
1761MALI_BLEND_pack(uint32_t * restrict cl,
1762                const struct MALI_BLEND * restrict values)
1763{
1764   cl[ 0] = __gen_uint(values->load_destination, 0, 0) |
1765            __gen_uint(values->alpha_to_one, 8, 8) |
1766            __gen_uint(values->enable, 9, 9) |
1767            __gen_uint(values->srgb, 10, 10) |
1768            __gen_uint(values->round_to_fb_precision, 11, 11) |
1769            __gen_uint(values->constant, 16, 31);
1770   cl[ 1] = __gen_uint(values->equation.rgb.a, 0, 1) |
1771            __gen_uint(values->equation.rgb.negate_a, 3, 3) |
1772            __gen_uint(values->equation.rgb.b, 4, 5) |
1773            __gen_uint(values->equation.rgb.negate_b, 7, 7) |
1774            __gen_uint(values->equation.rgb.c, 8, 10) |
1775            __gen_uint(values->equation.rgb.invert_c, 11, 11) |
1776            __gen_uint(values->equation.alpha.a, 12, 13) |
1777            __gen_uint(values->equation.alpha.negate_a, 15, 15) |
1778            __gen_uint(values->equation.alpha.b, 16, 17) |
1779            __gen_uint(values->equation.alpha.negate_b, 19, 19) |
1780            __gen_uint(values->equation.alpha.c, 20, 22) |
1781            __gen_uint(values->equation.alpha.invert_c, 23, 23) |
1782            __gen_uint(values->equation.color_mask, 28, 31);
1783   cl[ 2] = __gen_uint(values->internal.mode, 0, 1) |
1784            __gen_uint(values->internal.shader.return_value >> 3, 3, 31) |
1785            __gen_uint(values->internal.fixed_function.num_comps - 1, 3, 4) |
1786            __gen_uint(values->internal.fixed_function.alpha_zero_nop, 5, 5) |
1787            __gen_uint(values->internal.fixed_function.alpha_one_store, 6, 6) |
1788            __gen_uint(values->internal.fixed_function.rt, 16, 19);
1789   cl[ 3] = __gen_uint(values->internal.shader.pc >> 4, 4, 31) |
1790            __gen_uint(values->internal.fixed_function.conversion.memory_format, 0, 21) |
1791            __gen_uint(values->internal.fixed_function.conversion.raw, 22, 22) |
1792            __gen_uint(values->internal.fixed_function.conversion.register_format, 24, 26);
1793}
1794
1795
1796#define MALI_BLEND_LENGTH 16
1797#define MALI_BLEND_ALIGN 16
1798struct mali_blend_packed { uint32_t opaque[4]; };
1799static inline void
1800MALI_BLEND_unpack(const uint8_t * restrict cl,
1801                  struct MALI_BLEND * restrict values)
1802{
1803   if (((const uint32_t *) cl)[0] & 0xf0fe) fprintf(stderr, "XXX: Invalid field of Blend unpacked at word 0\n");
1804   if (((const uint32_t *) cl)[1] & 0xf044044) fprintf(stderr, "XXX: Invalid field of Blend unpacked at word 1\n");
1805   if (((const uint32_t *) cl)[2] & 0x4) fprintf(stderr, "XXX: Invalid field of Blend unpacked at word 2\n");
1806   values->load_destination = __gen_unpack_uint(cl, 0, 0);
1807   values->alpha_to_one = __gen_unpack_uint(cl, 8, 8);
1808   values->enable = __gen_unpack_uint(cl, 9, 9);
1809   values->srgb = __gen_unpack_uint(cl, 10, 10);
1810   values->round_to_fb_precision = __gen_unpack_uint(cl, 11, 11);
1811   values->constant = __gen_unpack_uint(cl, 16, 31);
1812   values->equation.rgb.a = (enum mali_blend_operand_a)__gen_unpack_uint(cl, 32, 33);
1813   values->equation.rgb.negate_a = __gen_unpack_uint(cl, 35, 35);
1814   values->equation.rgb.b = (enum mali_blend_operand_b)__gen_unpack_uint(cl, 36, 37);
1815   values->equation.rgb.negate_b = __gen_unpack_uint(cl, 39, 39);
1816   values->equation.rgb.c = (enum mali_blend_operand_c)__gen_unpack_uint(cl, 40, 42);
1817   values->equation.rgb.invert_c = __gen_unpack_uint(cl, 43, 43);
1818   values->equation.alpha.a = (enum mali_blend_operand_a)__gen_unpack_uint(cl, 44, 45);
1819   values->equation.alpha.negate_a = __gen_unpack_uint(cl, 47, 47);
1820   values->equation.alpha.b = (enum mali_blend_operand_b)__gen_unpack_uint(cl, 48, 49);
1821   values->equation.alpha.negate_b = __gen_unpack_uint(cl, 51, 51);
1822   values->equation.alpha.c = (enum mali_blend_operand_c)__gen_unpack_uint(cl, 52, 54);
1823   values->equation.alpha.invert_c = __gen_unpack_uint(cl, 55, 55);
1824   values->equation.color_mask = __gen_unpack_uint(cl, 60, 63);
1825   values->internal.mode = (enum mali_blend_mode)__gen_unpack_uint(cl, 64, 65);
1826   values->internal.shader.return_value = __gen_unpack_uint(cl, 67, 95) << 3;
1827   values->internal.shader.pc = __gen_unpack_uint(cl, 100, 127) << 4;
1828   values->internal.fixed_function.num_comps = __gen_unpack_uint(cl, 67, 68) + 1;
1829   values->internal.fixed_function.alpha_zero_nop = __gen_unpack_uint(cl, 69, 69);
1830   values->internal.fixed_function.alpha_one_store = __gen_unpack_uint(cl, 70, 70);
1831   values->internal.fixed_function.rt = __gen_unpack_uint(cl, 80, 83);
1832   values->internal.fixed_function.conversion.memory_format = __gen_unpack_uint(cl, 96, 117);
1833   values->internal.fixed_function.conversion.raw = __gen_unpack_uint(cl, 118, 118);
1834   values->internal.fixed_function.conversion.register_format = (enum mali_register_file_format)__gen_unpack_uint(cl, 120, 122);
1835}
1836
1837static inline void
1838MALI_BLEND_print(FILE *fp, const struct MALI_BLEND * values, unsigned indent)
1839{
1840   fprintf(fp, "%*sLoad Destination: %s\n", indent, "", values->load_destination ? "true" : "false");
1841   fprintf(fp, "%*sAlpha To One: %s\n", indent, "", values->alpha_to_one ? "true" : "false");
1842   fprintf(fp, "%*sEnable: %s\n", indent, "", values->enable ? "true" : "false");
1843   fprintf(fp, "%*ssRGB: %s\n", indent, "", values->srgb ? "true" : "false");
1844   fprintf(fp, "%*sRound to FB precision: %s\n", indent, "", values->round_to_fb_precision ? "true" : "false");
1845   fprintf(fp, "%*sConstant: %u\n", indent, "", values->constant);
1846   fprintf(fp, "%*sEquation:\n", indent, "");
1847   MALI_BLEND_EQUATION_print(fp, &values->equation, indent + 2);
1848   fprintf(fp, "%*sInternal:\n", indent, "");
1849   MALI_INTERNAL_BLEND_print(fp, &values->internal, indent + 2);
1850}
1851
1852struct MALI_INVOCATION {
1853   uint32_t                             invocations;
1854   uint32_t                             size_y_shift;
1855   uint32_t                             size_z_shift;
1856   uint32_t                             workgroups_x_shift;
1857   uint32_t                             workgroups_y_shift;
1858   uint32_t                             workgroups_z_shift;
1859   uint32_t                             thread_group_split;
1860#define MALI_SPLIT_MIN_EFFICIENT                 2
1861};
1862
1863#define MALI_INVOCATION_header                  \
1864   0
1865
1866static inline void
1867MALI_INVOCATION_pack(uint32_t * restrict cl,
1868                     const struct MALI_INVOCATION * restrict values)
1869{
1870   cl[ 0] = __gen_uint(values->invocations, 0, 31);
1871   cl[ 1] = __gen_uint(values->size_y_shift, 0, 4) |
1872            __gen_uint(values->size_z_shift, 5, 9) |
1873            __gen_uint(values->workgroups_x_shift, 10, 15) |
1874            __gen_uint(values->workgroups_y_shift, 16, 21) |
1875            __gen_uint(values->workgroups_z_shift, 22, 27) |
1876            __gen_uint(values->thread_group_split, 28, 31);
1877}
1878
1879
1880#define MALI_INVOCATION_LENGTH 8
1881struct mali_invocation_packed { uint32_t opaque[2]; };
1882static inline void
1883MALI_INVOCATION_unpack(const uint8_t * restrict cl,
1884                       struct MALI_INVOCATION * restrict values)
1885{
1886   values->invocations = __gen_unpack_uint(cl, 0, 31);
1887   values->size_y_shift = __gen_unpack_uint(cl, 32, 36);
1888   values->size_z_shift = __gen_unpack_uint(cl, 37, 41);
1889   values->workgroups_x_shift = __gen_unpack_uint(cl, 42, 47);
1890   values->workgroups_y_shift = __gen_unpack_uint(cl, 48, 53);
1891   values->workgroups_z_shift = __gen_unpack_uint(cl, 54, 59);
1892   values->thread_group_split = __gen_unpack_uint(cl, 60, 63);
1893}
1894
1895static inline void
1896MALI_INVOCATION_print(FILE *fp, const struct MALI_INVOCATION * values, unsigned indent)
1897{
1898   fprintf(fp, "%*sInvocations: %u\n", indent, "", values->invocations);
1899   fprintf(fp, "%*sSize Y shift: %u\n", indent, "", values->size_y_shift);
1900   fprintf(fp, "%*sSize Z shift: %u\n", indent, "", values->size_z_shift);
1901   fprintf(fp, "%*sWorkgroups X shift: %u\n", indent, "", values->workgroups_x_shift);
1902   fprintf(fp, "%*sWorkgroups Y shift: %u\n", indent, "", values->workgroups_y_shift);
1903   fprintf(fp, "%*sWorkgroups Z shift: %u\n", indent, "", values->workgroups_z_shift);
1904   fprintf(fp, "%*sThread group split: %u\n", indent, "", values->thread_group_split);
1905}
1906
1907enum mali_point_size_array_format {
1908        MALI_POINT_SIZE_ARRAY_FORMAT_NONE    =      0,
1909        MALI_POINT_SIZE_ARRAY_FORMAT_FP16    =      2,
1910        MALI_POINT_SIZE_ARRAY_FORMAT_FP32    =      3,
1911};
1912
1913static inline const char *
1914mali_point_size_array_format_as_str(enum mali_point_size_array_format imm)
1915{
1916    switch (imm) {
1917    case MALI_POINT_SIZE_ARRAY_FORMAT_NONE: return "None";
1918    case MALI_POINT_SIZE_ARRAY_FORMAT_FP16: return "FP16";
1919    case MALI_POINT_SIZE_ARRAY_FORMAT_FP32: return "FP32";
1920    default: return "XXX: INVALID";
1921    }
1922}
1923
1924enum mali_primitive_restart {
1925        MALI_PRIMITIVE_RESTART_NONE          =      0,
1926        MALI_PRIMITIVE_RESTART_IMPLICIT      =      2,
1927        MALI_PRIMITIVE_RESTART_EXPLICIT      =      3,
1928};
1929
1930static inline const char *
1931mali_primitive_restart_as_str(enum mali_primitive_restart imm)
1932{
1933    switch (imm) {
1934    case MALI_PRIMITIVE_RESTART_NONE: return "None";
1935    case MALI_PRIMITIVE_RESTART_IMPLICIT: return "Implicit";
1936    case MALI_PRIMITIVE_RESTART_EXPLICIT: return "Explicit";
1937    default: return "XXX: INVALID";
1938    }
1939}
1940
1941struct MALI_PRIMITIVE {
1942   enum mali_draw_mode                  draw_mode;
1943   enum mali_index_type                 index_type;
1944   enum mali_point_size_array_format    point_size_array_format;
1945   bool                                 primitive_index_enable;
1946   bool                                 primitive_index_writeback;
1947   bool                                 first_provoking_vertex;
1948   bool                                 low_depth_cull;
1949   bool                                 high_depth_cull;
1950   bool                                 secondary_shader;
1951   enum mali_primitive_restart          primitive_restart;
1952   uint32_t                             job_task_split;
1953   uint32_t                             base_vertex_offset;
1954   uint32_t                             primitive_restart_index;
1955   uint32_t                             index_count;
1956   uint64_t                             indices;
1957};
1958
1959#define MALI_PRIMITIVE_header                   \
1960   .draw_mode = MALI_DRAW_MODE_NONE,  \
1961   .index_type = MALI_INDEX_TYPE_NONE,  \
1962   .first_provoking_vertex = true,  \
1963   .low_depth_cull = true,  \
1964   .high_depth_cull = true
1965
1966static inline void
1967MALI_PRIMITIVE_pack(uint32_t * restrict cl,
1968                    const struct MALI_PRIMITIVE * restrict values)
1969{
1970   assert(values->index_count >= 1);
1971   cl[ 0] = __gen_uint(values->draw_mode, 0, 7) |
1972            __gen_uint(values->index_type, 8, 10) |
1973            __gen_uint(values->point_size_array_format, 11, 12) |
1974            __gen_uint(values->primitive_index_enable, 13, 13) |
1975            __gen_uint(values->primitive_index_writeback, 14, 14) |
1976            __gen_uint(values->first_provoking_vertex, 15, 15) |
1977            __gen_uint(values->low_depth_cull, 16, 16) |
1978            __gen_uint(values->high_depth_cull, 17, 17) |
1979            __gen_uint(values->secondary_shader, 18, 18) |
1980            __gen_uint(values->primitive_restart, 19, 20) |
1981            __gen_uint(values->job_task_split, 26, 31);
1982   cl[ 1] = __gen_uint(values->base_vertex_offset, 0, 31);
1983   cl[ 2] = __gen_uint(values->primitive_restart_index, 0, 31);
1984   cl[ 3] = __gen_uint(values->index_count - 1, 0, 31);
1985   cl[ 4] = __gen_uint(values->indices, 0, 63);
1986   cl[ 5] = __gen_uint(values->indices, 0, 63) >> 32;
1987}
1988
1989
1990#define MALI_PRIMITIVE_LENGTH 24
1991struct mali_primitive_packed { uint32_t opaque[6]; };
1992static inline void
1993MALI_PRIMITIVE_unpack(const uint8_t * restrict cl,
1994                      struct MALI_PRIMITIVE * restrict values)
1995{
1996   if (((const uint32_t *) cl)[0] & 0x3e00000) fprintf(stderr, "XXX: Invalid field of Primitive unpacked at word 0\n");
1997   values->draw_mode = (enum mali_draw_mode)__gen_unpack_uint(cl, 0, 7);
1998   values->index_type = (enum mali_index_type)__gen_unpack_uint(cl, 8, 10);
1999   values->point_size_array_format = (enum mali_point_size_array_format)__gen_unpack_uint(cl, 11, 12);
2000   values->primitive_index_enable = __gen_unpack_uint(cl, 13, 13);
2001   values->primitive_index_writeback = __gen_unpack_uint(cl, 14, 14);
2002   values->first_provoking_vertex = __gen_unpack_uint(cl, 15, 15);
2003   values->low_depth_cull = __gen_unpack_uint(cl, 16, 16);
2004   values->high_depth_cull = __gen_unpack_uint(cl, 17, 17);
2005   values->secondary_shader = __gen_unpack_uint(cl, 18, 18);
2006   values->primitive_restart = (enum mali_primitive_restart)__gen_unpack_uint(cl, 19, 20);
2007   values->job_task_split = __gen_unpack_uint(cl, 26, 31);
2008   values->base_vertex_offset = __gen_unpack_uint(cl, 32, 63);
2009   values->primitive_restart_index = __gen_unpack_uint(cl, 64, 95);
2010   values->index_count = __gen_unpack_uint(cl, 96, 127) + 1;
2011   values->indices = __gen_unpack_uint(cl, 128, 191);
2012}
2013
2014static inline void
2015MALI_PRIMITIVE_print(FILE *fp, const struct MALI_PRIMITIVE * values, unsigned indent)
2016{
2017   fprintf(fp, "%*sDraw mode: %s\n", indent, "", mali_draw_mode_as_str(values->draw_mode));
2018   fprintf(fp, "%*sIndex type: %s\n", indent, "", mali_index_type_as_str(values->index_type));
2019   fprintf(fp, "%*sPoint size array format: %s\n", indent, "", mali_point_size_array_format_as_str(values->point_size_array_format));
2020   fprintf(fp, "%*sPrimitive Index Enable: %s\n", indent, "", values->primitive_index_enable ? "true" : "false");
2021   fprintf(fp, "%*sPrimitive Index Writeback: %s\n", indent, "", values->primitive_index_writeback ? "true" : "false");
2022   fprintf(fp, "%*sFirst provoking vertex: %s\n", indent, "", values->first_provoking_vertex ? "true" : "false");
2023   fprintf(fp, "%*sLow Depth Cull: %s\n", indent, "", values->low_depth_cull ? "true" : "false");
2024   fprintf(fp, "%*sHigh Depth Cull: %s\n", indent, "", values->high_depth_cull ? "true" : "false");
2025   fprintf(fp, "%*sSecondary Shader: %s\n", indent, "", values->secondary_shader ? "true" : "false");
2026   fprintf(fp, "%*sPrimitive restart: %s\n", indent, "", mali_primitive_restart_as_str(values->primitive_restart));
2027   fprintf(fp, "%*sJob Task Split: %u\n", indent, "", values->job_task_split);
2028   fprintf(fp, "%*sBase vertex offset: %u\n", indent, "", values->base_vertex_offset);
2029   fprintf(fp, "%*sPrimitive Restart Index: %u\n", indent, "", values->primitive_restart_index);
2030   fprintf(fp, "%*sIndex count: %u\n", indent, "", values->index_count);
2031   fprintf(fp, "%*sIndices: 0x%" PRIx64 "\n", indent, "", values->indices);
2032}
2033
2034struct MALI_DRAW {
2035   bool                                 four_components_per_vertex;
2036   bool                                 draw_descriptor_is_64b;
2037   enum mali_occlusion_mode             occlusion_query;
2038   bool                                 front_face_ccw;
2039   bool                                 cull_front_face;
2040   bool                                 cull_back_face;
2041   uint32_t                             flat_shading_vertex;
2042   bool                                 exclude_filtered_perf_counters;
2043   bool                                 primitive_barrier;
2044   bool                                 clean_fragment_write;
2045   uint32_t                             instance_size;
2046   uint32_t                             instance_primitive_size;
2047   uint32_t                             offset_start;
2048   uint32_t                             primitive_index_base;
2049   uint64_t                             position;
2050   uint64_t                             uniform_buffers;
2051   uint64_t                             textures;
2052   uint64_t                             samplers;
2053   uint64_t                             push_uniforms;
2054   uint64_t                             state;
2055   uint64_t                             attribute_buffers;
2056   uint64_t                             attributes;
2057   uint64_t                             varying_buffers;
2058   uint64_t                             varyings;
2059   uint64_t                             viewport;
2060   uint64_t                             occlusion;
2061   uint64_t                             thread_storage;
2062   uint64_t                             fbd;
2063};
2064
2065#define MALI_DRAW_header                        \
2066   .occlusion_query = MALI_OCCLUSION_MODE_DISABLED,  \
2067   .instance_size = 1,  \
2068   .instance_primitive_size = 1
2069
2070static inline void
2071MALI_DRAW_pack(uint32_t * restrict cl,
2072               const struct MALI_DRAW * restrict values)
2073{
2074   cl[ 0] = __gen_uint(values->four_components_per_vertex, 0, 0) |
2075            __gen_uint(values->draw_descriptor_is_64b, 1, 1) |
2076            __gen_uint(values->occlusion_query, 3, 4) |
2077            __gen_uint(values->front_face_ccw, 5, 5) |
2078            __gen_uint(values->cull_front_face, 6, 6) |
2079            __gen_uint(values->cull_back_face, 7, 7) |
2080            __gen_uint(values->flat_shading_vertex, 8, 8) |
2081            __gen_uint(values->exclude_filtered_perf_counters, 9, 9) |
2082            __gen_uint(values->primitive_barrier, 10, 10) |
2083            __gen_uint(values->clean_fragment_write, 11, 11) |
2084            __gen_padded(values->instance_size, 16, 23) |
2085            __gen_padded(values->instance_primitive_size, 24, 31);
2086   cl[ 1] = __gen_uint(values->offset_start, 0, 31);
2087   cl[ 2] = __gen_uint(values->primitive_index_base, 0, 31);
2088   cl[ 3] = 0;
2089   cl[ 4] = __gen_uint(values->position, 0, 63);
2090   cl[ 5] = __gen_uint(values->position, 0, 63) >> 32;
2091   cl[ 6] = __gen_uint(values->uniform_buffers, 0, 63);
2092   cl[ 7] = __gen_uint(values->uniform_buffers, 0, 63) >> 32;
2093   cl[ 8] = __gen_uint(values->textures, 0, 63);
2094   cl[ 9] = __gen_uint(values->textures, 0, 63) >> 32;
2095   cl[10] = __gen_uint(values->samplers, 0, 63);
2096   cl[11] = __gen_uint(values->samplers, 0, 63) >> 32;
2097   cl[12] = __gen_uint(values->push_uniforms, 0, 63);
2098   cl[13] = __gen_uint(values->push_uniforms, 0, 63) >> 32;
2099   cl[14] = __gen_uint(values->state, 0, 63);
2100   cl[15] = __gen_uint(values->state, 0, 63) >> 32;
2101   cl[16] = __gen_uint(values->attribute_buffers, 0, 63);
2102   cl[17] = __gen_uint(values->attribute_buffers, 0, 63) >> 32;
2103   cl[18] = __gen_uint(values->attributes, 0, 63);
2104   cl[19] = __gen_uint(values->attributes, 0, 63) >> 32;
2105   cl[20] = __gen_uint(values->varying_buffers, 0, 63);
2106   cl[21] = __gen_uint(values->varying_buffers, 0, 63) >> 32;
2107   cl[22] = __gen_uint(values->varyings, 0, 63);
2108   cl[23] = __gen_uint(values->varyings, 0, 63) >> 32;
2109   cl[24] = __gen_uint(values->viewport, 0, 63);
2110   cl[25] = __gen_uint(values->viewport, 0, 63) >> 32;
2111   cl[26] = __gen_uint(values->occlusion, 0, 63);
2112   cl[27] = __gen_uint(values->occlusion, 0, 63) >> 32;
2113   cl[28] = __gen_uint(values->thread_storage, 0, 63) |
2114            __gen_uint(values->fbd, 0, 63);
2115   cl[29] = __gen_uint(values->thread_storage, 0, 63) >> 32 |
2116            __gen_uint(values->fbd, 0, 63) >> 32;
2117   cl[30] = 0;
2118   cl[31] = 0;
2119}
2120
2121
2122#define MALI_DRAW_LENGTH 128
2123#define MALI_DRAW_ALIGN 64
2124struct mali_draw_packed { uint32_t opaque[32]; };
2125static inline void
2126MALI_DRAW_unpack(const uint8_t * restrict cl,
2127                 struct MALI_DRAW * restrict values)
2128{
2129   if (((const uint32_t *) cl)[0] & 0xf004) fprintf(stderr, "XXX: Invalid field of Draw unpacked at word 0\n");
2130   if (((const uint32_t *) cl)[3] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Draw unpacked at word 3\n");
2131   if (((const uint32_t *) cl)[30] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Draw unpacked at word 30\n");
2132   if (((const uint32_t *) cl)[31] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Draw unpacked at word 31\n");
2133   values->four_components_per_vertex = __gen_unpack_uint(cl, 0, 0);
2134   values->draw_descriptor_is_64b = __gen_unpack_uint(cl, 1, 1);
2135   values->occlusion_query = (enum mali_occlusion_mode)__gen_unpack_uint(cl, 3, 4);
2136   values->front_face_ccw = __gen_unpack_uint(cl, 5, 5);
2137   values->cull_front_face = __gen_unpack_uint(cl, 6, 6);
2138   values->cull_back_face = __gen_unpack_uint(cl, 7, 7);
2139   values->flat_shading_vertex = __gen_unpack_uint(cl, 8, 8);
2140   values->exclude_filtered_perf_counters = __gen_unpack_uint(cl, 9, 9);
2141   values->primitive_barrier = __gen_unpack_uint(cl, 10, 10);
2142   values->clean_fragment_write = __gen_unpack_uint(cl, 11, 11);
2143   values->instance_size = __gen_unpack_padded(cl, 16, 23);
2144   values->instance_primitive_size = __gen_unpack_padded(cl, 24, 31);
2145   values->offset_start = __gen_unpack_uint(cl, 32, 63);
2146   values->primitive_index_base = __gen_unpack_uint(cl, 64, 95);
2147   values->position = __gen_unpack_uint(cl, 128, 191);
2148   values->uniform_buffers = __gen_unpack_uint(cl, 192, 255);
2149   values->textures = __gen_unpack_uint(cl, 256, 319);
2150   values->samplers = __gen_unpack_uint(cl, 320, 383);
2151   values->push_uniforms = __gen_unpack_uint(cl, 384, 447);
2152   values->state = __gen_unpack_uint(cl, 448, 511);
2153   values->attribute_buffers = __gen_unpack_uint(cl, 512, 575);
2154   values->attributes = __gen_unpack_uint(cl, 576, 639);
2155   values->varying_buffers = __gen_unpack_uint(cl, 640, 703);
2156   values->varyings = __gen_unpack_uint(cl, 704, 767);
2157   values->viewport = __gen_unpack_uint(cl, 768, 831);
2158   values->occlusion = __gen_unpack_uint(cl, 832, 895);
2159   values->thread_storage = __gen_unpack_uint(cl, 896, 959);
2160   values->fbd = __gen_unpack_uint(cl, 896, 959);
2161}
2162
2163static inline void
2164MALI_DRAW_print(FILE *fp, const struct MALI_DRAW * values, unsigned indent)
2165{
2166   fprintf(fp, "%*sFour Components Per Vertex: %s\n", indent, "", values->four_components_per_vertex ? "true" : "false");
2167   fprintf(fp, "%*sDraw Descriptor Is 64b: %s\n", indent, "", values->draw_descriptor_is_64b ? "true" : "false");
2168   fprintf(fp, "%*sOcclusion query: %s\n", indent, "", mali_occlusion_mode_as_str(values->occlusion_query));
2169   fprintf(fp, "%*sFront face CCW: %s\n", indent, "", values->front_face_ccw ? "true" : "false");
2170   fprintf(fp, "%*sCull front face: %s\n", indent, "", values->cull_front_face ? "true" : "false");
2171   fprintf(fp, "%*sCull back face: %s\n", indent, "", values->cull_back_face ? "true" : "false");
2172   fprintf(fp, "%*sFlat Shading Vertex: %u\n", indent, "", values->flat_shading_vertex);
2173   fprintf(fp, "%*sExclude Filtered Perf Counters: %s\n", indent, "", values->exclude_filtered_perf_counters ? "true" : "false");
2174   fprintf(fp, "%*sPrimitive Barrier: %s\n", indent, "", values->primitive_barrier ? "true" : "false");
2175   fprintf(fp, "%*sClean Fragment Write: %s\n", indent, "", values->clean_fragment_write ? "true" : "false");
2176   fprintf(fp, "%*sInstance Size: %u\n", indent, "", values->instance_size);
2177   fprintf(fp, "%*sInstance Primitive Size: %u\n", indent, "", values->instance_primitive_size);
2178   fprintf(fp, "%*sOffset start: %u\n", indent, "", values->offset_start);
2179   fprintf(fp, "%*sPrimitive Index Base: %u\n", indent, "", values->primitive_index_base);
2180   fprintf(fp, "%*sPosition: 0x%" PRIx64 "\n", indent, "", values->position);
2181   fprintf(fp, "%*sUniform buffers: 0x%" PRIx64 "\n", indent, "", values->uniform_buffers);
2182   fprintf(fp, "%*sTextures: 0x%" PRIx64 "\n", indent, "", values->textures);
2183   fprintf(fp, "%*sSamplers: 0x%" PRIx64 "\n", indent, "", values->samplers);
2184   fprintf(fp, "%*sPush uniforms: 0x%" PRIx64 "\n", indent, "", values->push_uniforms);
2185   fprintf(fp, "%*sState: 0x%" PRIx64 "\n", indent, "", values->state);
2186   fprintf(fp, "%*sAttribute buffers: 0x%" PRIx64 "\n", indent, "", values->attribute_buffers);
2187   fprintf(fp, "%*sAttributes: 0x%" PRIx64 "\n", indent, "", values->attributes);
2188   fprintf(fp, "%*sVarying buffers: 0x%" PRIx64 "\n", indent, "", values->varying_buffers);
2189   fprintf(fp, "%*sVaryings: 0x%" PRIx64 "\n", indent, "", values->varyings);
2190   fprintf(fp, "%*sViewport: 0x%" PRIx64 "\n", indent, "", values->viewport);
2191   fprintf(fp, "%*sOcclusion: 0x%" PRIx64 "\n", indent, "", values->occlusion);
2192   fprintf(fp, "%*sThread Storage: 0x%" PRIx64 "\n", indent, "", values->thread_storage);
2193   fprintf(fp, "%*sFBD: 0x%" PRIx64 "\n", indent, "", values->fbd);
2194}
2195
2196struct MALI_SURFACE {
2197   uint64_t                             pointer;
2198};
2199
2200#define MALI_SURFACE_header                     \
2201   0
2202
2203static inline void
2204MALI_SURFACE_pack(uint32_t * restrict cl,
2205                  const struct MALI_SURFACE * restrict values)
2206{
2207   cl[ 0] = __gen_uint(values->pointer, 0, 63);
2208   cl[ 1] = __gen_uint(values->pointer, 0, 63) >> 32;
2209}
2210
2211
2212#define MALI_SURFACE_LENGTH 8
2213#define MALI_SURFACE_ALIGN 8
2214struct mali_surface_packed { uint32_t opaque[2]; };
2215static inline void
2216MALI_SURFACE_unpack(const uint8_t * restrict cl,
2217                    struct MALI_SURFACE * restrict values)
2218{
2219   values->pointer = __gen_unpack_uint(cl, 0, 63);
2220}
2221
2222static inline void
2223MALI_SURFACE_print(FILE *fp, const struct MALI_SURFACE * values, unsigned indent)
2224{
2225   fprintf(fp, "%*sPointer: 0x%" PRIx64 "\n", indent, "", values->pointer);
2226}
2227
2228struct MALI_SURFACE_WITH_STRIDE {
2229   uint64_t                             pointer;
2230   int32_t                              row_stride;
2231   int32_t                              surface_stride;
2232};
2233
2234#define MALI_SURFACE_WITH_STRIDE_header         \
2235   0
2236
2237static inline void
2238MALI_SURFACE_WITH_STRIDE_pack(uint32_t * restrict cl,
2239                              const struct MALI_SURFACE_WITH_STRIDE * restrict values)
2240{
2241   cl[ 0] = __gen_uint(values->pointer, 0, 63);
2242   cl[ 1] = __gen_uint(values->pointer, 0, 63) >> 32;
2243   cl[ 2] = __gen_sint(values->row_stride, 0, 31);
2244   cl[ 3] = __gen_sint(values->surface_stride, 0, 31);
2245}
2246
2247
2248#define MALI_SURFACE_WITH_STRIDE_LENGTH 16
2249#define MALI_SURFACE_WITH_STRIDE_ALIGN 8
2250struct mali_surface_with_stride_packed { uint32_t opaque[4]; };
2251static inline void
2252MALI_SURFACE_WITH_STRIDE_unpack(const uint8_t * restrict cl,
2253                                struct MALI_SURFACE_WITH_STRIDE * restrict values)
2254{
2255   values->pointer = __gen_unpack_uint(cl, 0, 63);
2256   values->row_stride = __gen_unpack_sint(cl, 64, 95);
2257   values->surface_stride = __gen_unpack_sint(cl, 96, 127);
2258}
2259
2260static inline void
2261MALI_SURFACE_WITH_STRIDE_print(FILE *fp, const struct MALI_SURFACE_WITH_STRIDE * values, unsigned indent)
2262{
2263   fprintf(fp, "%*sPointer: 0x%" PRIx64 "\n", indent, "", values->pointer);
2264   fprintf(fp, "%*sRow stride: %d\n", indent, "", values->row_stride);
2265   fprintf(fp, "%*sSurface stride: %d\n", indent, "", values->surface_stride);
2266}
2267
2268struct MALI_SAMPLER {
2269   uint32_t                             type;
2270   enum mali_wrap_mode                  wrap_mode_r;
2271   enum mali_wrap_mode                  wrap_mode_t;
2272   enum mali_wrap_mode                  wrap_mode_s;
2273   bool                                 round_to_nearest_even;
2274   bool                                 srgb_override;
2275   bool                                 seamless_cube_map;
2276   bool                                 clamp_integer_coordinates;
2277   bool                                 normalized_coordinates;
2278   bool                                 clamp_integer_array_indices;
2279   bool                                 minify_nearest;
2280   bool                                 magnify_nearest;
2281   bool                                 magnify_cutoff;
2282   enum mali_mipmap_mode                mipmap_mode;
2283   uint32_t                             minimum_lod;
2284   enum mali_func                       compare_function;
2285   uint32_t                             maximum_lod;
2286   int32_t                              lod_bias;
2287   uint32_t                             maximum_anisotropy;
2288   enum mali_lod_algorithm              lod_algorithm;
2289   uint32_t                             border_color_r;
2290   uint32_t                             border_color_g;
2291   uint32_t                             border_color_b;
2292   uint32_t                             border_color_a;
2293};
2294
2295#define MALI_SAMPLER_header                     \
2296   .type = 1,  \
2297   .wrap_mode_r = MALI_WRAP_MODE_CLAMP_TO_EDGE,  \
2298   .wrap_mode_t = MALI_WRAP_MODE_CLAMP_TO_EDGE,  \
2299   .wrap_mode_s = MALI_WRAP_MODE_CLAMP_TO_EDGE,  \
2300   .round_to_nearest_even = false,  \
2301   .srgb_override = false,  \
2302   .seamless_cube_map = true,  \
2303   .normalized_coordinates = true,  \
2304   .clamp_integer_array_indices = true,  \
2305   .minify_nearest = false,  \
2306   .magnify_nearest = false,  \
2307   .magnify_cutoff = false,  \
2308   .mipmap_mode = MALI_MIPMAP_MODE_NEAREST,  \
2309   .minimum_lod = 0,  \
2310   .compare_function = MALI_FUNC_NEVER,  \
2311   .maximum_lod = 0,  \
2312   .lod_bias = 0,  \
2313   .maximum_anisotropy = 1,  \
2314   .lod_algorithm = MALI_LOD_ALGORITHM_ISOTROPIC,  \
2315   .border_color_r = 0.0,  \
2316   .border_color_g = 0.0,  \
2317   .border_color_b = 0.0,  \
2318   .border_color_a = 0.0
2319
2320static inline void
2321MALI_SAMPLER_pack(uint32_t * restrict cl,
2322                  const struct MALI_SAMPLER * restrict values)
2323{
2324   assert(values->maximum_anisotropy >= 1);
2325   cl[ 0] = __gen_uint(values->type, 0, 3) |
2326            __gen_uint(values->wrap_mode_r, 8, 11) |
2327            __gen_uint(values->wrap_mode_t, 12, 15) |
2328            __gen_uint(values->wrap_mode_s, 16, 19) |
2329            __gen_uint(values->round_to_nearest_even, 21, 21) |
2330            __gen_uint(values->srgb_override, 22, 22) |
2331            __gen_uint(values->seamless_cube_map, 23, 23) |
2332            __gen_uint(values->clamp_integer_coordinates, 24, 24) |
2333            __gen_uint(values->normalized_coordinates, 25, 25) |
2334            __gen_uint(values->clamp_integer_array_indices, 26, 26) |
2335            __gen_uint(values->minify_nearest, 27, 27) |
2336            __gen_uint(values->magnify_nearest, 28, 28) |
2337            __gen_uint(values->magnify_cutoff, 29, 29) |
2338            __gen_uint(values->mipmap_mode, 30, 31);
2339   cl[ 1] = __gen_uint(values->minimum_lod, 0, 12) |
2340            __gen_uint(values->compare_function, 13, 15) |
2341            __gen_uint(values->maximum_lod, 16, 28);
2342   cl[ 2] = __gen_sint(values->lod_bias, 0, 15) |
2343            __gen_uint(values->maximum_anisotropy - 1, 16, 20) |
2344            __gen_uint(values->lod_algorithm, 24, 25);
2345   cl[ 3] = 0;
2346   cl[ 4] = __gen_uint(values->border_color_r, 0, 31);
2347   cl[ 5] = __gen_uint(values->border_color_g, 0, 31);
2348   cl[ 6] = __gen_uint(values->border_color_b, 0, 31);
2349   cl[ 7] = __gen_uint(values->border_color_a, 0, 31);
2350}
2351
2352
2353#define MALI_SAMPLER_LENGTH 32
2354#define MALI_SAMPLER_ALIGN 32
2355struct mali_sampler_packed { uint32_t opaque[8]; };
2356static inline void
2357MALI_SAMPLER_unpack(const uint8_t * restrict cl,
2358                    struct MALI_SAMPLER * restrict values)
2359{
2360   if (((const uint32_t *) cl)[0] & 0x1000f0) fprintf(stderr, "XXX: Invalid field of Sampler unpacked at word 0\n");
2361   if (((const uint32_t *) cl)[1] & 0xe0000000) fprintf(stderr, "XXX: Invalid field of Sampler unpacked at word 1\n");
2362   if (((const uint32_t *) cl)[2] & 0xfce00000) fprintf(stderr, "XXX: Invalid field of Sampler unpacked at word 2\n");
2363   if (((const uint32_t *) cl)[3] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Sampler unpacked at word 3\n");
2364   values->type = __gen_unpack_uint(cl, 0, 3);
2365   values->wrap_mode_r = (enum mali_wrap_mode)__gen_unpack_uint(cl, 8, 11);
2366   values->wrap_mode_t = (enum mali_wrap_mode)__gen_unpack_uint(cl, 12, 15);
2367   values->wrap_mode_s = (enum mali_wrap_mode)__gen_unpack_uint(cl, 16, 19);
2368   values->round_to_nearest_even = __gen_unpack_uint(cl, 21, 21);
2369   values->srgb_override = __gen_unpack_uint(cl, 22, 22);
2370   values->seamless_cube_map = __gen_unpack_uint(cl, 23, 23);
2371   values->clamp_integer_coordinates = __gen_unpack_uint(cl, 24, 24);
2372   values->normalized_coordinates = __gen_unpack_uint(cl, 25, 25);
2373   values->clamp_integer_array_indices = __gen_unpack_uint(cl, 26, 26);
2374   values->minify_nearest = __gen_unpack_uint(cl, 27, 27);
2375   values->magnify_nearest = __gen_unpack_uint(cl, 28, 28);
2376   values->magnify_cutoff = __gen_unpack_uint(cl, 29, 29);
2377   values->mipmap_mode = (enum mali_mipmap_mode)__gen_unpack_uint(cl, 30, 31);
2378   values->minimum_lod = __gen_unpack_uint(cl, 32, 44);
2379   values->compare_function = (enum mali_func)__gen_unpack_uint(cl, 45, 47);
2380   values->maximum_lod = __gen_unpack_uint(cl, 48, 60);
2381   values->lod_bias = __gen_unpack_sint(cl, 64, 79);
2382   values->maximum_anisotropy = __gen_unpack_uint(cl, 80, 84) + 1;
2383   values->lod_algorithm = (enum mali_lod_algorithm)__gen_unpack_uint(cl, 88, 89);
2384   values->border_color_r = __gen_unpack_uint(cl, 128, 159);
2385   values->border_color_g = __gen_unpack_uint(cl, 160, 191);
2386   values->border_color_b = __gen_unpack_uint(cl, 192, 223);
2387   values->border_color_a = __gen_unpack_uint(cl, 224, 255);
2388}
2389
2390static inline void
2391MALI_SAMPLER_print(FILE *fp, const struct MALI_SAMPLER * values, unsigned indent)
2392{
2393   fprintf(fp, "%*sType: %u\n", indent, "", values->type);
2394   fprintf(fp, "%*sWrap Mode R: %s\n", indent, "", mali_wrap_mode_as_str(values->wrap_mode_r));
2395   fprintf(fp, "%*sWrap Mode T: %s\n", indent, "", mali_wrap_mode_as_str(values->wrap_mode_t));
2396   fprintf(fp, "%*sWrap Mode S: %s\n", indent, "", mali_wrap_mode_as_str(values->wrap_mode_s));
2397   fprintf(fp, "%*sRound to nearest even: %s\n", indent, "", values->round_to_nearest_even ? "true" : "false");
2398   fprintf(fp, "%*ssRGB override: %s\n", indent, "", values->srgb_override ? "true" : "false");
2399   fprintf(fp, "%*sSeamless Cube Map: %s\n", indent, "", values->seamless_cube_map ? "true" : "false");
2400   fprintf(fp, "%*sClamp integer coordinates: %s\n", indent, "", values->clamp_integer_coordinates ? "true" : "false");
2401   fprintf(fp, "%*sNormalized Coordinates: %s\n", indent, "", values->normalized_coordinates ? "true" : "false");
2402   fprintf(fp, "%*sClamp integer array indices: %s\n", indent, "", values->clamp_integer_array_indices ? "true" : "false");
2403   fprintf(fp, "%*sMinify nearest: %s\n", indent, "", values->minify_nearest ? "true" : "false");
2404   fprintf(fp, "%*sMagnify nearest: %s\n", indent, "", values->magnify_nearest ? "true" : "false");
2405   fprintf(fp, "%*sMagnify cutoff: %s\n", indent, "", values->magnify_cutoff ? "true" : "false");
2406   fprintf(fp, "%*sMipmap Mode: %s\n", indent, "", mali_mipmap_mode_as_str(values->mipmap_mode));
2407   fprintf(fp, "%*sMinimum LOD: %u\n", indent, "", values->minimum_lod);
2408   fprintf(fp, "%*sCompare Function: %s\n", indent, "", mali_func_as_str(values->compare_function));
2409   fprintf(fp, "%*sMaximum LOD: %u\n", indent, "", values->maximum_lod);
2410   fprintf(fp, "%*sLOD bias: %d\n", indent, "", values->lod_bias);
2411   fprintf(fp, "%*sMaximum anisotropy: %u\n", indent, "", values->maximum_anisotropy);
2412   fprintf(fp, "%*sLOD algorithm: %s\n", indent, "", mali_lod_algorithm_as_str(values->lod_algorithm));
2413   fprintf(fp, "%*sBorder Color R: 0x%X (%f)\n", indent, "", values->border_color_r, uif(values->border_color_r));
2414   fprintf(fp, "%*sBorder Color G: 0x%X (%f)\n", indent, "", values->border_color_g, uif(values->border_color_g));
2415   fprintf(fp, "%*sBorder Color B: 0x%X (%f)\n", indent, "", values->border_color_b, uif(values->border_color_b));
2416   fprintf(fp, "%*sBorder Color A: 0x%X (%f)\n", indent, "", values->border_color_a, uif(values->border_color_a));
2417}
2418
2419struct MALI_TEXTURE {
2420   uint32_t                             type;
2421   enum mali_texture_dimension          dimension;
2422   bool                                 sample_corner_position;
2423   bool                                 normalize_coordinates;
2424   uint32_t                             format;
2425   uint32_t                             width;
2426   uint32_t                             height;
2427   uint32_t                             swizzle;
2428   enum mali_texture_layout             texel_ordering;
2429   uint32_t                             levels;
2430   uint32_t                             minimum_level;
2431   uint32_t                             minimum_lod;
2432   uint32_t                             sample_count;
2433   uint32_t                             maximum_lod;
2434   uint64_t                             surfaces;
2435   uint32_t                             array_size;
2436   uint32_t                             depth;
2437};
2438
2439#define MALI_TEXTURE_header                     \
2440   .type = 2,  \
2441   .sample_corner_position = false,  \
2442   .normalize_coordinates = false,  \
2443   .levels = 1,  \
2444   .minimum_lod = 0,  \
2445   .sample_count = 1,  \
2446   .maximum_lod = 0,  \
2447   .array_size = 1,  \
2448   .depth = 1
2449
2450static inline void
2451MALI_TEXTURE_pack(uint32_t * restrict cl,
2452                  const struct MALI_TEXTURE * restrict values)
2453{
2454   assert(values->width >= 1);
2455   assert(values->height >= 1);
2456   assert(values->levels >= 1);
2457   assert(util_is_power_of_two_nonzero(values->sample_count));
2458   assert(values->array_size >= 1);
2459   assert(values->depth >= 1);
2460   cl[ 0] = __gen_uint(values->type, 0, 3) |
2461            __gen_uint(values->dimension, 4, 5) |
2462            __gen_uint(values->sample_corner_position, 8, 8) |
2463            __gen_uint(values->normalize_coordinates, 9, 9) |
2464            __gen_uint(values->format, 10, 31);
2465   cl[ 1] = __gen_uint(values->width - 1, 0, 15) |
2466            __gen_uint(values->height - 1, 16, 31);
2467   cl[ 2] = __gen_uint(values->swizzle, 0, 11) |
2468            __gen_uint(values->texel_ordering, 12, 15) |
2469            __gen_uint(values->levels - 1, 16, 20) |
2470            __gen_uint(values->minimum_level, 24, 28);
2471   cl[ 3] = __gen_uint(values->minimum_lod, 0, 12) |
2472            __gen_uint(util_logbase2(values->sample_count), 13, 15) |
2473            __gen_uint(values->maximum_lod, 16, 28);
2474   cl[ 4] = __gen_uint(values->surfaces, 0, 63);
2475   cl[ 5] = __gen_uint(values->surfaces, 0, 63) >> 32;
2476   cl[ 6] = __gen_uint(values->array_size - 1, 0, 15);
2477   cl[ 7] = __gen_uint(values->depth - 1, 0, 15);
2478}
2479
2480
2481#define MALI_TEXTURE_LENGTH 32
2482#define MALI_TEXTURE_ALIGN 32
2483struct mali_texture_packed { uint32_t opaque[8]; };
2484static inline void
2485MALI_TEXTURE_unpack(const uint8_t * restrict cl,
2486                    struct MALI_TEXTURE * restrict values)
2487{
2488   if (((const uint32_t *) cl)[0] & 0xc0) fprintf(stderr, "XXX: Invalid field of Texture unpacked at word 0\n");
2489   if (((const uint32_t *) cl)[2] & 0xe0e00000) fprintf(stderr, "XXX: Invalid field of Texture unpacked at word 2\n");
2490   if (((const uint32_t *) cl)[3] & 0xe0000000) fprintf(stderr, "XXX: Invalid field of Texture unpacked at word 3\n");
2491   if (((const uint32_t *) cl)[6] & 0xffff0000) fprintf(stderr, "XXX: Invalid field of Texture unpacked at word 6\n");
2492   if (((const uint32_t *) cl)[7] & 0xffff0000) fprintf(stderr, "XXX: Invalid field of Texture unpacked at word 7\n");
2493   values->type = __gen_unpack_uint(cl, 0, 3);
2494   values->dimension = (enum mali_texture_dimension)__gen_unpack_uint(cl, 4, 5);
2495   values->sample_corner_position = __gen_unpack_uint(cl, 8, 8);
2496   values->normalize_coordinates = __gen_unpack_uint(cl, 9, 9);
2497   values->format = __gen_unpack_uint(cl, 10, 31);
2498   values->width = __gen_unpack_uint(cl, 32, 47) + 1;
2499   values->height = __gen_unpack_uint(cl, 48, 63) + 1;
2500   values->swizzle = __gen_unpack_uint(cl, 64, 75);
2501   values->texel_ordering = (enum mali_texture_layout)__gen_unpack_uint(cl, 76, 79);
2502   values->levels = __gen_unpack_uint(cl, 80, 84) + 1;
2503   values->minimum_level = __gen_unpack_uint(cl, 88, 92);
2504   values->minimum_lod = __gen_unpack_uint(cl, 96, 108);
2505   values->sample_count = 1U << __gen_unpack_uint(cl, 109, 111);
2506   values->maximum_lod = __gen_unpack_uint(cl, 112, 124);
2507   values->surfaces = __gen_unpack_uint(cl, 128, 191);
2508   values->array_size = __gen_unpack_uint(cl, 192, 207) + 1;
2509   values->depth = __gen_unpack_uint(cl, 224, 239) + 1;
2510}
2511
2512static inline void
2513MALI_TEXTURE_print(FILE *fp, const struct MALI_TEXTURE * values, unsigned indent)
2514{
2515   fprintf(fp, "%*sType: %u\n", indent, "", values->type);
2516   fprintf(fp, "%*sDimension: %s\n", indent, "", mali_texture_dimension_as_str(values->dimension));
2517   fprintf(fp, "%*sSample corner position: %s\n", indent, "", values->sample_corner_position ? "true" : "false");
2518   fprintf(fp, "%*sNormalize coordinates: %s\n", indent, "", values->normalize_coordinates ? "true" : "false");
2519   mali_pixel_format_print(fp, values->format);
2520   fprintf(fp, "%*sWidth: %u\n", indent, "", values->width);
2521   fprintf(fp, "%*sHeight: %u\n", indent, "", values->height);
2522   fprintf(fp, "%*sSwizzle: %u\n", indent, "", values->swizzle);
2523   fprintf(fp, "%*sTexel ordering: %s\n", indent, "", mali_texture_layout_as_str(values->texel_ordering));
2524   fprintf(fp, "%*sLevels: %u\n", indent, "", values->levels);
2525   fprintf(fp, "%*sMinimum level: %u\n", indent, "", values->minimum_level);
2526   fprintf(fp, "%*sMinimum LOD: %u\n", indent, "", values->minimum_lod);
2527   fprintf(fp, "%*sSample count: %u\n", indent, "", values->sample_count);
2528   fprintf(fp, "%*sMaximum LOD: %u\n", indent, "", values->maximum_lod);
2529   fprintf(fp, "%*sSurfaces: 0x%" PRIx64 "\n", indent, "", values->surfaces);
2530   fprintf(fp, "%*sArray size: %u\n", indent, "", values->array_size);
2531   fprintf(fp, "%*sDepth: %u\n", indent, "", values->depth);
2532}
2533
2534enum mali_shader_register_allocation {
2535        MALI_SHADER_REGISTER_ALLOCATION_64_PER_THREAD =      0,
2536        MALI_SHADER_REGISTER_ALLOCATION_32_PER_THREAD =      2,
2537};
2538
2539static inline const char *
2540mali_shader_register_allocation_as_str(enum mali_shader_register_allocation imm)
2541{
2542    switch (imm) {
2543    case MALI_SHADER_REGISTER_ALLOCATION_64_PER_THREAD: return "64 Per Thread";
2544    case MALI_SHADER_REGISTER_ALLOCATION_32_PER_THREAD: return "32 Per Thread";
2545    default: return "XXX: INVALID";
2546    }
2547}
2548
2549struct MALI_RENDERER_PROPERTIES {
2550   uint32_t                             uniform_buffer_count;
2551   enum mali_depth_source               depth_source;
2552   bool                                 shader_contains_barrier;
2553   enum mali_shader_register_allocation shader_register_allocation;
2554   enum mali_shader_register_allocation secondary_shader_register_allocation;
2555   bool                                 shader_modifies_coverage;
2556   bool                                 allow_forward_pixel_to_kill;
2557   bool                                 allow_forward_pixel_to_be_killed;
2558   enum mali_pixel_kill                 pixel_kill_operation;
2559   enum mali_pixel_kill                 zs_update_operation;
2560   bool                                 point_sprite_coord_origin_max_y;
2561   bool                                 stencil_from_shader;
2562   bool                                 shader_wait_dependency_6;
2563   bool                                 shader_wait_dependency_7;
2564};
2565
2566#define MALI_RENDERER_PROPERTIES_header         \
2567   .depth_source = MALI_DEPTH_SOURCE_MINIMUM
2568
2569static inline void
2570MALI_RENDERER_PROPERTIES_pack(uint32_t * restrict cl,
2571                              const struct MALI_RENDERER_PROPERTIES * restrict values)
2572{
2573   cl[ 0] = __gen_uint(values->uniform_buffer_count, 0, 7) |
2574            __gen_uint(values->depth_source, 8, 9) |
2575            __gen_uint(values->shader_contains_barrier, 11, 11) |
2576            __gen_uint(values->shader_register_allocation, 12, 13) |
2577            __gen_uint(values->secondary_shader_register_allocation, 14, 15) |
2578            __gen_uint(values->shader_modifies_coverage, 16, 16) |
2579            __gen_uint(values->allow_forward_pixel_to_kill, 19, 19) |
2580            __gen_uint(values->allow_forward_pixel_to_be_killed, 20, 20) |
2581            __gen_uint(values->pixel_kill_operation, 21, 22) |
2582            __gen_uint(values->zs_update_operation, 23, 24) |
2583            __gen_uint(values->point_sprite_coord_origin_max_y, 27, 27) |
2584            __gen_uint(values->stencil_from_shader, 28, 28) |
2585            __gen_uint(values->shader_wait_dependency_6, 30, 30) |
2586            __gen_uint(values->shader_wait_dependency_7, 31, 31);
2587}
2588
2589
2590#define MALI_RENDERER_PROPERTIES_LENGTH 4
2591struct mali_renderer_properties_packed { uint32_t opaque[1]; };
2592static inline void
2593MALI_RENDERER_PROPERTIES_unpack(const uint8_t * restrict cl,
2594                                struct MALI_RENDERER_PROPERTIES * restrict values)
2595{
2596   if (((const uint32_t *) cl)[0] & 0x26060400) fprintf(stderr, "XXX: Invalid field of Renderer Properties unpacked at word 0\n");
2597   values->uniform_buffer_count = __gen_unpack_uint(cl, 0, 7);
2598   values->depth_source = (enum mali_depth_source)__gen_unpack_uint(cl, 8, 9);
2599   values->shader_contains_barrier = __gen_unpack_uint(cl, 11, 11);
2600   values->shader_register_allocation = (enum mali_shader_register_allocation)__gen_unpack_uint(cl, 12, 13);
2601   values->secondary_shader_register_allocation = (enum mali_shader_register_allocation)__gen_unpack_uint(cl, 14, 15);
2602   values->shader_modifies_coverage = __gen_unpack_uint(cl, 16, 16);
2603   values->allow_forward_pixel_to_kill = __gen_unpack_uint(cl, 19, 19);
2604   values->allow_forward_pixel_to_be_killed = __gen_unpack_uint(cl, 20, 20);
2605   values->pixel_kill_operation = (enum mali_pixel_kill)__gen_unpack_uint(cl, 21, 22);
2606   values->zs_update_operation = (enum mali_pixel_kill)__gen_unpack_uint(cl, 23, 24);
2607   values->point_sprite_coord_origin_max_y = __gen_unpack_uint(cl, 27, 27);
2608   values->stencil_from_shader = __gen_unpack_uint(cl, 28, 28);
2609   values->shader_wait_dependency_6 = __gen_unpack_uint(cl, 30, 30);
2610   values->shader_wait_dependency_7 = __gen_unpack_uint(cl, 31, 31);
2611}
2612
2613static inline void
2614MALI_RENDERER_PROPERTIES_print(FILE *fp, const struct MALI_RENDERER_PROPERTIES * values, unsigned indent)
2615{
2616   fprintf(fp, "%*sUniform buffer count: %u\n", indent, "", values->uniform_buffer_count);
2617   fprintf(fp, "%*sDepth source: %s\n", indent, "", mali_depth_source_as_str(values->depth_source));
2618   fprintf(fp, "%*sShader contains barrier: %s\n", indent, "", values->shader_contains_barrier ? "true" : "false");
2619   fprintf(fp, "%*sShader register allocation: %s\n", indent, "", mali_shader_register_allocation_as_str(values->shader_register_allocation));
2620   fprintf(fp, "%*sSecondary shader register allocation: %s\n", indent, "", mali_shader_register_allocation_as_str(values->secondary_shader_register_allocation));
2621   fprintf(fp, "%*sShader modifies coverage: %s\n", indent, "", values->shader_modifies_coverage ? "true" : "false");
2622   fprintf(fp, "%*sAllow forward pixel to kill: %s\n", indent, "", values->allow_forward_pixel_to_kill ? "true" : "false");
2623   fprintf(fp, "%*sAllow forward pixel to be killed: %s\n", indent, "", values->allow_forward_pixel_to_be_killed ? "true" : "false");
2624   fprintf(fp, "%*sPixel kill operation: %s\n", indent, "", mali_pixel_kill_as_str(values->pixel_kill_operation));
2625   fprintf(fp, "%*sZS update operation: %s\n", indent, "", mali_pixel_kill_as_str(values->zs_update_operation));
2626   fprintf(fp, "%*sPoint sprite coord origin max Y: %s\n", indent, "", values->point_sprite_coord_origin_max_y ? "true" : "false");
2627   fprintf(fp, "%*sStencil from shader: %s\n", indent, "", values->stencil_from_shader ? "true" : "false");
2628   fprintf(fp, "%*sShader wait dependency 6: %s\n", indent, "", values->shader_wait_dependency_6 ? "true" : "false");
2629   fprintf(fp, "%*sShader wait dependency 7: %s\n", indent, "", values->shader_wait_dependency_7 ? "true" : "false");
2630}
2631
2632struct MALI_COMPUTE_PRELOAD {
2633   bool                                 pc;
2634   bool                                 local_invocation_xy;
2635   bool                                 local_invocation_z;
2636   bool                                 work_group_x;
2637   bool                                 work_group_y;
2638   bool                                 work_group_z;
2639   bool                                 global_invocation_x;
2640   bool                                 global_invocation_y;
2641   bool                                 global_invocation_z;
2642};
2643
2644#define MALI_COMPUTE_PRELOAD_header             \
2645   0
2646
2647static inline void
2648MALI_COMPUTE_PRELOAD_print(FILE *fp, const struct MALI_COMPUTE_PRELOAD * values, unsigned indent)
2649{
2650   fprintf(fp, "%*sPC: %s\n", indent, "", values->pc ? "true" : "false");
2651   fprintf(fp, "%*sLocal Invocation XY: %s\n", indent, "", values->local_invocation_xy ? "true" : "false");
2652   fprintf(fp, "%*sLocal Invocation Z: %s\n", indent, "", values->local_invocation_z ? "true" : "false");
2653   fprintf(fp, "%*sWork group X: %s\n", indent, "", values->work_group_x ? "true" : "false");
2654   fprintf(fp, "%*sWork group Y: %s\n", indent, "", values->work_group_y ? "true" : "false");
2655   fprintf(fp, "%*sWork group Z: %s\n", indent, "", values->work_group_z ? "true" : "false");
2656   fprintf(fp, "%*sGlobal Invocation X: %s\n", indent, "", values->global_invocation_x ? "true" : "false");
2657   fprintf(fp, "%*sGlobal Invocation Y: %s\n", indent, "", values->global_invocation_y ? "true" : "false");
2658   fprintf(fp, "%*sGlobal Invocation Z: %s\n", indent, "", values->global_invocation_z ? "true" : "false");
2659}
2660
2661enum mali_warp_limit {
2662        MALI_WARP_LIMIT_NONE                 =      0,
2663        MALI_WARP_LIMIT_2                    =      1,
2664        MALI_WARP_LIMIT_4                    =      2,
2665        MALI_WARP_LIMIT_8                    =      3,
2666};
2667
2668static inline const char *
2669mali_warp_limit_as_str(enum mali_warp_limit imm)
2670{
2671    switch (imm) {
2672    case MALI_WARP_LIMIT_NONE: return "None";
2673    case MALI_WARP_LIMIT_2: return "2";
2674    case MALI_WARP_LIMIT_4: return "4";
2675    case MALI_WARP_LIMIT_8: return "8";
2676    default: return "XXX: INVALID";
2677    }
2678}
2679
2680struct MALI_VERTEX_PRELOAD {
2681   enum mali_warp_limit                 warp_limit;
2682   bool                                 pc;
2683   bool                                 position_result_address_lo;
2684   bool                                 position_result_address_hi;
2685   bool                                 vertex_id;
2686   bool                                 instance_id;
2687};
2688
2689#define MALI_VERTEX_PRELOAD_header              \
2690   0
2691
2692static inline void
2693MALI_VERTEX_PRELOAD_print(FILE *fp, const struct MALI_VERTEX_PRELOAD * values, unsigned indent)
2694{
2695   fprintf(fp, "%*sWarp limit: %s\n", indent, "", mali_warp_limit_as_str(values->warp_limit));
2696   fprintf(fp, "%*sPC: %s\n", indent, "", values->pc ? "true" : "false");
2697   fprintf(fp, "%*sPosition result address lo: %s\n", indent, "", values->position_result_address_lo ? "true" : "false");
2698   fprintf(fp, "%*sPosition result address hi: %s\n", indent, "", values->position_result_address_hi ? "true" : "false");
2699   fprintf(fp, "%*sVertex ID: %s\n", indent, "", values->vertex_id ? "true" : "false");
2700   fprintf(fp, "%*sInstance ID: %s\n", indent, "", values->instance_id ? "true" : "false");
2701}
2702
2703struct MALI_FRAGMENT_PRELOAD {
2704   bool                                 pc;
2705   bool                                 coverage;
2706   bool                                 primitive_id;
2707   bool                                 primitive_flags;
2708   bool                                 fragment_position;
2709   bool                                 sample_mask_id;
2710};
2711
2712#define MALI_FRAGMENT_PRELOAD_header            \
2713   0
2714
2715static inline void
2716MALI_FRAGMENT_PRELOAD_print(FILE *fp, const struct MALI_FRAGMENT_PRELOAD * values, unsigned indent)
2717{
2718   fprintf(fp, "%*sPC: %s\n", indent, "", values->pc ? "true" : "false");
2719   fprintf(fp, "%*sCoverage: %s\n", indent, "", values->coverage ? "true" : "false");
2720   fprintf(fp, "%*sPrimitive ID: %s\n", indent, "", values->primitive_id ? "true" : "false");
2721   fprintf(fp, "%*sPrimitive flags: %s\n", indent, "", values->primitive_flags ? "true" : "false");
2722   fprintf(fp, "%*sFragment position: %s\n", indent, "", values->fragment_position ? "true" : "false");
2723   fprintf(fp, "%*sSample mask/ID: %s\n", indent, "", values->sample_mask_id ? "true" : "false");
2724}
2725
2726struct MALI_PRELOAD {
2727   struct MALI_COMPUTE_PRELOAD          compute;
2728   struct MALI_VERTEX_PRELOAD           vertex;
2729   struct MALI_FRAGMENT_PRELOAD         fragment;
2730   uint32_t                             uniform_count;
2731};
2732
2733#define MALI_PRELOAD_header                     \
2734   .compute = { MALI_COMPUTE_PRELOAD_header },  \
2735   .vertex = { MALI_VERTEX_PRELOAD_header },  \
2736   .fragment = { MALI_FRAGMENT_PRELOAD_header }
2737
2738static inline void
2739MALI_PRELOAD_pack(uint32_t * restrict cl,
2740                  const struct MALI_PRELOAD * restrict values)
2741{
2742   cl[ 0] = __gen_uint(values->compute.pc, 6, 6) |
2743            __gen_uint(values->compute.local_invocation_xy, 7, 7) |
2744            __gen_uint(values->compute.local_invocation_z, 8, 8) |
2745            __gen_uint(values->compute.work_group_x, 9, 9) |
2746            __gen_uint(values->compute.work_group_y, 10, 10) |
2747            __gen_uint(values->compute.work_group_z, 11, 11) |
2748            __gen_uint(values->compute.global_invocation_x, 12, 12) |
2749            __gen_uint(values->compute.global_invocation_y, 13, 13) |
2750            __gen_uint(values->compute.global_invocation_z, 14, 14) |
2751            __gen_uint(values->vertex.warp_limit, 0, 1) |
2752            __gen_uint(values->vertex.pc, 6, 6) |
2753            __gen_uint(values->vertex.position_result_address_lo, 10, 10) |
2754            __gen_uint(values->vertex.position_result_address_hi, 11, 11) |
2755            __gen_uint(values->vertex.vertex_id, 13, 13) |
2756            __gen_uint(values->vertex.instance_id, 14, 14) |
2757            __gen_uint(values->fragment.pc, 6, 6) |
2758            __gen_uint(values->fragment.coverage, 7, 7) |
2759            __gen_uint(values->fragment.primitive_id, 9, 9) |
2760            __gen_uint(values->fragment.primitive_flags, 10, 10) |
2761            __gen_uint(values->fragment.fragment_position, 11, 11) |
2762            __gen_uint(values->fragment.sample_mask_id, 13, 13) |
2763            __gen_uint(values->uniform_count, 15, 21);
2764}
2765
2766
2767#define MALI_PRELOAD_LENGTH 4
2768struct mali_preload_packed { uint32_t opaque[1]; };
2769static inline void
2770MALI_PRELOAD_unpack(const uint8_t * restrict cl,
2771                    struct MALI_PRELOAD * restrict values)
2772{
2773   if (((const uint32_t *) cl)[0] & 0xffc0003c) fprintf(stderr, "XXX: Invalid field of Preload unpacked at word 0\n");
2774   values->compute.pc = __gen_unpack_uint(cl, 6, 6);
2775   values->compute.local_invocation_xy = __gen_unpack_uint(cl, 7, 7);
2776   values->compute.local_invocation_z = __gen_unpack_uint(cl, 8, 8);
2777   values->compute.work_group_x = __gen_unpack_uint(cl, 9, 9);
2778   values->compute.work_group_y = __gen_unpack_uint(cl, 10, 10);
2779   values->compute.work_group_z = __gen_unpack_uint(cl, 11, 11);
2780   values->compute.global_invocation_x = __gen_unpack_uint(cl, 12, 12);
2781   values->compute.global_invocation_y = __gen_unpack_uint(cl, 13, 13);
2782   values->compute.global_invocation_z = __gen_unpack_uint(cl, 14, 14);
2783   values->vertex.warp_limit = (enum mali_warp_limit)__gen_unpack_uint(cl, 0, 1);
2784   values->vertex.pc = __gen_unpack_uint(cl, 6, 6);
2785   values->vertex.position_result_address_lo = __gen_unpack_uint(cl, 10, 10);
2786   values->vertex.position_result_address_hi = __gen_unpack_uint(cl, 11, 11);
2787   values->vertex.vertex_id = __gen_unpack_uint(cl, 13, 13);
2788   values->vertex.instance_id = __gen_unpack_uint(cl, 14, 14);
2789   values->fragment.pc = __gen_unpack_uint(cl, 6, 6);
2790   values->fragment.coverage = __gen_unpack_uint(cl, 7, 7);
2791   values->fragment.primitive_id = __gen_unpack_uint(cl, 9, 9);
2792   values->fragment.primitive_flags = __gen_unpack_uint(cl, 10, 10);
2793   values->fragment.fragment_position = __gen_unpack_uint(cl, 11, 11);
2794   values->fragment.sample_mask_id = __gen_unpack_uint(cl, 13, 13);
2795   values->uniform_count = __gen_unpack_uint(cl, 15, 21);
2796}
2797
2798static inline void
2799MALI_PRELOAD_print(FILE *fp, const struct MALI_PRELOAD * values, unsigned indent)
2800{
2801   fprintf(fp, "%*sCompute:\n", indent, "");
2802   MALI_COMPUTE_PRELOAD_print(fp, &values->compute, indent + 2);
2803   fprintf(fp, "%*sVertex:\n", indent, "");
2804   MALI_VERTEX_PRELOAD_print(fp, &values->vertex, indent + 2);
2805   fprintf(fp, "%*sFragment:\n", indent, "");
2806   MALI_FRAGMENT_PRELOAD_print(fp, &values->fragment, indent + 2);
2807   fprintf(fp, "%*sUniform count: %u\n", indent, "", values->uniform_count);
2808}
2809
2810struct MALI_SHADER {
2811   uint64_t                             shader;
2812   uint32_t                             sampler_count;
2813   uint32_t                             texture_count;
2814   uint32_t                             attribute_count;
2815   uint32_t                             varying_count;
2816};
2817
2818#define MALI_SHADER_header                      \
2819   0
2820
2821static inline void
2822MALI_SHADER_pack(uint32_t * restrict cl,
2823                 const struct MALI_SHADER * restrict values)
2824{
2825   cl[ 0] = __gen_uint(values->shader, 0, 63);
2826   cl[ 1] = __gen_uint(values->shader, 0, 63) >> 32;
2827   cl[ 2] = __gen_uint(values->sampler_count, 0, 15) |
2828            __gen_uint(values->texture_count, 16, 31);
2829   cl[ 3] = __gen_uint(values->attribute_count, 0, 15) |
2830            __gen_uint(values->varying_count, 16, 31);
2831}
2832
2833
2834#define MALI_SHADER_LENGTH 16
2835struct mali_shader_packed { uint32_t opaque[4]; };
2836static inline void
2837MALI_SHADER_unpack(const uint8_t * restrict cl,
2838                   struct MALI_SHADER * restrict values)
2839{
2840   values->shader = __gen_unpack_uint(cl, 0, 63);
2841   values->sampler_count = __gen_unpack_uint(cl, 64, 79);
2842   values->texture_count = __gen_unpack_uint(cl, 80, 95);
2843   values->attribute_count = __gen_unpack_uint(cl, 96, 111);
2844   values->varying_count = __gen_unpack_uint(cl, 112, 127);
2845}
2846
2847static inline void
2848MALI_SHADER_print(FILE *fp, const struct MALI_SHADER * values, unsigned indent)
2849{
2850   fprintf(fp, "%*sShader: 0x%" PRIx64 "\n", indent, "", values->shader);
2851   fprintf(fp, "%*sSampler count: %u\n", indent, "", values->sampler_count);
2852   fprintf(fp, "%*sTexture count: %u\n", indent, "", values->texture_count);
2853   fprintf(fp, "%*sAttribute count: %u\n", indent, "", values->attribute_count);
2854   fprintf(fp, "%*sVarying count: %u\n", indent, "", values->varying_count);
2855}
2856
2857struct MALI_MULTISAMPLE_MISC {
2858   uint32_t                             sample_mask;
2859   bool                                 multisample_enable;
2860   bool                                 multisample_late_coverage;
2861   bool                                 evaluate_per_sample;
2862   bool                                 fixed_function_depth_range_fixed;
2863   bool                                 shader_depth_range_fixed;
2864   bool                                 overdraw_alpha1;
2865   bool                                 overdraw_alpha0;
2866   enum mali_func                       depth_function;
2867   bool                                 depth_write_mask;
2868   bool                                 fixed_function_near_discard;
2869   bool                                 fixed_function_far_discard;
2870   bool                                 fragment_near_discard;
2871   bool                                 fragment_far_discard;
2872};
2873
2874#define MALI_MULTISAMPLE_MISC_header            \
2875   0
2876
2877static inline void
2878MALI_MULTISAMPLE_MISC_pack(uint32_t * restrict cl,
2879                           const struct MALI_MULTISAMPLE_MISC * restrict values)
2880{
2881   cl[ 0] = __gen_uint(values->sample_mask, 0, 15) |
2882            __gen_uint(values->multisample_enable, 16, 16) |
2883            __gen_uint(values->multisample_late_coverage, 17, 17) |
2884            __gen_uint(values->evaluate_per_sample, 18, 18) |
2885            __gen_uint(values->fixed_function_depth_range_fixed, 19, 19) |
2886            __gen_uint(values->shader_depth_range_fixed, 20, 20) |
2887            __gen_uint(values->overdraw_alpha1, 22, 22) |
2888            __gen_uint(values->overdraw_alpha0, 23, 23) |
2889            __gen_uint(values->depth_function, 24, 26) |
2890            __gen_uint(values->depth_write_mask, 27, 27) |
2891            __gen_uint(values->fixed_function_near_discard, 28, 28) |
2892            __gen_uint(values->fixed_function_far_discard, 29, 29) |
2893            __gen_uint(values->fragment_near_discard, 30, 30) |
2894            __gen_uint(values->fragment_far_discard, 31, 31);
2895}
2896
2897
2898#define MALI_MULTISAMPLE_MISC_LENGTH 4
2899struct mali_multisample_misc_packed { uint32_t opaque[1]; };
2900static inline void
2901MALI_MULTISAMPLE_MISC_unpack(const uint8_t * restrict cl,
2902                             struct MALI_MULTISAMPLE_MISC * restrict values)
2903{
2904   if (((const uint32_t *) cl)[0] & 0x200000) fprintf(stderr, "XXX: Invalid field of Multisample, Misc unpacked at word 0\n");
2905   values->sample_mask = __gen_unpack_uint(cl, 0, 15);
2906   values->multisample_enable = __gen_unpack_uint(cl, 16, 16);
2907   values->multisample_late_coverage = __gen_unpack_uint(cl, 17, 17);
2908   values->evaluate_per_sample = __gen_unpack_uint(cl, 18, 18);
2909   values->fixed_function_depth_range_fixed = __gen_unpack_uint(cl, 19, 19);
2910   values->shader_depth_range_fixed = __gen_unpack_uint(cl, 20, 20);
2911   values->overdraw_alpha1 = __gen_unpack_uint(cl, 22, 22);
2912   values->overdraw_alpha0 = __gen_unpack_uint(cl, 23, 23);
2913   values->depth_function = (enum mali_func)__gen_unpack_uint(cl, 24, 26);
2914   values->depth_write_mask = __gen_unpack_uint(cl, 27, 27);
2915   values->fixed_function_near_discard = __gen_unpack_uint(cl, 28, 28);
2916   values->fixed_function_far_discard = __gen_unpack_uint(cl, 29, 29);
2917   values->fragment_near_discard = __gen_unpack_uint(cl, 30, 30);
2918   values->fragment_far_discard = __gen_unpack_uint(cl, 31, 31);
2919}
2920
2921static inline void
2922MALI_MULTISAMPLE_MISC_print(FILE *fp, const struct MALI_MULTISAMPLE_MISC * values, unsigned indent)
2923{
2924   fprintf(fp, "%*sSample mask: %u\n", indent, "", values->sample_mask);
2925   fprintf(fp, "%*sMultisample enable: %s\n", indent, "", values->multisample_enable ? "true" : "false");
2926   fprintf(fp, "%*sMultisample late coverage: %s\n", indent, "", values->multisample_late_coverage ? "true" : "false");
2927   fprintf(fp, "%*sEvaluate per-sample: %s\n", indent, "", values->evaluate_per_sample ? "true" : "false");
2928   fprintf(fp, "%*sFixed-function depth range fixed: %s\n", indent, "", values->fixed_function_depth_range_fixed ? "true" : "false");
2929   fprintf(fp, "%*sShader depth range fixed: %s\n", indent, "", values->shader_depth_range_fixed ? "true" : "false");
2930   fprintf(fp, "%*sOverdraw alpha1: %s\n", indent, "", values->overdraw_alpha1 ? "true" : "false");
2931   fprintf(fp, "%*sOverdraw alpha0: %s\n", indent, "", values->overdraw_alpha0 ? "true" : "false");
2932   fprintf(fp, "%*sDepth function: %s\n", indent, "", mali_func_as_str(values->depth_function));
2933   fprintf(fp, "%*sDepth write mask: %s\n", indent, "", values->depth_write_mask ? "true" : "false");
2934   fprintf(fp, "%*sFixed-function near discard: %s\n", indent, "", values->fixed_function_near_discard ? "true" : "false");
2935   fprintf(fp, "%*sFixed-function far discard: %s\n", indent, "", values->fixed_function_far_discard ? "true" : "false");
2936   fprintf(fp, "%*sFragment near discard: %s\n", indent, "", values->fragment_near_discard ? "true" : "false");
2937   fprintf(fp, "%*sFragment far discard: %s\n", indent, "", values->fragment_far_discard ? "true" : "false");
2938}
2939
2940struct MALI_STENCIL_MASK_MISC {
2941   uint32_t                             stencil_mask_front;
2942   uint32_t                             stencil_mask_back;
2943   bool                                 stencil_enable;
2944   bool                                 alpha_to_coverage;
2945   bool                                 alpha_to_coverage_invert;
2946   enum mali_func                       alpha_test_compare_function;
2947   bool                                 force_seamless_cubemaps;
2948   bool                                 depth_range_1;
2949   bool                                 depth_range_2;
2950   bool                                 single_sampled_lines;
2951   bool                                 point_snap;
2952};
2953
2954#define MALI_STENCIL_MASK_MISC_header           \
2955   0
2956
2957static inline void
2958MALI_STENCIL_MASK_MISC_pack(uint32_t * restrict cl,
2959                            const struct MALI_STENCIL_MASK_MISC * restrict values)
2960{
2961   cl[ 0] = __gen_uint(values->stencil_mask_front, 0, 7) |
2962            __gen_uint(values->stencil_mask_back, 8, 15) |
2963            __gen_uint(values->stencil_enable, 16, 16) |
2964            __gen_uint(values->alpha_to_coverage, 17, 17) |
2965            __gen_uint(values->alpha_to_coverage_invert, 18, 18) |
2966            __gen_uint(values->alpha_test_compare_function, 21, 23) |
2967            __gen_uint(values->force_seamless_cubemaps, 26, 26) |
2968            __gen_uint(values->depth_range_1, 28, 28) |
2969            __gen_uint(values->depth_range_2, 29, 29) |
2970            __gen_uint(values->single_sampled_lines, 30, 30) |
2971            __gen_uint(values->point_snap, 31, 31);
2972}
2973
2974
2975#define MALI_STENCIL_MASK_MISC_LENGTH 4
2976struct mali_stencil_mask_misc_packed { uint32_t opaque[1]; };
2977static inline void
2978MALI_STENCIL_MASK_MISC_unpack(const uint8_t * restrict cl,
2979                              struct MALI_STENCIL_MASK_MISC * restrict values)
2980{
2981   if (((const uint32_t *) cl)[0] & 0xb180000) fprintf(stderr, "XXX: Invalid field of Stencil Mask, Misc unpacked at word 0\n");
2982   values->stencil_mask_front = __gen_unpack_uint(cl, 0, 7);
2983   values->stencil_mask_back = __gen_unpack_uint(cl, 8, 15);
2984   values->stencil_enable = __gen_unpack_uint(cl, 16, 16);
2985   values->alpha_to_coverage = __gen_unpack_uint(cl, 17, 17);
2986   values->alpha_to_coverage_invert = __gen_unpack_uint(cl, 18, 18);
2987   values->alpha_test_compare_function = (enum mali_func)__gen_unpack_uint(cl, 21, 23);
2988   values->force_seamless_cubemaps = __gen_unpack_uint(cl, 26, 26);
2989   values->depth_range_1 = __gen_unpack_uint(cl, 28, 28);
2990   values->depth_range_2 = __gen_unpack_uint(cl, 29, 29);
2991   values->single_sampled_lines = __gen_unpack_uint(cl, 30, 30);
2992   values->point_snap = __gen_unpack_uint(cl, 31, 31);
2993}
2994
2995static inline void
2996MALI_STENCIL_MASK_MISC_print(FILE *fp, const struct MALI_STENCIL_MASK_MISC * values, unsigned indent)
2997{
2998   fprintf(fp, "%*sStencil mask front: %u\n", indent, "", values->stencil_mask_front);
2999   fprintf(fp, "%*sStencil mask back: %u\n", indent, "", values->stencil_mask_back);
3000   fprintf(fp, "%*sStencil enable: %s\n", indent, "", values->stencil_enable ? "true" : "false");
3001   fprintf(fp, "%*sAlpha-to-coverage: %s\n", indent, "", values->alpha_to_coverage ? "true" : "false");
3002   fprintf(fp, "%*sAlpha-to-coverage Invert: %s\n", indent, "", values->alpha_to_coverage_invert ? "true" : "false");
3003   fprintf(fp, "%*sAlpha test compare function: %s\n", indent, "", mali_func_as_str(values->alpha_test_compare_function));
3004   fprintf(fp, "%*sForce seamless cubemaps: %s\n", indent, "", values->force_seamless_cubemaps ? "true" : "false");
3005   fprintf(fp, "%*sDepth Range 1: %s\n", indent, "", values->depth_range_1 ? "true" : "false");
3006   fprintf(fp, "%*sDepth Range 2: %s\n", indent, "", values->depth_range_2 ? "true" : "false");
3007   fprintf(fp, "%*sSingle-sampled lines: %s\n", indent, "", values->single_sampled_lines ? "true" : "false");
3008   fprintf(fp, "%*sPoint snap: %s\n", indent, "", values->point_snap ? "true" : "false");
3009}
3010
3011struct MALI_STENCIL {
3012   uint32_t                             reference_value;
3013   uint32_t                             mask;
3014   enum mali_func                       compare_function;
3015   enum mali_stencil_op                 stencil_fail;
3016   enum mali_stencil_op                 depth_fail;
3017   enum mali_stencil_op                 depth_pass;
3018};
3019
3020#define MALI_STENCIL_header                     \
3021   0
3022
3023static inline void
3024MALI_STENCIL_pack(uint32_t * restrict cl,
3025                  const struct MALI_STENCIL * restrict values)
3026{
3027   cl[ 0] = __gen_uint(values->reference_value, 0, 7) |
3028            __gen_uint(values->mask, 8, 15) |
3029            __gen_uint(values->compare_function, 16, 18) |
3030            __gen_uint(values->stencil_fail, 19, 21) |
3031            __gen_uint(values->depth_fail, 22, 24) |
3032            __gen_uint(values->depth_pass, 25, 27);
3033}
3034
3035
3036#define MALI_STENCIL_LENGTH 4
3037struct mali_stencil_packed { uint32_t opaque[1]; };
3038static inline void
3039MALI_STENCIL_unpack(const uint8_t * restrict cl,
3040                    struct MALI_STENCIL * restrict values)
3041{
3042   if (((const uint32_t *) cl)[0] & 0xf0000000) fprintf(stderr, "XXX: Invalid field of Stencil unpacked at word 0\n");
3043   values->reference_value = __gen_unpack_uint(cl, 0, 7);
3044   values->mask = __gen_unpack_uint(cl, 8, 15);
3045   values->compare_function = (enum mali_func)__gen_unpack_uint(cl, 16, 18);
3046   values->stencil_fail = (enum mali_stencil_op)__gen_unpack_uint(cl, 19, 21);
3047   values->depth_fail = (enum mali_stencil_op)__gen_unpack_uint(cl, 22, 24);
3048   values->depth_pass = (enum mali_stencil_op)__gen_unpack_uint(cl, 25, 27);
3049}
3050
3051static inline void
3052MALI_STENCIL_print(FILE *fp, const struct MALI_STENCIL * values, unsigned indent)
3053{
3054   fprintf(fp, "%*sReference Value: %u\n", indent, "", values->reference_value);
3055   fprintf(fp, "%*sMask: %u\n", indent, "", values->mask);
3056   fprintf(fp, "%*sCompare Function: %s\n", indent, "", mali_func_as_str(values->compare_function));
3057   fprintf(fp, "%*sStencil Fail: %s\n", indent, "", mali_stencil_op_as_str(values->stencil_fail));
3058   fprintf(fp, "%*sDepth Fail: %s\n", indent, "", mali_stencil_op_as_str(values->depth_fail));
3059   fprintf(fp, "%*sDepth Pass: %s\n", indent, "", mali_stencil_op_as_str(values->depth_pass));
3060}
3061
3062struct MALI_LD_VAR_PRELOAD {
3063   uint32_t                             varying_index;
3064   enum mali_message_preload_register_format register_format;
3065   uint32_t                             num_components;
3066};
3067
3068#define MALI_LD_VAR_PRELOAD_header              \
3069   .num_components = 1
3070
3071static inline void
3072MALI_LD_VAR_PRELOAD_print(FILE *fp, const struct MALI_LD_VAR_PRELOAD * values, unsigned indent)
3073{
3074   fprintf(fp, "%*sVarying Index: %u\n", indent, "", values->varying_index);
3075   fprintf(fp, "%*sRegister Format: %s\n", indent, "", mali_message_preload_register_format_as_str(values->register_format));
3076   fprintf(fp, "%*sNum Components: %u\n", indent, "", values->num_components);
3077}
3078
3079struct MALI_VAR_TEX_PRELOAD {
3080   uint32_t                             varying_index;
3081   uint32_t                             sampler_index;
3082   enum mali_message_preload_register_format register_format;
3083   bool                                 skip;
3084   bool                                 zero_lod;
3085};
3086
3087#define MALI_VAR_TEX_PRELOAD_header             \
3088   0
3089
3090static inline void
3091MALI_VAR_TEX_PRELOAD_print(FILE *fp, const struct MALI_VAR_TEX_PRELOAD * values, unsigned indent)
3092{
3093   fprintf(fp, "%*sVarying Index: %u\n", indent, "", values->varying_index);
3094   fprintf(fp, "%*sSampler Index: %u\n", indent, "", values->sampler_index);
3095   fprintf(fp, "%*sRegister Format: %s\n", indent, "", mali_message_preload_register_format_as_str(values->register_format));
3096   fprintf(fp, "%*sSkip: %s\n", indent, "", values->skip ? "true" : "false");
3097   fprintf(fp, "%*sZero LOD: %s\n", indent, "", values->zero_lod ? "true" : "false");
3098}
3099
3100struct MALI_MESSAGE_PRELOAD {
3101   enum mali_message_type               type;
3102   struct MALI_LD_VAR_PRELOAD           ld_var;
3103   struct MALI_VAR_TEX_PRELOAD          var_tex;
3104};
3105
3106#define MALI_MESSAGE_PRELOAD_header             \
3107   .ld_var = { MALI_LD_VAR_PRELOAD_header },  \
3108   .var_tex = { MALI_VAR_TEX_PRELOAD_header }
3109
3110static inline void
3111MALI_MESSAGE_PRELOAD_pack(uint32_t * restrict cl,
3112                          const struct MALI_MESSAGE_PRELOAD * restrict values)
3113{
3114   cl[ 0] = __gen_uint(values->type, 0, 3) |
3115            __gen_uint(values->ld_var.varying_index, 4, 8) |
3116            __gen_uint(values->ld_var.register_format, 9, 10) |
3117            __gen_uint(values->ld_var.num_components - 1, 11, 12) |
3118            __gen_uint(values->var_tex.varying_index, 4, 6) |
3119            __gen_uint(values->var_tex.sampler_index, 7, 8) |
3120            __gen_uint(values->var_tex.register_format, 9, 10) |
3121            __gen_uint(values->var_tex.skip, 14, 14) |
3122            __gen_uint(values->var_tex.zero_lod, 15, 15);
3123}
3124
3125
3126#define MALI_MESSAGE_PRELOAD_LENGTH 4
3127struct mali_message_preload_packed { uint32_t opaque[1]; };
3128static inline void
3129MALI_MESSAGE_PRELOAD_unpack(const uint8_t * restrict cl,
3130                            struct MALI_MESSAGE_PRELOAD * restrict values)
3131{
3132   if (((const uint32_t *) cl)[0] & 0xffff2000) fprintf(stderr, "XXX: Invalid field of Message Preload unpacked at word 0\n");
3133   values->type = (enum mali_message_type)__gen_unpack_uint(cl, 0, 3);
3134   values->ld_var.varying_index = __gen_unpack_uint(cl, 4, 8);
3135   values->ld_var.register_format = (enum mali_message_preload_register_format)__gen_unpack_uint(cl, 9, 10);
3136   values->ld_var.num_components = __gen_unpack_uint(cl, 11, 12) + 1;
3137   values->var_tex.varying_index = __gen_unpack_uint(cl, 4, 6);
3138   values->var_tex.sampler_index = __gen_unpack_uint(cl, 7, 8);
3139   values->var_tex.register_format = (enum mali_message_preload_register_format)__gen_unpack_uint(cl, 9, 10);
3140   values->var_tex.skip = __gen_unpack_uint(cl, 14, 14);
3141   values->var_tex.zero_lod = __gen_unpack_uint(cl, 15, 15);
3142}
3143
3144static inline void
3145MALI_MESSAGE_PRELOAD_print(FILE *fp, const struct MALI_MESSAGE_PRELOAD * values, unsigned indent)
3146{
3147   fprintf(fp, "%*sType: %s\n", indent, "", mali_message_type_as_str(values->type));
3148   fprintf(fp, "%*sLD_VAR:\n", indent, "");
3149   MALI_LD_VAR_PRELOAD_print(fp, &values->ld_var, indent + 2);
3150   fprintf(fp, "%*sVAR_TEX:\n", indent, "");
3151   MALI_VAR_TEX_PRELOAD_print(fp, &values->var_tex, indent + 2);
3152}
3153
3154struct MALI_RENDERER_STATE {
3155   struct MALI_SHADER                   shader;
3156   struct MALI_RENDERER_PROPERTIES      properties;
3157   float                                depth_units;
3158   float                                depth_factor;
3159   float                                depth_bias_clamp;
3160   struct MALI_MULTISAMPLE_MISC         multisample_misc;
3161   struct MALI_STENCIL_MASK_MISC        stencil_mask_misc;
3162   struct MALI_STENCIL                  stencil_front;
3163   struct MALI_STENCIL                  stencil_back;
3164   struct MALI_PRELOAD                  preload;
3165   float                                alpha_reference;
3166   uint32_t                             thread_balancing;
3167   struct MALI_PRELOAD                  secondary_preload;
3168   uint64_t                             secondary_shader;
3169   uint32_t                             message_preload_1;
3170   uint32_t                             message_preload_2;
3171};
3172
3173#define MALI_RENDERER_STATE_header              \
3174   .shader = { MALI_SHADER_header },  \
3175   .properties = { MALI_RENDERER_PROPERTIES_header },  \
3176   .multisample_misc = { MALI_MULTISAMPLE_MISC_header },  \
3177   .stencil_mask_misc = { MALI_STENCIL_MASK_MISC_header },  \
3178   .stencil_front = { MALI_STENCIL_header },  \
3179   .stencil_back = { MALI_STENCIL_header },  \
3180   .preload = { MALI_PRELOAD_header },  \
3181   .secondary_preload = { MALI_PRELOAD_header }
3182
3183static inline void
3184MALI_RENDERER_STATE_pack(uint32_t * restrict cl,
3185                         const struct MALI_RENDERER_STATE * restrict values)
3186{
3187   cl[ 0] = __gen_uint(values->shader.shader, 0, 63);
3188   cl[ 1] = __gen_uint(values->shader.shader, 0, 63) >> 32;
3189   cl[ 2] = __gen_uint(values->shader.sampler_count, 0, 15) |
3190            __gen_uint(values->shader.texture_count, 16, 31);
3191   cl[ 3] = __gen_uint(values->shader.attribute_count, 0, 15) |
3192            __gen_uint(values->shader.varying_count, 16, 31);
3193   cl[ 4] = __gen_uint(values->properties.uniform_buffer_count, 0, 7) |
3194            __gen_uint(values->properties.depth_source, 8, 9) |
3195            __gen_uint(values->properties.shader_contains_barrier, 11, 11) |
3196            __gen_uint(values->properties.shader_register_allocation, 12, 13) |
3197            __gen_uint(values->properties.secondary_shader_register_allocation, 14, 15) |
3198            __gen_uint(values->properties.shader_modifies_coverage, 16, 16) |
3199            __gen_uint(values->properties.allow_forward_pixel_to_kill, 19, 19) |
3200            __gen_uint(values->properties.allow_forward_pixel_to_be_killed, 20, 20) |
3201            __gen_uint(values->properties.pixel_kill_operation, 21, 22) |
3202            __gen_uint(values->properties.zs_update_operation, 23, 24) |
3203            __gen_uint(values->properties.point_sprite_coord_origin_max_y, 27, 27) |
3204            __gen_uint(values->properties.stencil_from_shader, 28, 28) |
3205            __gen_uint(values->properties.shader_wait_dependency_6, 30, 30) |
3206            __gen_uint(values->properties.shader_wait_dependency_7, 31, 31);
3207   cl[ 5] = __gen_uint(fui(values->depth_units), 0, 32);
3208   cl[ 6] = __gen_uint(fui(values->depth_factor), 0, 32);
3209   cl[ 7] = __gen_uint(fui(values->depth_bias_clamp), 0, 32);
3210   cl[ 8] = __gen_uint(values->multisample_misc.sample_mask, 0, 15) |
3211            __gen_uint(values->multisample_misc.multisample_enable, 16, 16) |
3212            __gen_uint(values->multisample_misc.multisample_late_coverage, 17, 17) |
3213            __gen_uint(values->multisample_misc.evaluate_per_sample, 18, 18) |
3214            __gen_uint(values->multisample_misc.fixed_function_depth_range_fixed, 19, 19) |
3215            __gen_uint(values->multisample_misc.shader_depth_range_fixed, 20, 20) |
3216            __gen_uint(values->multisample_misc.overdraw_alpha1, 22, 22) |
3217            __gen_uint(values->multisample_misc.overdraw_alpha0, 23, 23) |
3218            __gen_uint(values->multisample_misc.depth_function, 24, 26) |
3219            __gen_uint(values->multisample_misc.depth_write_mask, 27, 27) |
3220            __gen_uint(values->multisample_misc.fixed_function_near_discard, 28, 28) |
3221            __gen_uint(values->multisample_misc.fixed_function_far_discard, 29, 29) |
3222            __gen_uint(values->multisample_misc.fragment_near_discard, 30, 30) |
3223            __gen_uint(values->multisample_misc.fragment_far_discard, 31, 31);
3224   cl[ 9] = __gen_uint(values->stencil_mask_misc.stencil_mask_front, 0, 7) |
3225            __gen_uint(values->stencil_mask_misc.stencil_mask_back, 8, 15) |
3226            __gen_uint(values->stencil_mask_misc.stencil_enable, 16, 16) |
3227            __gen_uint(values->stencil_mask_misc.alpha_to_coverage, 17, 17) |
3228            __gen_uint(values->stencil_mask_misc.alpha_to_coverage_invert, 18, 18) |
3229            __gen_uint(values->stencil_mask_misc.alpha_test_compare_function, 21, 23) |
3230            __gen_uint(values->stencil_mask_misc.force_seamless_cubemaps, 26, 26) |
3231            __gen_uint(values->stencil_mask_misc.depth_range_1, 28, 28) |
3232            __gen_uint(values->stencil_mask_misc.depth_range_2, 29, 29) |
3233            __gen_uint(values->stencil_mask_misc.single_sampled_lines, 30, 30) |
3234            __gen_uint(values->stencil_mask_misc.point_snap, 31, 31);
3235   cl[10] = __gen_uint(values->stencil_front.reference_value, 0, 7) |
3236            __gen_uint(values->stencil_front.mask, 8, 15) |
3237            __gen_uint(values->stencil_front.compare_function, 16, 18) |
3238            __gen_uint(values->stencil_front.stencil_fail, 19, 21) |
3239            __gen_uint(values->stencil_front.depth_fail, 22, 24) |
3240            __gen_uint(values->stencil_front.depth_pass, 25, 27);
3241   cl[11] = __gen_uint(values->stencil_back.reference_value, 0, 7) |
3242            __gen_uint(values->stencil_back.mask, 8, 15) |
3243            __gen_uint(values->stencil_back.compare_function, 16, 18) |
3244            __gen_uint(values->stencil_back.stencil_fail, 19, 21) |
3245            __gen_uint(values->stencil_back.depth_fail, 22, 24) |
3246            __gen_uint(values->stencil_back.depth_pass, 25, 27);
3247   cl[12] = __gen_uint(values->preload.compute.pc, 6, 6) |
3248            __gen_uint(values->preload.compute.local_invocation_xy, 7, 7) |
3249            __gen_uint(values->preload.compute.local_invocation_z, 8, 8) |
3250            __gen_uint(values->preload.compute.work_group_x, 9, 9) |
3251            __gen_uint(values->preload.compute.work_group_y, 10, 10) |
3252            __gen_uint(values->preload.compute.work_group_z, 11, 11) |
3253            __gen_uint(values->preload.compute.global_invocation_x, 12, 12) |
3254            __gen_uint(values->preload.compute.global_invocation_y, 13, 13) |
3255            __gen_uint(values->preload.compute.global_invocation_z, 14, 14) |
3256            __gen_uint(values->preload.vertex.warp_limit, 0, 1) |
3257            __gen_uint(values->preload.vertex.pc, 6, 6) |
3258            __gen_uint(values->preload.vertex.position_result_address_lo, 10, 10) |
3259            __gen_uint(values->preload.vertex.position_result_address_hi, 11, 11) |
3260            __gen_uint(values->preload.vertex.vertex_id, 13, 13) |
3261            __gen_uint(values->preload.vertex.instance_id, 14, 14) |
3262            __gen_uint(values->preload.fragment.pc, 6, 6) |
3263            __gen_uint(values->preload.fragment.coverage, 7, 7) |
3264            __gen_uint(values->preload.fragment.primitive_id, 9, 9) |
3265            __gen_uint(values->preload.fragment.primitive_flags, 10, 10) |
3266            __gen_uint(values->preload.fragment.fragment_position, 11, 11) |
3267            __gen_uint(values->preload.fragment.sample_mask_id, 13, 13) |
3268            __gen_uint(values->preload.uniform_count, 15, 21) |
3269            __gen_uint(fui(values->alpha_reference), 0, 32);
3270   cl[13] = __gen_uint(values->thread_balancing, 0, 15) |
3271            __gen_uint(values->secondary_preload.compute.pc, 6, 6) |
3272            __gen_uint(values->secondary_preload.compute.local_invocation_xy, 7, 7) |
3273            __gen_uint(values->secondary_preload.compute.local_invocation_z, 8, 8) |
3274            __gen_uint(values->secondary_preload.compute.work_group_x, 9, 9) |
3275            __gen_uint(values->secondary_preload.compute.work_group_y, 10, 10) |
3276            __gen_uint(values->secondary_preload.compute.work_group_z, 11, 11) |
3277            __gen_uint(values->secondary_preload.compute.global_invocation_x, 12, 12) |
3278            __gen_uint(values->secondary_preload.compute.global_invocation_y, 13, 13) |
3279            __gen_uint(values->secondary_preload.compute.global_invocation_z, 14, 14) |
3280            __gen_uint(values->secondary_preload.vertex.warp_limit, 0, 1) |
3281            __gen_uint(values->secondary_preload.vertex.pc, 6, 6) |
3282            __gen_uint(values->secondary_preload.vertex.position_result_address_lo, 10, 10) |
3283            __gen_uint(values->secondary_preload.vertex.position_result_address_hi, 11, 11) |
3284            __gen_uint(values->secondary_preload.vertex.vertex_id, 13, 13) |
3285            __gen_uint(values->secondary_preload.vertex.instance_id, 14, 14) |
3286            __gen_uint(values->secondary_preload.fragment.pc, 6, 6) |
3287            __gen_uint(values->secondary_preload.fragment.coverage, 7, 7) |
3288            __gen_uint(values->secondary_preload.fragment.primitive_id, 9, 9) |
3289            __gen_uint(values->secondary_preload.fragment.primitive_flags, 10, 10) |
3290            __gen_uint(values->secondary_preload.fragment.fragment_position, 11, 11) |
3291            __gen_uint(values->secondary_preload.fragment.sample_mask_id, 13, 13) |
3292            __gen_uint(values->secondary_preload.uniform_count, 15, 21);
3293   cl[14] = __gen_uint(values->secondary_shader, 0, 63);
3294   cl[15] = __gen_uint(values->secondary_shader, 0, 63) >> 32 |
3295            __gen_uint(values->message_preload_1, 0, 15) |
3296            __gen_uint(values->message_preload_2, 16, 31);
3297}
3298
3299
3300#define MALI_RENDERER_STATE_LENGTH 64
3301#define MALI_RENDERER_STATE_ALIGN 64
3302struct mali_renderer_state_packed { uint32_t opaque[16]; };
3303static inline void
3304MALI_RENDERER_STATE_unpack(const uint8_t * restrict cl,
3305                           struct MALI_RENDERER_STATE * restrict values)
3306{
3307   if (((const uint32_t *) cl)[4] & 0x26060400) fprintf(stderr, "XXX: Invalid field of Renderer State unpacked at word 4\n");
3308   if (((const uint32_t *) cl)[8] & 0x200000) fprintf(stderr, "XXX: Invalid field of Renderer State unpacked at word 8\n");
3309   if (((const uint32_t *) cl)[9] & 0xb180000) fprintf(stderr, "XXX: Invalid field of Renderer State unpacked at word 9\n");
3310   if (((const uint32_t *) cl)[10] & 0xf0000000) fprintf(stderr, "XXX: Invalid field of Renderer State unpacked at word 10\n");
3311   if (((const uint32_t *) cl)[11] & 0xf0000000) fprintf(stderr, "XXX: Invalid field of Renderer State unpacked at word 11\n");
3312   if (((const uint32_t *) cl)[13] & 0xffc00000) fprintf(stderr, "XXX: Invalid field of Renderer State unpacked at word 13\n");
3313   values->shader.shader = __gen_unpack_uint(cl, 0, 63);
3314   values->shader.sampler_count = __gen_unpack_uint(cl, 64, 79);
3315   values->shader.texture_count = __gen_unpack_uint(cl, 80, 95);
3316   values->shader.attribute_count = __gen_unpack_uint(cl, 96, 111);
3317   values->shader.varying_count = __gen_unpack_uint(cl, 112, 127);
3318   values->properties.uniform_buffer_count = __gen_unpack_uint(cl, 128, 135);
3319   values->properties.depth_source = (enum mali_depth_source)__gen_unpack_uint(cl, 136, 137);
3320   values->properties.shader_contains_barrier = __gen_unpack_uint(cl, 139, 139);
3321   values->properties.shader_register_allocation = (enum mali_shader_register_allocation)__gen_unpack_uint(cl, 140, 141);
3322   values->properties.secondary_shader_register_allocation = (enum mali_shader_register_allocation)__gen_unpack_uint(cl, 142, 143);
3323   values->properties.shader_modifies_coverage = __gen_unpack_uint(cl, 144, 144);
3324   values->properties.allow_forward_pixel_to_kill = __gen_unpack_uint(cl, 147, 147);
3325   values->properties.allow_forward_pixel_to_be_killed = __gen_unpack_uint(cl, 148, 148);
3326   values->properties.pixel_kill_operation = (enum mali_pixel_kill)__gen_unpack_uint(cl, 149, 150);
3327   values->properties.zs_update_operation = (enum mali_pixel_kill)__gen_unpack_uint(cl, 151, 152);
3328   values->properties.point_sprite_coord_origin_max_y = __gen_unpack_uint(cl, 155, 155);
3329   values->properties.stencil_from_shader = __gen_unpack_uint(cl, 156, 156);
3330   values->properties.shader_wait_dependency_6 = __gen_unpack_uint(cl, 158, 158);
3331   values->properties.shader_wait_dependency_7 = __gen_unpack_uint(cl, 159, 159);
3332   values->depth_units = __gen_unpack_float(cl, 160, 191);
3333   values->depth_factor = __gen_unpack_float(cl, 192, 223);
3334   values->depth_bias_clamp = __gen_unpack_float(cl, 224, 255);
3335   values->multisample_misc.sample_mask = __gen_unpack_uint(cl, 256, 271);
3336   values->multisample_misc.multisample_enable = __gen_unpack_uint(cl, 272, 272);
3337   values->multisample_misc.multisample_late_coverage = __gen_unpack_uint(cl, 273, 273);
3338   values->multisample_misc.evaluate_per_sample = __gen_unpack_uint(cl, 274, 274);
3339   values->multisample_misc.fixed_function_depth_range_fixed = __gen_unpack_uint(cl, 275, 275);
3340   values->multisample_misc.shader_depth_range_fixed = __gen_unpack_uint(cl, 276, 276);
3341   values->multisample_misc.overdraw_alpha1 = __gen_unpack_uint(cl, 278, 278);
3342   values->multisample_misc.overdraw_alpha0 = __gen_unpack_uint(cl, 279, 279);
3343   values->multisample_misc.depth_function = (enum mali_func)__gen_unpack_uint(cl, 280, 282);
3344   values->multisample_misc.depth_write_mask = __gen_unpack_uint(cl, 283, 283);
3345   values->multisample_misc.fixed_function_near_discard = __gen_unpack_uint(cl, 284, 284);
3346   values->multisample_misc.fixed_function_far_discard = __gen_unpack_uint(cl, 285, 285);
3347   values->multisample_misc.fragment_near_discard = __gen_unpack_uint(cl, 286, 286);
3348   values->multisample_misc.fragment_far_discard = __gen_unpack_uint(cl, 287, 287);
3349   values->stencil_mask_misc.stencil_mask_front = __gen_unpack_uint(cl, 288, 295);
3350   values->stencil_mask_misc.stencil_mask_back = __gen_unpack_uint(cl, 296, 303);
3351   values->stencil_mask_misc.stencil_enable = __gen_unpack_uint(cl, 304, 304);
3352   values->stencil_mask_misc.alpha_to_coverage = __gen_unpack_uint(cl, 305, 305);
3353   values->stencil_mask_misc.alpha_to_coverage_invert = __gen_unpack_uint(cl, 306, 306);
3354   values->stencil_mask_misc.alpha_test_compare_function = (enum mali_func)__gen_unpack_uint(cl, 309, 311);
3355   values->stencil_mask_misc.force_seamless_cubemaps = __gen_unpack_uint(cl, 314, 314);
3356   values->stencil_mask_misc.depth_range_1 = __gen_unpack_uint(cl, 316, 316);
3357   values->stencil_mask_misc.depth_range_2 = __gen_unpack_uint(cl, 317, 317);
3358   values->stencil_mask_misc.single_sampled_lines = __gen_unpack_uint(cl, 318, 318);
3359   values->stencil_mask_misc.point_snap = __gen_unpack_uint(cl, 319, 319);
3360   values->stencil_front.reference_value = __gen_unpack_uint(cl, 320, 327);
3361   values->stencil_front.mask = __gen_unpack_uint(cl, 328, 335);
3362   values->stencil_front.compare_function = (enum mali_func)__gen_unpack_uint(cl, 336, 338);
3363   values->stencil_front.stencil_fail = (enum mali_stencil_op)__gen_unpack_uint(cl, 339, 341);
3364   values->stencil_front.depth_fail = (enum mali_stencil_op)__gen_unpack_uint(cl, 342, 344);
3365   values->stencil_front.depth_pass = (enum mali_stencil_op)__gen_unpack_uint(cl, 345, 347);
3366   values->stencil_back.reference_value = __gen_unpack_uint(cl, 352, 359);
3367   values->stencil_back.mask = __gen_unpack_uint(cl, 360, 367);
3368   values->stencil_back.compare_function = (enum mali_func)__gen_unpack_uint(cl, 368, 370);
3369   values->stencil_back.stencil_fail = (enum mali_stencil_op)__gen_unpack_uint(cl, 371, 373);
3370   values->stencil_back.depth_fail = (enum mali_stencil_op)__gen_unpack_uint(cl, 374, 376);
3371   values->stencil_back.depth_pass = (enum mali_stencil_op)__gen_unpack_uint(cl, 377, 379);
3372   values->preload.compute.pc = __gen_unpack_uint(cl, 390, 390);
3373   values->preload.compute.local_invocation_xy = __gen_unpack_uint(cl, 391, 391);
3374   values->preload.compute.local_invocation_z = __gen_unpack_uint(cl, 392, 392);
3375   values->preload.compute.work_group_x = __gen_unpack_uint(cl, 393, 393);
3376   values->preload.compute.work_group_y = __gen_unpack_uint(cl, 394, 394);
3377   values->preload.compute.work_group_z = __gen_unpack_uint(cl, 395, 395);
3378   values->preload.compute.global_invocation_x = __gen_unpack_uint(cl, 396, 396);
3379   values->preload.compute.global_invocation_y = __gen_unpack_uint(cl, 397, 397);
3380   values->preload.compute.global_invocation_z = __gen_unpack_uint(cl, 398, 398);
3381   values->preload.vertex.warp_limit = (enum mali_warp_limit)__gen_unpack_uint(cl, 384, 385);
3382   values->preload.vertex.pc = __gen_unpack_uint(cl, 390, 390);
3383   values->preload.vertex.position_result_address_lo = __gen_unpack_uint(cl, 394, 394);
3384   values->preload.vertex.position_result_address_hi = __gen_unpack_uint(cl, 395, 395);
3385   values->preload.vertex.vertex_id = __gen_unpack_uint(cl, 397, 397);
3386   values->preload.vertex.instance_id = __gen_unpack_uint(cl, 398, 398);
3387   values->preload.fragment.pc = __gen_unpack_uint(cl, 390, 390);
3388   values->preload.fragment.coverage = __gen_unpack_uint(cl, 391, 391);
3389   values->preload.fragment.primitive_id = __gen_unpack_uint(cl, 393, 393);
3390   values->preload.fragment.primitive_flags = __gen_unpack_uint(cl, 394, 394);
3391   values->preload.fragment.fragment_position = __gen_unpack_uint(cl, 395, 395);
3392   values->preload.fragment.sample_mask_id = __gen_unpack_uint(cl, 397, 397);
3393   values->preload.uniform_count = __gen_unpack_uint(cl, 399, 405);
3394   values->alpha_reference = __gen_unpack_float(cl, 384, 415);
3395   values->thread_balancing = __gen_unpack_uint(cl, 416, 431);
3396   values->secondary_preload.compute.pc = __gen_unpack_uint(cl, 422, 422);
3397   values->secondary_preload.compute.local_invocation_xy = __gen_unpack_uint(cl, 423, 423);
3398   values->secondary_preload.compute.local_invocation_z = __gen_unpack_uint(cl, 424, 424);
3399   values->secondary_preload.compute.work_group_x = __gen_unpack_uint(cl, 425, 425);
3400   values->secondary_preload.compute.work_group_y = __gen_unpack_uint(cl, 426, 426);
3401   values->secondary_preload.compute.work_group_z = __gen_unpack_uint(cl, 427, 427);
3402   values->secondary_preload.compute.global_invocation_x = __gen_unpack_uint(cl, 428, 428);
3403   values->secondary_preload.compute.global_invocation_y = __gen_unpack_uint(cl, 429, 429);
3404   values->secondary_preload.compute.global_invocation_z = __gen_unpack_uint(cl, 430, 430);
3405   values->secondary_preload.vertex.warp_limit = (enum mali_warp_limit)__gen_unpack_uint(cl, 416, 417);
3406   values->secondary_preload.vertex.pc = __gen_unpack_uint(cl, 422, 422);
3407   values->secondary_preload.vertex.position_result_address_lo = __gen_unpack_uint(cl, 426, 426);
3408   values->secondary_preload.vertex.position_result_address_hi = __gen_unpack_uint(cl, 427, 427);
3409   values->secondary_preload.vertex.vertex_id = __gen_unpack_uint(cl, 429, 429);
3410   values->secondary_preload.vertex.instance_id = __gen_unpack_uint(cl, 430, 430);
3411   values->secondary_preload.fragment.pc = __gen_unpack_uint(cl, 422, 422);
3412   values->secondary_preload.fragment.coverage = __gen_unpack_uint(cl, 423, 423);
3413   values->secondary_preload.fragment.primitive_id = __gen_unpack_uint(cl, 425, 425);
3414   values->secondary_preload.fragment.primitive_flags = __gen_unpack_uint(cl, 426, 426);
3415   values->secondary_preload.fragment.fragment_position = __gen_unpack_uint(cl, 427, 427);
3416   values->secondary_preload.fragment.sample_mask_id = __gen_unpack_uint(cl, 429, 429);
3417   values->secondary_preload.uniform_count = __gen_unpack_uint(cl, 431, 437);
3418   values->secondary_shader = __gen_unpack_uint(cl, 448, 511);
3419   values->message_preload_1 = __gen_unpack_uint(cl, 480, 495);
3420   values->message_preload_2 = __gen_unpack_uint(cl, 496, 511);
3421}
3422
3423static inline void
3424MALI_RENDERER_STATE_print(FILE *fp, const struct MALI_RENDERER_STATE * values, unsigned indent)
3425{
3426   fprintf(fp, "%*sShader:\n", indent, "");
3427   MALI_SHADER_print(fp, &values->shader, indent + 2);
3428   fprintf(fp, "%*sProperties:\n", indent, "");
3429   MALI_RENDERER_PROPERTIES_print(fp, &values->properties, indent + 2);
3430   fprintf(fp, "%*sDepth units: %f\n", indent, "", values->depth_units);
3431   fprintf(fp, "%*sDepth factor: %f\n", indent, "", values->depth_factor);
3432   fprintf(fp, "%*sDepth bias clamp: %f\n", indent, "", values->depth_bias_clamp);
3433   fprintf(fp, "%*sMultisample, Misc:\n", indent, "");
3434   MALI_MULTISAMPLE_MISC_print(fp, &values->multisample_misc, indent + 2);
3435   fprintf(fp, "%*sStencil Mask, Misc:\n", indent, "");
3436   MALI_STENCIL_MASK_MISC_print(fp, &values->stencil_mask_misc, indent + 2);
3437   fprintf(fp, "%*sStencil front:\n", indent, "");
3438   MALI_STENCIL_print(fp, &values->stencil_front, indent + 2);
3439   fprintf(fp, "%*sStencil back:\n", indent, "");
3440   MALI_STENCIL_print(fp, &values->stencil_back, indent + 2);
3441   fprintf(fp, "%*sPreload:\n", indent, "");
3442   MALI_PRELOAD_print(fp, &values->preload, indent + 2);
3443   fprintf(fp, "%*sAlpha reference: %f\n", indent, "", values->alpha_reference);
3444   fprintf(fp, "%*sThread Balancing: %u\n", indent, "", values->thread_balancing);
3445   fprintf(fp, "%*sSecondary preload:\n", indent, "");
3446   MALI_PRELOAD_print(fp, &values->secondary_preload, indent + 2);
3447   fprintf(fp, "%*sSecondary shader: 0x%" PRIx64 "\n", indent, "", values->secondary_shader);
3448   fprintf(fp, "%*sMessage Preload 1: %u\n", indent, "", values->message_preload_1);
3449   fprintf(fp, "%*sMessage Preload 2: %u\n", indent, "", values->message_preload_2);
3450}
3451
3452struct MALI_UNIFORM_BUFFER {
3453   uint32_t                             entries;
3454   uint64_t                             pointer;
3455};
3456
3457#define MALI_UNIFORM_BUFFER_header              \
3458   0
3459
3460static inline void
3461MALI_UNIFORM_BUFFER_pack(uint32_t * restrict cl,
3462                         const struct MALI_UNIFORM_BUFFER * restrict values)
3463{
3464   assert(values->entries >= 1);
3465   assert((values->pointer & 0xf) == 0);
3466   cl[ 0] = __gen_uint(values->entries - 1, 0, 11) |
3467            __gen_uint(values->pointer >> 4, 12, 63);
3468   cl[ 1] = __gen_uint(values->pointer >> 4, 12, 63) >> 32;
3469}
3470
3471
3472#define MALI_UNIFORM_BUFFER_LENGTH 8
3473#define MALI_UNIFORM_BUFFER_ALIGN 8
3474struct mali_uniform_buffer_packed { uint32_t opaque[2]; };
3475static inline void
3476MALI_UNIFORM_BUFFER_unpack(const uint8_t * restrict cl,
3477                           struct MALI_UNIFORM_BUFFER * restrict values)
3478{
3479   values->entries = __gen_unpack_uint(cl, 0, 11) + 1;
3480   values->pointer = __gen_unpack_uint(cl, 12, 63) << 4;
3481}
3482
3483static inline void
3484MALI_UNIFORM_BUFFER_print(FILE *fp, const struct MALI_UNIFORM_BUFFER * values, unsigned indent)
3485{
3486   fprintf(fp, "%*sEntries: %u\n", indent, "", values->entries);
3487   fprintf(fp, "%*sPointer: 0x%" PRIx64 "\n", indent, "", values->pointer);
3488}
3489
3490struct MALI_VIEWPORT {
3491   float                                minimum_x;
3492   float                                minimum_y;
3493   float                                maximum_x;
3494   float                                maximum_y;
3495   float                                minimum_z;
3496   float                                maximum_z;
3497   uint32_t                             scissor_minimum_x;
3498   uint32_t                             scissor_minimum_y;
3499   uint32_t                             scissor_maximum_x;
3500   uint32_t                             scissor_maximum_y;
3501};
3502
3503#define MALI_VIEWPORT_header                    \
3504   .minimum_x = -INFINITY,  \
3505   .minimum_y = -INFINITY,  \
3506   .maximum_x = +INFINITY,  \
3507   .maximum_y = +INFINITY,  \
3508   .minimum_z = 0.0,  \
3509   .maximum_z = 1.0,  \
3510   .scissor_minimum_x = 0,  \
3511   .scissor_minimum_y = 0
3512
3513static inline void
3514MALI_VIEWPORT_pack(uint32_t * restrict cl,
3515                   const struct MALI_VIEWPORT * restrict values)
3516{
3517   cl[ 0] = __gen_uint(fui(values->minimum_x), 0, 32);
3518   cl[ 1] = __gen_uint(fui(values->minimum_y), 0, 32);
3519   cl[ 2] = __gen_uint(fui(values->maximum_x), 0, 32);
3520   cl[ 3] = __gen_uint(fui(values->maximum_y), 0, 32);
3521   cl[ 4] = __gen_uint(fui(values->minimum_z), 0, 32);
3522   cl[ 5] = __gen_uint(fui(values->maximum_z), 0, 32);
3523   cl[ 6] = __gen_uint(values->scissor_minimum_x, 0, 15) |
3524            __gen_uint(values->scissor_minimum_y, 16, 31);
3525   cl[ 7] = __gen_uint(values->scissor_maximum_x, 0, 15) |
3526            __gen_uint(values->scissor_maximum_y, 16, 31);
3527}
3528
3529
3530#define MALI_VIEWPORT_LENGTH 32
3531#define MALI_VIEWPORT_ALIGN 32
3532struct mali_viewport_packed { uint32_t opaque[8]; };
3533static inline void
3534MALI_VIEWPORT_unpack(const uint8_t * restrict cl,
3535                     struct MALI_VIEWPORT * restrict values)
3536{
3537   values->minimum_x = __gen_unpack_float(cl, 0, 31);
3538   values->minimum_y = __gen_unpack_float(cl, 32, 63);
3539   values->maximum_x = __gen_unpack_float(cl, 64, 95);
3540   values->maximum_y = __gen_unpack_float(cl, 96, 127);
3541   values->minimum_z = __gen_unpack_float(cl, 128, 159);
3542   values->maximum_z = __gen_unpack_float(cl, 160, 191);
3543   values->scissor_minimum_x = __gen_unpack_uint(cl, 192, 207);
3544   values->scissor_minimum_y = __gen_unpack_uint(cl, 208, 223);
3545   values->scissor_maximum_x = __gen_unpack_uint(cl, 224, 239);
3546   values->scissor_maximum_y = __gen_unpack_uint(cl, 240, 255);
3547}
3548
3549static inline void
3550MALI_VIEWPORT_print(FILE *fp, const struct MALI_VIEWPORT * values, unsigned indent)
3551{
3552   fprintf(fp, "%*sMinimum X: %f\n", indent, "", values->minimum_x);
3553   fprintf(fp, "%*sMinimum Y: %f\n", indent, "", values->minimum_y);
3554   fprintf(fp, "%*sMaximum X: %f\n", indent, "", values->maximum_x);
3555   fprintf(fp, "%*sMaximum Y: %f\n", indent, "", values->maximum_y);
3556   fprintf(fp, "%*sMinimum Z: %f\n", indent, "", values->minimum_z);
3557   fprintf(fp, "%*sMaximum Z: %f\n", indent, "", values->maximum_z);
3558   fprintf(fp, "%*sScissor Minimum X: %u\n", indent, "", values->scissor_minimum_x);
3559   fprintf(fp, "%*sScissor Minimum Y: %u\n", indent, "", values->scissor_minimum_y);
3560   fprintf(fp, "%*sScissor Maximum X: %u\n", indent, "", values->scissor_maximum_x);
3561   fprintf(fp, "%*sScissor Maximum Y: %u\n", indent, "", values->scissor_maximum_y);
3562}
3563
3564struct MALI_LOCAL_STORAGE {
3565   uint32_t                             tls_size;
3566   uint32_t                             tls_initial_stack_pointer_offset;
3567   uint32_t                             wls_instances;
3568#define MALI_LOCAL_STORAGE_NO_WORKGROUP_MEM      2147483648
3569   uint32_t                             wls_size_base;
3570   uint32_t                             wls_size_scale;
3571   uint64_t                             tls_base_pointer;
3572   uint64_t                             wls_base_pointer;
3573};
3574
3575#define MALI_LOCAL_STORAGE_header               \
3576   .wls_instances = MALI_LOCAL_STORAGE_NO_WORKGROUP_MEM
3577
3578static inline void
3579MALI_LOCAL_STORAGE_pack(uint32_t * restrict cl,
3580                        const struct MALI_LOCAL_STORAGE * restrict values)
3581{
3582   assert(util_is_power_of_two_nonzero(values->wls_instances));
3583   cl[ 0] = __gen_uint(values->tls_size, 0, 4) |
3584            __gen_uint(values->tls_initial_stack_pointer_offset, 5, 31);
3585   cl[ 1] = __gen_uint(util_logbase2(values->wls_instances), 0, 4) |
3586            __gen_uint(values->wls_size_base, 5, 6) |
3587            __gen_uint(values->wls_size_scale, 8, 12);
3588   cl[ 2] = __gen_uint(values->tls_base_pointer, 0, 63);
3589   cl[ 3] = __gen_uint(values->tls_base_pointer, 0, 63) >> 32;
3590   cl[ 4] = __gen_uint(values->wls_base_pointer, 0, 63);
3591   cl[ 5] = __gen_uint(values->wls_base_pointer, 0, 63) >> 32;
3592   cl[ 6] = 0;
3593   cl[ 7] = 0;
3594}
3595
3596
3597#define MALI_LOCAL_STORAGE_LENGTH 32
3598#define MALI_LOCAL_STORAGE_ALIGN 64
3599struct mali_local_storage_packed { uint32_t opaque[8]; };
3600static inline void
3601MALI_LOCAL_STORAGE_unpack(const uint8_t * restrict cl,
3602                          struct MALI_LOCAL_STORAGE * restrict values)
3603{
3604   if (((const uint32_t *) cl)[1] & 0xffffe080) fprintf(stderr, "XXX: Invalid field of Local Storage unpacked at word 1\n");
3605   if (((const uint32_t *) cl)[6] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Local Storage unpacked at word 6\n");
3606   if (((const uint32_t *) cl)[7] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Local Storage unpacked at word 7\n");
3607   values->tls_size = __gen_unpack_uint(cl, 0, 4);
3608   values->tls_initial_stack_pointer_offset = __gen_unpack_uint(cl, 5, 31);
3609   values->wls_instances = 1U << __gen_unpack_uint(cl, 32, 36);
3610   values->wls_size_base = __gen_unpack_uint(cl, 37, 38);
3611   values->wls_size_scale = __gen_unpack_uint(cl, 40, 44);
3612   values->tls_base_pointer = __gen_unpack_uint(cl, 64, 127);
3613   values->wls_base_pointer = __gen_unpack_uint(cl, 128, 191);
3614}
3615
3616static inline void
3617MALI_LOCAL_STORAGE_print(FILE *fp, const struct MALI_LOCAL_STORAGE * values, unsigned indent)
3618{
3619   fprintf(fp, "%*sTLS Size: %u\n", indent, "", values->tls_size);
3620   fprintf(fp, "%*sTLS Initial Stack Pointer Offset: %u\n", indent, "", values->tls_initial_stack_pointer_offset);
3621   fprintf(fp, "%*sWLS Instances: %u\n", indent, "", values->wls_instances);
3622   fprintf(fp, "%*sWLS Size Base: %u\n", indent, "", values->wls_size_base);
3623   fprintf(fp, "%*sWLS Size Scale: %u\n", indent, "", values->wls_size_scale);
3624   fprintf(fp, "%*sTLS Base Pointer: 0x%" PRIx64 "\n", indent, "", values->tls_base_pointer);
3625   fprintf(fp, "%*sWLS Base Pointer: 0x%" PRIx64 "\n", indent, "", values->wls_base_pointer);
3626}
3627
3628enum mali_color_buffer_internal_format {
3629        MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW_VALUE =      0,
3630        MALI_COLOR_BUFFER_INTERNAL_FORMAT_R8G8B8A8 =      1,
3631        MALI_COLOR_BUFFER_INTERNAL_FORMAT_R10G10B10A2 =      2,
3632        MALI_COLOR_BUFFER_INTERNAL_FORMAT_R8G8B8A2 =      3,
3633        MALI_COLOR_BUFFER_INTERNAL_FORMAT_R4G4B4A4 =      4,
3634        MALI_COLOR_BUFFER_INTERNAL_FORMAT_R5G6B5A0 =      5,
3635        MALI_COLOR_BUFFER_INTERNAL_FORMAT_R5G5B5A1 =      6,
3636        MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW8 =     32,
3637        MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW16 =     33,
3638        MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW32 =     34,
3639        MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW64 =     35,
3640        MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW128 =     36,
3641};
3642
3643static inline const char *
3644mali_color_buffer_internal_format_as_str(enum mali_color_buffer_internal_format imm)
3645{
3646    switch (imm) {
3647    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW_VALUE: return "Raw Value";
3648    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R8G8B8A8: return "R8G8B8A8";
3649    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R10G10B10A2: return "R10G10B10A2";
3650    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R8G8B8A2: return "R8G8B8A2";
3651    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R4G4B4A4: return "R4G4B4A4";
3652    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R5G6B5A0: return "R5G6B5A0";
3653    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R5G5B5A1: return "R5G5B5A1";
3654    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW8: return "RAW8";
3655    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW16: return "RAW16";
3656    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW32: return "RAW32";
3657    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW64: return "RAW64";
3658    case MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW128: return "RAW128";
3659    default: return "XXX: INVALID";
3660    }
3661}
3662
3663enum mali_color_format {
3664        MALI_COLOR_FORMAT_RAW8               =      0,
3665        MALI_COLOR_FORMAT_RAW16              =      1,
3666        MALI_COLOR_FORMAT_RAW24              =      2,
3667        MALI_COLOR_FORMAT_RAW32              =      3,
3668        MALI_COLOR_FORMAT_RAW48              =      4,
3669        MALI_COLOR_FORMAT_RAW64              =      5,
3670        MALI_COLOR_FORMAT_RAW96              =      6,
3671        MALI_COLOR_FORMAT_RAW128             =      7,
3672        MALI_COLOR_FORMAT_RAW192             =      8,
3673        MALI_COLOR_FORMAT_RAW256             =      9,
3674        MALI_COLOR_FORMAT_RAW384             =     10,
3675        MALI_COLOR_FORMAT_RAW512             =     11,
3676        MALI_COLOR_FORMAT_RAW768             =     12,
3677        MALI_COLOR_FORMAT_RAW1024            =     13,
3678        MALI_COLOR_FORMAT_RAW1536            =     14,
3679        MALI_COLOR_FORMAT_RAW2048            =     15,
3680        MALI_COLOR_FORMAT_R8                 =     16,
3681        MALI_COLOR_FORMAT_R8G8               =     17,
3682        MALI_COLOR_FORMAT_R8G8B8             =     18,
3683        MALI_COLOR_FORMAT_R8G8B8A8           =     19,
3684        MALI_COLOR_FORMAT_R4G4B4A4           =     20,
3685        MALI_COLOR_FORMAT_R5G6B5             =     21,
3686        MALI_COLOR_FORMAT_R8G8B8_FROM_R8G8B8A2 =     22,
3687        MALI_COLOR_FORMAT_R10G10B10A2        =     24,
3688        MALI_COLOR_FORMAT_A2B10G10R10        =     25,
3689        MALI_COLOR_FORMAT_R5G5B5A1           =     28,
3690        MALI_COLOR_FORMAT_A1B5G5R5           =     29,
3691        MALI_COLOR_FORMAT_NATIVE             =     31,
3692};
3693
3694static inline const char *
3695mali_color_format_as_str(enum mali_color_format imm)
3696{
3697    switch (imm) {
3698    case MALI_COLOR_FORMAT_RAW8: return "RAW8";
3699    case MALI_COLOR_FORMAT_RAW16: return "RAW16";
3700    case MALI_COLOR_FORMAT_RAW24: return "RAW24";
3701    case MALI_COLOR_FORMAT_RAW32: return "RAW32";
3702    case MALI_COLOR_FORMAT_RAW48: return "RAW48";
3703    case MALI_COLOR_FORMAT_RAW64: return "RAW64";
3704    case MALI_COLOR_FORMAT_RAW96: return "RAW96";
3705    case MALI_COLOR_FORMAT_RAW128: return "RAW128";
3706    case MALI_COLOR_FORMAT_RAW192: return "RAW192";
3707    case MALI_COLOR_FORMAT_RAW256: return "RAW256";
3708    case MALI_COLOR_FORMAT_RAW384: return "RAW384";
3709    case MALI_COLOR_FORMAT_RAW512: return "RAW512";
3710    case MALI_COLOR_FORMAT_RAW768: return "RAW768";
3711    case MALI_COLOR_FORMAT_RAW1024: return "RAW1024";
3712    case MALI_COLOR_FORMAT_RAW1536: return "RAW1536";
3713    case MALI_COLOR_FORMAT_RAW2048: return "RAW2048";
3714    case MALI_COLOR_FORMAT_R8: return "R8";
3715    case MALI_COLOR_FORMAT_R8G8: return "R8G8";
3716    case MALI_COLOR_FORMAT_R8G8B8: return "R8G8B8";
3717    case MALI_COLOR_FORMAT_R8G8B8A8: return "R8G8B8A8";
3718    case MALI_COLOR_FORMAT_R4G4B4A4: return "R4G4B4A4";
3719    case MALI_COLOR_FORMAT_R5G6B5: return "R5G6B5";
3720    case MALI_COLOR_FORMAT_R8G8B8_FROM_R8G8B8A2: return "R8G8B8_FROM_R8G8B8A2";
3721    case MALI_COLOR_FORMAT_R10G10B10A2: return "R10G10B10A2";
3722    case MALI_COLOR_FORMAT_A2B10G10R10: return "A2B10G10R10";
3723    case MALI_COLOR_FORMAT_R5G5B5A1: return "R5G5B5A1";
3724    case MALI_COLOR_FORMAT_A1B5G5R5: return "A1B5G5R5";
3725    case MALI_COLOR_FORMAT_NATIVE: return "NATIVE";
3726    default: return "XXX: INVALID";
3727    }
3728}
3729
3730enum mali_downsampling_accumulation_mode {
3731        MALI_DOWNSAMPLING_ACCUMULATION_MODE_UNSIGNED_NORMALIZED_INTEGER =      0,
3732        MALI_DOWNSAMPLING_ACCUMULATION_MODE_SIGNED_NORMALIZED_INTEGER =      1,
3733};
3734
3735static inline const char *
3736mali_downsampling_accumulation_mode_as_str(enum mali_downsampling_accumulation_mode imm)
3737{
3738    switch (imm) {
3739    case MALI_DOWNSAMPLING_ACCUMULATION_MODE_UNSIGNED_NORMALIZED_INTEGER: return "Unsigned normalized integer";
3740    case MALI_DOWNSAMPLING_ACCUMULATION_MODE_SIGNED_NORMALIZED_INTEGER: return "Signed normalized integer";
3741    default: return "XXX: INVALID";
3742    }
3743}
3744
3745enum mali_sample_layout {
3746        MALI_SAMPLE_LAYOUT_ORDERED_4X_GRID   =      0,
3747        MALI_SAMPLE_LAYOUT_ROTATED_4X_GRID   =      1,
3748        MALI_SAMPLE_LAYOUT_D3D_8X_GRID       =      2,
3749        MALI_SAMPLE_LAYOUT_D3D_16X_GRID      =      3,
3750};
3751
3752static inline const char *
3753mali_sample_layout_as_str(enum mali_sample_layout imm)
3754{
3755    switch (imm) {
3756    case MALI_SAMPLE_LAYOUT_ORDERED_4X_GRID: return "Ordered 4x Grid";
3757    case MALI_SAMPLE_LAYOUT_ROTATED_4X_GRID: return "Rotated 4x Grid";
3758    case MALI_SAMPLE_LAYOUT_D3D_8X_GRID: return "D3D 8x Grid";
3759    case MALI_SAMPLE_LAYOUT_D3D_16X_GRID: return "D3D 16x Grid";
3760    default: return "XXX: INVALID";
3761    }
3762}
3763
3764enum mali_zs_format {
3765        MALI_ZS_FORMAT_D16                   =      1,
3766        MALI_ZS_FORMAT_D24                   =      2,
3767        MALI_ZS_FORMAT_D24X8                 =      4,
3768        MALI_ZS_FORMAT_D24S8                 =      5,
3769        MALI_ZS_FORMAT_X8D24                 =      6,
3770        MALI_ZS_FORMAT_S8D24                 =      7,
3771        MALI_ZS_FORMAT_D32_X8X24             =     13,
3772        MALI_ZS_FORMAT_D32                   =     14,
3773        MALI_ZS_FORMAT_D32_S8X24             =     15,
3774};
3775
3776static inline const char *
3777mali_zs_format_as_str(enum mali_zs_format imm)
3778{
3779    switch (imm) {
3780    case MALI_ZS_FORMAT_D16: return "D16";
3781    case MALI_ZS_FORMAT_D24: return "D24";
3782    case MALI_ZS_FORMAT_D24X8: return "D24X8";
3783    case MALI_ZS_FORMAT_D24S8: return "D24S8";
3784    case MALI_ZS_FORMAT_X8D24: return "X8D24";
3785    case MALI_ZS_FORMAT_S8D24: return "S8D24";
3786    case MALI_ZS_FORMAT_D32_X8X24: return "D32_X8X24";
3787    case MALI_ZS_FORMAT_D32: return "D32";
3788    case MALI_ZS_FORMAT_D32_S8X24: return "D32_S8X24";
3789    default: return "XXX: INVALID";
3790    }
3791}
3792
3793enum mali_zs_preload_format {
3794        MALI_ZS_PRELOAD_FORMAT_D32_S8X24     =      4,
3795};
3796
3797static inline const char *
3798mali_zs_preload_format_as_str(enum mali_zs_preload_format imm)
3799{
3800    switch (imm) {
3801    case MALI_ZS_PRELOAD_FORMAT_D32_S8X24: return "D32_S8X24";
3802    default: return "XXX: INVALID";
3803    }
3804}
3805
3806enum mali_s_format {
3807        MALI_S_FORMAT_S8                     =      1,
3808        MALI_S_FORMAT_S8X8                   =      2,
3809        MALI_S_FORMAT_S8X24                  =      3,
3810        MALI_S_FORMAT_X24S8                  =      4,
3811        MALI_S_FORMAT_X8S8                   =      5,
3812        MALI_S_FORMAT_X32_S8X24              =      6,
3813};
3814
3815static inline const char *
3816mali_s_format_as_str(enum mali_s_format imm)
3817{
3818    switch (imm) {
3819    case MALI_S_FORMAT_S8: return "S8";
3820    case MALI_S_FORMAT_S8X8: return "S8X8";
3821    case MALI_S_FORMAT_S8X24: return "S8X24";
3822    case MALI_S_FORMAT_X24S8: return "X24S8";
3823    case MALI_S_FORMAT_X8S8: return "X8S8";
3824    case MALI_S_FORMAT_X32_S8X24: return "X32_S8X24";
3825    default: return "XXX: INVALID";
3826    }
3827}
3828
3829enum mali_tie_break_rule {
3830        MALI_TIE_BREAK_RULE_0_IN_180_OUT     =      0,
3831        MALI_TIE_BREAK_RULE_0_OUT_180_IN     =      1,
3832        MALI_TIE_BREAK_RULE_MINUS_180_IN_0_OUT =      2,
3833        MALI_TIE_BREAK_RULE_MINUS_180_OUT_0_IN =      3,
3834        MALI_TIE_BREAK_RULE_90_IN_270_OUT    =      4,
3835        MALI_TIE_BREAK_RULE_90_OUT_270_IN    =      5,
3836        MALI_TIE_BREAK_RULE_MINUS_90_IN_90_OUT =      6,
3837        MALI_TIE_BREAK_RULE_MINUS_90_OUT_90_IN =      7,
3838};
3839
3840static inline const char *
3841mali_tie_break_rule_as_str(enum mali_tie_break_rule imm)
3842{
3843    switch (imm) {
3844    case MALI_TIE_BREAK_RULE_0_IN_180_OUT: return "0_IN_180_OUT";
3845    case MALI_TIE_BREAK_RULE_0_OUT_180_IN: return "0_OUT_180_IN";
3846    case MALI_TIE_BREAK_RULE_MINUS_180_IN_0_OUT: return "MINUS_180_IN_0_OUT";
3847    case MALI_TIE_BREAK_RULE_MINUS_180_OUT_0_IN: return "MINUS_180_OUT_0_IN";
3848    case MALI_TIE_BREAK_RULE_90_IN_270_OUT: return "90_IN_270_OUT";
3849    case MALI_TIE_BREAK_RULE_90_OUT_270_IN: return "90_OUT_270_IN";
3850    case MALI_TIE_BREAK_RULE_MINUS_90_IN_90_OUT: return "MINUS_90_IN_90_OUT";
3851    case MALI_TIE_BREAK_RULE_MINUS_90_OUT_90_IN: return "MINUS_90_OUT_90_IN";
3852    default: return "XXX: INVALID";
3853    }
3854}
3855
3856struct MALI_RT_BUFFER {
3857   uint64_t                             base;
3858   uint32_t                             row_stride;
3859   uint32_t                             surface_stride;
3860};
3861
3862#define MALI_RT_BUFFER_header                   \
3863   0
3864
3865static inline void
3866MALI_RT_BUFFER_pack(uint32_t * restrict cl,
3867                    const struct MALI_RT_BUFFER * restrict values)
3868{
3869   cl[ 0] = __gen_uint(values->base, 0, 63);
3870   cl[ 1] = __gen_uint(values->base, 0, 63) >> 32;
3871   cl[ 2] = __gen_uint(values->row_stride, 0, 31);
3872   cl[ 3] = __gen_uint(values->surface_stride, 0, 31);
3873}
3874
3875
3876#define MALI_RT_BUFFER_LENGTH 16
3877struct mali_rt_buffer_packed { uint32_t opaque[4]; };
3878static inline void
3879MALI_RT_BUFFER_unpack(const uint8_t * restrict cl,
3880                      struct MALI_RT_BUFFER * restrict values)
3881{
3882   values->base = __gen_unpack_uint(cl, 0, 63);
3883   values->row_stride = __gen_unpack_uint(cl, 64, 95);
3884   values->surface_stride = __gen_unpack_uint(cl, 96, 127);
3885}
3886
3887static inline void
3888MALI_RT_BUFFER_print(FILE *fp, const struct MALI_RT_BUFFER * values, unsigned indent)
3889{
3890   fprintf(fp, "%*sBase: 0x%" PRIx64 "\n", indent, "", values->base);
3891   fprintf(fp, "%*sRow Stride: %u\n", indent, "", values->row_stride);
3892   fprintf(fp, "%*sSurface Stride: %u\n", indent, "", values->surface_stride);
3893}
3894
3895enum mali_sample_pattern {
3896        MALI_SAMPLE_PATTERN_SINGLE_SAMPLED   =      0,
3897        MALI_SAMPLE_PATTERN_ORDERED_4X_GRID  =      1,
3898        MALI_SAMPLE_PATTERN_ROTATED_4X_GRID  =      2,
3899        MALI_SAMPLE_PATTERN_D3D_8X_GRID      =      3,
3900        MALI_SAMPLE_PATTERN_D3D_16X_GRID     =      4,
3901};
3902
3903static inline const char *
3904mali_sample_pattern_as_str(enum mali_sample_pattern imm)
3905{
3906    switch (imm) {
3907    case MALI_SAMPLE_PATTERN_SINGLE_SAMPLED: return "Single-sampled";
3908    case MALI_SAMPLE_PATTERN_ORDERED_4X_GRID: return "Ordered 4x Grid";
3909    case MALI_SAMPLE_PATTERN_ROTATED_4X_GRID: return "Rotated 4x Grid";
3910    case MALI_SAMPLE_PATTERN_D3D_8X_GRID: return "D3D 8x Grid";
3911    case MALI_SAMPLE_PATTERN_D3D_16X_GRID: return "D3D 16x Grid";
3912    default: return "XXX: INVALID";
3913    }
3914}
3915
3916enum mali_z_internal_format {
3917        MALI_Z_INTERNAL_FORMAT_D16           =      0,
3918        MALI_Z_INTERNAL_FORMAT_D24           =      1,
3919        MALI_Z_INTERNAL_FORMAT_D32           =      2,
3920};
3921
3922static inline const char *
3923mali_z_internal_format_as_str(enum mali_z_internal_format imm)
3924{
3925    switch (imm) {
3926    case MALI_Z_INTERNAL_FORMAT_D16: return "D16";
3927    case MALI_Z_INTERNAL_FORMAT_D24: return "D24";
3928    case MALI_Z_INTERNAL_FORMAT_D32: return "D32";
3929    default: return "XXX: INVALID";
3930    }
3931}
3932
3933enum mali_fbd_tag {
3934        MALI_FBD_TAG_IS_MFBD                 =      1,
3935        MALI_FBD_TAG_HAS_ZS_RT               =      2,
3936        MALI_FBD_TAG_MASK                    =     63,
3937};
3938
3939static inline const char *
3940mali_fbd_tag_as_str(enum mali_fbd_tag imm)
3941{
3942    switch (imm) {
3943    case MALI_FBD_TAG_IS_MFBD: return "IS_MFBD";
3944    case MALI_FBD_TAG_HAS_ZS_RT: return "HAS_ZS_RT";
3945    case MALI_FBD_TAG_MASK: return "MASK";
3946    default: return "XXX: INVALID";
3947    }
3948}
3949
3950enum mali_pre_post_frame_shader_mode {
3951        MALI_PRE_POST_FRAME_SHADER_MODE_NEVER =      0,
3952        MALI_PRE_POST_FRAME_SHADER_MODE_ALWAYS =      1,
3953        MALI_PRE_POST_FRAME_SHADER_MODE_INTERSECT =      2,
3954        MALI_PRE_POST_FRAME_SHADER_MODE_EARLY_ZS_ALWAYS =      3,
3955};
3956
3957static inline const char *
3958mali_pre_post_frame_shader_mode_as_str(enum mali_pre_post_frame_shader_mode imm)
3959{
3960    switch (imm) {
3961    case MALI_PRE_POST_FRAME_SHADER_MODE_NEVER: return "Never";
3962    case MALI_PRE_POST_FRAME_SHADER_MODE_ALWAYS: return "Always";
3963    case MALI_PRE_POST_FRAME_SHADER_MODE_INTERSECT: return "Intersect";
3964    case MALI_PRE_POST_FRAME_SHADER_MODE_EARLY_ZS_ALWAYS: return "Early ZS always";
3965    default: return "XXX: INVALID";
3966    }
3967}
3968
3969struct MALI_FRAMEBUFFER_PARAMETERS {
3970   enum mali_pre_post_frame_shader_mode pre_frame_0;
3971   enum mali_pre_post_frame_shader_mode pre_frame_1;
3972   enum mali_pre_post_frame_shader_mode post_frame;
3973   uint64_t                             sample_locations;
3974   uint64_t                             frame_shader_dcds;
3975   uint32_t                             width;
3976   uint32_t                             height;
3977   uint32_t                             bound_min_x;
3978   uint32_t                             bound_min_y;
3979   uint32_t                             bound_max_x;
3980   uint32_t                             bound_max_y;
3981   uint32_t                             sample_count;
3982   enum mali_sample_pattern             sample_pattern;
3983   enum mali_tie_break_rule             tie_break_rule;
3984   uint32_t                             effective_tile_size;
3985   uint32_t                             x_downsampling_scale;
3986   uint32_t                             y_downsampling_scale;
3987   uint32_t                             render_target_count;
3988   uint32_t                             color_buffer_allocation;
3989   uint32_t                             s_clear;
3990   bool                                 s_write_enable;
3991   bool                                 s_preload_enable;
3992   bool                                 s_unload_enable;
3993   enum mali_z_internal_format          z_internal_format;
3994   bool                                 z_write_enable;
3995   bool                                 z_preload_enable;
3996   bool                                 z_unload_enable;
3997   bool                                 has_zs_crc_extension;
3998   bool                                 crc_read_enable;
3999   bool                                 crc_write_enable;
4000   float                                z_clear;
4001   uint64_t                             tiler;
4002};
4003
4004#define MALI_FRAMEBUFFER_PARAMETERS_header      \
4005   .sample_count = 1
4006
4007static inline void
4008MALI_FRAMEBUFFER_PARAMETERS_pack(uint32_t * restrict cl,
4009                                 const struct MALI_FRAMEBUFFER_PARAMETERS * restrict values)
4010{
4011   assert(values->width >= 1);
4012   assert(values->height >= 1);
4013   assert(util_is_power_of_two_nonzero(values->sample_count));
4014   assert(util_is_power_of_two_nonzero(values->effective_tile_size));
4015   assert(values->render_target_count >= 1);
4016   assert((values->color_buffer_allocation & 0x3ff) == 0);
4017   cl[ 0] = __gen_uint(values->pre_frame_0, 0, 2) |
4018            __gen_uint(values->pre_frame_1, 3, 5) |
4019            __gen_uint(values->post_frame, 6, 8);
4020   cl[ 1] = 0;
4021   cl[ 2] = 0;
4022   cl[ 3] = 0;
4023   cl[ 4] = __gen_uint(values->sample_locations, 0, 63);
4024   cl[ 5] = __gen_uint(values->sample_locations, 0, 63) >> 32;
4025   cl[ 6] = __gen_uint(values->frame_shader_dcds, 0, 63);
4026   cl[ 7] = __gen_uint(values->frame_shader_dcds, 0, 63) >> 32;
4027   cl[ 8] = __gen_uint(values->width - 1, 0, 15) |
4028            __gen_uint(values->height - 1, 16, 31);
4029   cl[ 9] = __gen_uint(values->bound_min_x, 0, 15) |
4030            __gen_uint(values->bound_min_y, 16, 31);
4031   cl[10] = __gen_uint(values->bound_max_x, 0, 15) |
4032            __gen_uint(values->bound_max_y, 16, 31);
4033   cl[11] = __gen_uint(util_logbase2(values->sample_count), 0, 2) |
4034            __gen_uint(values->sample_pattern, 3, 5) |
4035            __gen_uint(values->tie_break_rule, 6, 8) |
4036            __gen_uint(util_logbase2(values->effective_tile_size), 9, 12) |
4037            __gen_uint(values->x_downsampling_scale, 13, 15) |
4038            __gen_uint(values->y_downsampling_scale, 16, 18) |
4039            __gen_uint(values->render_target_count - 1, 19, 22) |
4040            __gen_uint(values->color_buffer_allocation >> 10, 24, 31);
4041   cl[12] = __gen_uint(values->s_clear, 0, 7) |
4042            __gen_uint(values->s_write_enable, 8, 8) |
4043            __gen_uint(values->s_preload_enable, 9, 9) |
4044            __gen_uint(values->s_unload_enable, 10, 10) |
4045            __gen_uint(values->z_internal_format, 16, 17) |
4046            __gen_uint(values->z_write_enable, 18, 18) |
4047            __gen_uint(values->z_preload_enable, 19, 19) |
4048            __gen_uint(values->z_unload_enable, 20, 20) |
4049            __gen_uint(values->has_zs_crc_extension, 21, 21) |
4050            __gen_uint(values->crc_read_enable, 30, 30) |
4051            __gen_uint(values->crc_write_enable, 31, 31);
4052   cl[13] = __gen_uint(fui(values->z_clear), 0, 32);
4053   cl[14] = __gen_uint(values->tiler, 0, 63);
4054   cl[15] = __gen_uint(values->tiler, 0, 63) >> 32;
4055}
4056
4057
4058#define MALI_FRAMEBUFFER_PARAMETERS_LENGTH 64
4059struct mali_framebuffer_parameters_packed { uint32_t opaque[16]; };
4060static inline void
4061MALI_FRAMEBUFFER_PARAMETERS_unpack(const uint8_t * restrict cl,
4062                                   struct MALI_FRAMEBUFFER_PARAMETERS * restrict values)
4063{
4064   if (((const uint32_t *) cl)[0] & 0xfffffe00) fprintf(stderr, "XXX: Invalid field of Framebuffer Parameters unpacked at word 0\n");
4065   if (((const uint32_t *) cl)[1] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Parameters unpacked at word 1\n");
4066   if (((const uint32_t *) cl)[2] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Parameters unpacked at word 2\n");
4067   if (((const uint32_t *) cl)[3] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Parameters unpacked at word 3\n");
4068   if (((const uint32_t *) cl)[11] & 0x800000) fprintf(stderr, "XXX: Invalid field of Framebuffer Parameters unpacked at word 11\n");
4069   if (((const uint32_t *) cl)[12] & 0x3fc0f800) fprintf(stderr, "XXX: Invalid field of Framebuffer Parameters unpacked at word 12\n");
4070   values->pre_frame_0 = (enum mali_pre_post_frame_shader_mode)__gen_unpack_uint(cl, 0, 2);
4071   values->pre_frame_1 = (enum mali_pre_post_frame_shader_mode)__gen_unpack_uint(cl, 3, 5);
4072   values->post_frame = (enum mali_pre_post_frame_shader_mode)__gen_unpack_uint(cl, 6, 8);
4073   values->sample_locations = __gen_unpack_uint(cl, 128, 191);
4074   values->frame_shader_dcds = __gen_unpack_uint(cl, 192, 255);
4075   values->width = __gen_unpack_uint(cl, 256, 271) + 1;
4076   values->height = __gen_unpack_uint(cl, 272, 287) + 1;
4077   values->bound_min_x = __gen_unpack_uint(cl, 288, 303);
4078   values->bound_min_y = __gen_unpack_uint(cl, 304, 319);
4079   values->bound_max_x = __gen_unpack_uint(cl, 320, 335);
4080   values->bound_max_y = __gen_unpack_uint(cl, 336, 351);
4081   values->sample_count = 1U << __gen_unpack_uint(cl, 352, 354);
4082   values->sample_pattern = (enum mali_sample_pattern)__gen_unpack_uint(cl, 355, 357);
4083   values->tie_break_rule = (enum mali_tie_break_rule)__gen_unpack_uint(cl, 358, 360);
4084   values->effective_tile_size = 1U << __gen_unpack_uint(cl, 361, 364);
4085   values->x_downsampling_scale = __gen_unpack_uint(cl, 365, 367);
4086   values->y_downsampling_scale = __gen_unpack_uint(cl, 368, 370);
4087   values->render_target_count = __gen_unpack_uint(cl, 371, 374) + 1;
4088   values->color_buffer_allocation = __gen_unpack_uint(cl, 376, 383) << 10;
4089   values->s_clear = __gen_unpack_uint(cl, 384, 391);
4090   values->s_write_enable = __gen_unpack_uint(cl, 392, 392);
4091   values->s_preload_enable = __gen_unpack_uint(cl, 393, 393);
4092   values->s_unload_enable = __gen_unpack_uint(cl, 394, 394);
4093   values->z_internal_format = (enum mali_z_internal_format)__gen_unpack_uint(cl, 400, 401);
4094   values->z_write_enable = __gen_unpack_uint(cl, 402, 402);
4095   values->z_preload_enable = __gen_unpack_uint(cl, 403, 403);
4096   values->z_unload_enable = __gen_unpack_uint(cl, 404, 404);
4097   values->has_zs_crc_extension = __gen_unpack_uint(cl, 405, 405);
4098   values->crc_read_enable = __gen_unpack_uint(cl, 414, 414);
4099   values->crc_write_enable = __gen_unpack_uint(cl, 415, 415);
4100   values->z_clear = __gen_unpack_float(cl, 416, 447);
4101   values->tiler = __gen_unpack_uint(cl, 448, 511);
4102}
4103
4104static inline void
4105MALI_FRAMEBUFFER_PARAMETERS_print(FILE *fp, const struct MALI_FRAMEBUFFER_PARAMETERS * values, unsigned indent)
4106{
4107   fprintf(fp, "%*sPre Frame 0: %s\n", indent, "", mali_pre_post_frame_shader_mode_as_str(values->pre_frame_0));
4108   fprintf(fp, "%*sPre Frame 1: %s\n", indent, "", mali_pre_post_frame_shader_mode_as_str(values->pre_frame_1));
4109   fprintf(fp, "%*sPost Frame: %s\n", indent, "", mali_pre_post_frame_shader_mode_as_str(values->post_frame));
4110   fprintf(fp, "%*sSample Locations: 0x%" PRIx64 "\n", indent, "", values->sample_locations);
4111   fprintf(fp, "%*sFrame Shader DCDs: 0x%" PRIx64 "\n", indent, "", values->frame_shader_dcds);
4112   fprintf(fp, "%*sWidth: %u\n", indent, "", values->width);
4113   fprintf(fp, "%*sHeight: %u\n", indent, "", values->height);
4114   fprintf(fp, "%*sBound Min X: %u\n", indent, "", values->bound_min_x);
4115   fprintf(fp, "%*sBound Min Y: %u\n", indent, "", values->bound_min_y);
4116   fprintf(fp, "%*sBound Max X: %u\n", indent, "", values->bound_max_x);
4117   fprintf(fp, "%*sBound Max Y: %u\n", indent, "", values->bound_max_y);
4118   fprintf(fp, "%*sSample Count: %u\n", indent, "", values->sample_count);
4119   fprintf(fp, "%*sSample Pattern: %s\n", indent, "", mali_sample_pattern_as_str(values->sample_pattern));
4120   fprintf(fp, "%*sTie-Break Rule: %s\n", indent, "", mali_tie_break_rule_as_str(values->tie_break_rule));
4121   fprintf(fp, "%*sEffective Tile Size: %u\n", indent, "", values->effective_tile_size);
4122   fprintf(fp, "%*sX Downsampling Scale: %u\n", indent, "", values->x_downsampling_scale);
4123   fprintf(fp, "%*sY Downsampling Scale: %u\n", indent, "", values->y_downsampling_scale);
4124   fprintf(fp, "%*sRender Target Count: %u\n", indent, "", values->render_target_count);
4125   fprintf(fp, "%*sColor Buffer Allocation: %u\n", indent, "", values->color_buffer_allocation);
4126   fprintf(fp, "%*sS Clear: %u\n", indent, "", values->s_clear);
4127   fprintf(fp, "%*sS Write Enable: %s\n", indent, "", values->s_write_enable ? "true" : "false");
4128   fprintf(fp, "%*sS Preload Enable: %s\n", indent, "", values->s_preload_enable ? "true" : "false");
4129   fprintf(fp, "%*sS Unload Enable: %s\n", indent, "", values->s_unload_enable ? "true" : "false");
4130   fprintf(fp, "%*sZ Internal Format: %s\n", indent, "", mali_z_internal_format_as_str(values->z_internal_format));
4131   fprintf(fp, "%*sZ Write Enable: %s\n", indent, "", values->z_write_enable ? "true" : "false");
4132   fprintf(fp, "%*sZ Preload Enable: %s\n", indent, "", values->z_preload_enable ? "true" : "false");
4133   fprintf(fp, "%*sZ Unload Enable: %s\n", indent, "", values->z_unload_enable ? "true" : "false");
4134   fprintf(fp, "%*sHas ZS CRC Extension: %s\n", indent, "", values->has_zs_crc_extension ? "true" : "false");
4135   fprintf(fp, "%*sCRC Read Enable: %s\n", indent, "", values->crc_read_enable ? "true" : "false");
4136   fprintf(fp, "%*sCRC Write Enable: %s\n", indent, "", values->crc_write_enable ? "true" : "false");
4137   fprintf(fp, "%*sZ Clear: %f\n", indent, "", values->z_clear);
4138   fprintf(fp, "%*sTiler: 0x%" PRIx64 "\n", indent, "", values->tiler);
4139}
4140
4141struct MALI_ZS_CRC_EXTENSION {
4142   uint64_t                             crc_base;
4143   uint32_t                             crc_row_stride;
4144   enum mali_zs_format                  zs_write_format;
4145   enum mali_block_format               zs_block_format;
4146   enum mali_msaa                       zs_msaa;
4147   bool                                 zs_clean_pixel_write_enable;
4148   uint32_t                             crc_render_target;
4149   enum mali_s_format                   s_write_format;
4150   enum mali_block_format               s_block_format;
4151   enum mali_msaa                       s_msaa;
4152   uint64_t                             zs_writeback_base;
4153   uint32_t                             zs_writeback_row_stride;
4154   uint32_t                             zs_writeback_surface_stride;
4155   uint64_t                             s_writeback_base;
4156   uint32_t                             s_writeback_row_stride;
4157   uint32_t                             s_writeback_surface_stride;
4158   uint64_t                             zs_afbc_header;
4159   uint32_t                             zs_afbc_row_stride;
4160   uint64_t                             zs_afbc_body;
4161   uint64_t                             crc_clear_color;
4162};
4163
4164#define MALI_ZS_CRC_EXTENSION_header            \
4165   .zs_msaa = MALI_MSAA_SINGLE,  \
4166   .s_msaa = MALI_MSAA_SINGLE
4167
4168static inline void
4169MALI_ZS_CRC_EXTENSION_pack(uint32_t * restrict cl,
4170                           const struct MALI_ZS_CRC_EXTENSION * restrict values)
4171{
4172   cl[ 0] = __gen_uint(values->crc_base, 0, 63);
4173   cl[ 1] = __gen_uint(values->crc_base, 0, 63) >> 32;
4174   cl[ 2] = __gen_uint(values->crc_row_stride, 0, 31);
4175   cl[ 3] = __gen_uint(values->zs_write_format, 0, 3) |
4176            __gen_uint(values->zs_block_format, 4, 7) |
4177            __gen_uint(values->zs_msaa, 8, 9) |
4178            __gen_uint(values->zs_clean_pixel_write_enable, 10, 10) |
4179            __gen_uint(values->crc_render_target, 11, 14) |
4180            __gen_uint(values->s_write_format, 16, 19) |
4181            __gen_uint(values->s_block_format, 20, 23) |
4182            __gen_uint(values->s_msaa, 24, 25);
4183   cl[ 4] = __gen_uint(values->zs_writeback_base, 0, 63) |
4184            __gen_uint(values->zs_afbc_header, 0, 63);
4185   cl[ 5] = __gen_uint(values->zs_writeback_base, 0, 63) >> 32 |
4186            __gen_uint(values->zs_afbc_header, 0, 63) >> 32;
4187   cl[ 6] = __gen_uint(values->zs_writeback_row_stride, 0, 31) |
4188            __gen_uint(values->zs_afbc_row_stride, 0, 12);
4189   cl[ 7] = __gen_uint(values->zs_writeback_surface_stride, 0, 31);
4190   cl[ 8] = __gen_uint(values->s_writeback_base, 0, 63) |
4191            __gen_uint(values->zs_afbc_body, 0, 63);
4192   cl[ 9] = __gen_uint(values->s_writeback_base, 0, 63) >> 32 |
4193            __gen_uint(values->zs_afbc_body, 0, 63) >> 32;
4194   cl[10] = __gen_uint(values->s_writeback_row_stride, 0, 31);
4195   cl[11] = __gen_uint(values->s_writeback_surface_stride, 0, 31);
4196   cl[12] = __gen_uint(values->crc_clear_color, 0, 63);
4197   cl[13] = __gen_uint(values->crc_clear_color, 0, 63) >> 32;
4198   cl[14] = 0;
4199   cl[15] = 0;
4200}
4201
4202
4203#define MALI_ZS_CRC_EXTENSION_LENGTH 64
4204#define MALI_ZS_CRC_EXTENSION_ALIGN 64
4205struct mali_zs_crc_extension_packed { uint32_t opaque[16]; };
4206static inline void
4207MALI_ZS_CRC_EXTENSION_unpack(const uint8_t * restrict cl,
4208                             struct MALI_ZS_CRC_EXTENSION * restrict values)
4209{
4210   if (((const uint32_t *) cl)[3] & 0xfc008000) fprintf(stderr, "XXX: Invalid field of ZS CRC Extension unpacked at word 3\n");
4211   if (((const uint32_t *) cl)[14] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of ZS CRC Extension unpacked at word 14\n");
4212   if (((const uint32_t *) cl)[15] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of ZS CRC Extension unpacked at word 15\n");
4213   values->crc_base = __gen_unpack_uint(cl, 0, 63);
4214   values->crc_row_stride = __gen_unpack_uint(cl, 64, 95);
4215   values->zs_write_format = (enum mali_zs_format)__gen_unpack_uint(cl, 96, 99);
4216   values->zs_block_format = (enum mali_block_format)__gen_unpack_uint(cl, 100, 103);
4217   values->zs_msaa = (enum mali_msaa)__gen_unpack_uint(cl, 104, 105);
4218   values->zs_clean_pixel_write_enable = __gen_unpack_uint(cl, 106, 106);
4219   values->crc_render_target = __gen_unpack_uint(cl, 107, 110);
4220   values->s_write_format = (enum mali_s_format)__gen_unpack_uint(cl, 112, 115);
4221   values->s_block_format = (enum mali_block_format)__gen_unpack_uint(cl, 116, 119);
4222   values->s_msaa = (enum mali_msaa)__gen_unpack_uint(cl, 120, 121);
4223   values->zs_writeback_base = __gen_unpack_uint(cl, 128, 191);
4224   values->zs_writeback_row_stride = __gen_unpack_uint(cl, 192, 223);
4225   values->zs_writeback_surface_stride = __gen_unpack_uint(cl, 224, 255);
4226   values->s_writeback_base = __gen_unpack_uint(cl, 256, 319);
4227   values->s_writeback_row_stride = __gen_unpack_uint(cl, 320, 351);
4228   values->s_writeback_surface_stride = __gen_unpack_uint(cl, 352, 383);
4229   values->zs_afbc_header = __gen_unpack_uint(cl, 128, 191);
4230   values->zs_afbc_row_stride = __gen_unpack_uint(cl, 192, 204);
4231   values->zs_afbc_body = __gen_unpack_uint(cl, 256, 319);
4232   values->crc_clear_color = __gen_unpack_uint(cl, 384, 447);
4233}
4234
4235static inline void
4236MALI_ZS_CRC_EXTENSION_print(FILE *fp, const struct MALI_ZS_CRC_EXTENSION * values, unsigned indent)
4237{
4238   fprintf(fp, "%*sCRC Base: 0x%" PRIx64 "\n", indent, "", values->crc_base);
4239   fprintf(fp, "%*sCRC Row Stride: %u\n", indent, "", values->crc_row_stride);
4240   fprintf(fp, "%*sZS Write Format: %s\n", indent, "", mali_zs_format_as_str(values->zs_write_format));
4241   fprintf(fp, "%*sZS Block Format: %s\n", indent, "", mali_block_format_as_str(values->zs_block_format));
4242   fprintf(fp, "%*sZS MSAA: %s\n", indent, "", mali_msaa_as_str(values->zs_msaa));
4243   fprintf(fp, "%*sZS Clean Pixel Write Enable: %s\n", indent, "", values->zs_clean_pixel_write_enable ? "true" : "false");
4244   fprintf(fp, "%*sCRC Render Target: %u\n", indent, "", values->crc_render_target);
4245   fprintf(fp, "%*sS Write Format: %s\n", indent, "", mali_s_format_as_str(values->s_write_format));
4246   fprintf(fp, "%*sS Block Format: %s\n", indent, "", mali_block_format_as_str(values->s_block_format));
4247   fprintf(fp, "%*sS MSAA: %s\n", indent, "", mali_msaa_as_str(values->s_msaa));
4248   fprintf(fp, "%*sZS Writeback Base: 0x%" PRIx64 "\n", indent, "", values->zs_writeback_base);
4249   fprintf(fp, "%*sZS Writeback Row Stride: %u\n", indent, "", values->zs_writeback_row_stride);
4250   fprintf(fp, "%*sZS Writeback Surface Stride: %u\n", indent, "", values->zs_writeback_surface_stride);
4251   fprintf(fp, "%*sS Writeback Base: 0x%" PRIx64 "\n", indent, "", values->s_writeback_base);
4252   fprintf(fp, "%*sS Writeback Row Stride: %u\n", indent, "", values->s_writeback_row_stride);
4253   fprintf(fp, "%*sS Writeback Surface Stride: %u\n", indent, "", values->s_writeback_surface_stride);
4254   fprintf(fp, "%*sZS AFBC Header: 0x%" PRIx64 "\n", indent, "", values->zs_afbc_header);
4255   fprintf(fp, "%*sZS AFBC Row Stride: %u\n", indent, "", values->zs_afbc_row_stride);
4256   fprintf(fp, "%*sZS AFBC Body: 0x%" PRIx64 "\n", indent, "", values->zs_afbc_body);
4257   fprintf(fp, "%*sCRC Clear Color: 0x%" PRIx64 "\n", indent, "", values->crc_clear_color);
4258}
4259
4260enum mali_yuv_conv_k6 {
4261        MALI_YUV_CONV_K6_0                   =      0,
4262        MALI_YUV_CONV_K6_16                  =      1,
4263};
4264
4265static inline const char *
4266mali_yuv_conv_k6_as_str(enum mali_yuv_conv_k6 imm)
4267{
4268    switch (imm) {
4269    case MALI_YUV_CONV_K6_0: return "0";
4270    case MALI_YUV_CONV_K6_16: return "16";
4271    default: return "XXX: INVALID";
4272    }
4273}
4274
4275enum mali_yuv_conv_k7_clamp {
4276        MALI_YUV_CONV_K7_CLAMP_MINUS_128_TO_127 =      0,
4277        MALI_YUV_CONV_K7_CLAMP_MINUS_112_TO_111 =      1,
4278        MALI_YUV_CONV_K7_CLAMP_0_TO_255      =      2,
4279        MALI_YUV_CONV_K7_CLAMP_16_TO_239     =      3,
4280};
4281
4282static inline const char *
4283mali_yuv_conv_k7_clamp_as_str(enum mali_yuv_conv_k7_clamp imm)
4284{
4285    switch (imm) {
4286    case MALI_YUV_CONV_K7_CLAMP_MINUS_128_TO_127: return "MINUS_128_TO_127";
4287    case MALI_YUV_CONV_K7_CLAMP_MINUS_112_TO_111: return "MINUS_112_TO_111";
4288    case MALI_YUV_CONV_K7_CLAMP_0_TO_255: return "0_TO_255";
4289    case MALI_YUV_CONV_K7_CLAMP_16_TO_239: return "16_TO_239";
4290    default: return "XXX: INVALID";
4291    }
4292}
4293
4294enum mali_yuv_conv_k8 {
4295        MALI_YUV_CONV_K8_220                 =      0,
4296        MALI_YUV_CONV_K8_256                 =      1,
4297};
4298
4299static inline const char *
4300mali_yuv_conv_k8_as_str(enum mali_yuv_conv_k8 imm)
4301{
4302    switch (imm) {
4303    case MALI_YUV_CONV_K8_220: return "220";
4304    case MALI_YUV_CONV_K8_256: return "256";
4305    default: return "XXX: INVALID";
4306    }
4307}
4308
4309struct MALI_RENDER_TARGET_YUV_OVERLAY {
4310   enum mali_yuv_swizzle                swizzle;
4311   bool                                 full_range;
4312   enum mali_yuv_conversion_mode        conversion_mode;
4313   enum mali_yuv_cr_siting              cr_siting;
4314   bool                                 unsigned_cr_range;
4315   uint64_t                             plane_0_base;
4316   uint64_t                             plane_1_base;
4317   uint64_t                             plane_2_base;
4318   uint32_t                             plane_0_stride;
4319   uint32_t                             plane_1_2_stride;
4320};
4321
4322#define MALI_RENDER_TARGET_YUV_OVERLAY_header   \
4323   0
4324
4325static inline void
4326MALI_RENDER_TARGET_YUV_OVERLAY_pack(uint32_t * restrict cl,
4327                                    const struct MALI_RENDER_TARGET_YUV_OVERLAY * restrict values)
4328{
4329   cl[ 0] = 0;
4330   cl[ 1] = 0;
4331   cl[ 2] = __gen_uint(values->swizzle, 16, 18) |
4332            __gen_uint(values->full_range, 20, 20) |
4333            __gen_uint(values->conversion_mode, 21, 24) |
4334            __gen_uint(values->cr_siting, 25, 27) |
4335            __gen_uint(values->unsigned_cr_range, 28, 28);
4336   cl[ 3] = 0;
4337   cl[ 4] = __gen_uint(values->plane_0_base, 0, 63);
4338   cl[ 5] = __gen_uint(values->plane_0_base, 0, 63) >> 32;
4339   cl[ 6] = __gen_uint(values->plane_1_base, 0, 63);
4340   cl[ 7] = __gen_uint(values->plane_1_base, 0, 63) >> 32;
4341   cl[ 8] = __gen_uint(values->plane_2_base, 0, 63);
4342   cl[ 9] = __gen_uint(values->plane_2_base, 0, 63) >> 32;
4343   cl[10] = __gen_uint(values->plane_0_stride, 0, 31);
4344   cl[11] = __gen_uint(values->plane_1_2_stride, 0, 31);
4345   cl[12] = 0;
4346   cl[13] = 0;
4347   cl[14] = 0;
4348   cl[15] = 0;
4349}
4350
4351
4352#define MALI_RENDER_TARGET_YUV_OVERLAY_LENGTH 64
4353struct mali_render_target_yuv_overlay_packed { uint32_t opaque[16]; };
4354static inline void
4355MALI_RENDER_TARGET_YUV_OVERLAY_unpack(const uint8_t * restrict cl,
4356                                      struct MALI_RENDER_TARGET_YUV_OVERLAY * restrict values)
4357{
4358   if (((const uint32_t *) cl)[0] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target YUV Overlay unpacked at word 0\n");
4359   if (((const uint32_t *) cl)[1] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target YUV Overlay unpacked at word 1\n");
4360   if (((const uint32_t *) cl)[2] & 0xe008ffff) fprintf(stderr, "XXX: Invalid field of Render Target YUV Overlay unpacked at word 2\n");
4361   if (((const uint32_t *) cl)[3] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target YUV Overlay unpacked at word 3\n");
4362   if (((const uint32_t *) cl)[12] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target YUV Overlay unpacked at word 12\n");
4363   if (((const uint32_t *) cl)[13] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target YUV Overlay unpacked at word 13\n");
4364   if (((const uint32_t *) cl)[14] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target YUV Overlay unpacked at word 14\n");
4365   if (((const uint32_t *) cl)[15] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target YUV Overlay unpacked at word 15\n");
4366   values->swizzle = (enum mali_yuv_swizzle)__gen_unpack_uint(cl, 80, 82);
4367   values->full_range = __gen_unpack_uint(cl, 84, 84);
4368   values->conversion_mode = (enum mali_yuv_conversion_mode)__gen_unpack_uint(cl, 85, 88);
4369   values->cr_siting = (enum mali_yuv_cr_siting)__gen_unpack_uint(cl, 89, 91);
4370   values->unsigned_cr_range = __gen_unpack_uint(cl, 92, 92);
4371   values->plane_0_base = __gen_unpack_uint(cl, 128, 191);
4372   values->plane_1_base = __gen_unpack_uint(cl, 192, 255);
4373   values->plane_2_base = __gen_unpack_uint(cl, 256, 319);
4374   values->plane_0_stride = __gen_unpack_uint(cl, 320, 351);
4375   values->plane_1_2_stride = __gen_unpack_uint(cl, 352, 383);
4376}
4377
4378static inline void
4379MALI_RENDER_TARGET_YUV_OVERLAY_print(FILE *fp, const struct MALI_RENDER_TARGET_YUV_OVERLAY * values, unsigned indent)
4380{
4381   fprintf(fp, "%*sSwizzle: %s\n", indent, "", mali_yuv_swizzle_as_str(values->swizzle));
4382   fprintf(fp, "%*sFull Range: %s\n", indent, "", values->full_range ? "true" : "false");
4383   fprintf(fp, "%*sConversion Mode: %s\n", indent, "", mali_yuv_conversion_mode_as_str(values->conversion_mode));
4384   fprintf(fp, "%*sCr Siting: %s\n", indent, "", mali_yuv_cr_siting_as_str(values->cr_siting));
4385   fprintf(fp, "%*sUnsigned Cr Range: %s\n", indent, "", values->unsigned_cr_range ? "true" : "false");
4386   fprintf(fp, "%*sPlane 0 Base: 0x%" PRIx64 "\n", indent, "", values->plane_0_base);
4387   fprintf(fp, "%*sPlane 1 Base: 0x%" PRIx64 "\n", indent, "", values->plane_1_base);
4388   fprintf(fp, "%*sPlane 2 Base: 0x%" PRIx64 "\n", indent, "", values->plane_2_base);
4389   fprintf(fp, "%*sPlane 0 Stride: %u\n", indent, "", values->plane_0_stride);
4390   fprintf(fp, "%*sPlane 1 2 Stride: %u\n", indent, "", values->plane_1_2_stride);
4391}
4392
4393struct MALI_RENDER_TARGET_AFBC_OVERLAY {
4394   uint64_t                             header;
4395   uint32_t                             row_stride;
4396   uint32_t                             chunk_size;
4397   bool                                 afbc_split_block_enable;
4398   bool                                 afbc_wide_block_enable;
4399   bool                                 reverse_issue_order;
4400   bool                                 yuv_transform_enable;
4401   uint64_t                             body;
4402   uint32_t                             body_size;
4403};
4404
4405#define MALI_RENDER_TARGET_AFBC_OVERLAY_header  \
4406   0
4407
4408static inline void
4409MALI_RENDER_TARGET_AFBC_OVERLAY_pack(uint32_t * restrict cl,
4410                                     const struct MALI_RENDER_TARGET_AFBC_OVERLAY * restrict values)
4411{
4412   cl[ 0] = 0;
4413   cl[ 1] = 0;
4414   cl[ 2] = 0;
4415   cl[ 3] = 0;
4416   cl[ 4] = __gen_uint(values->header, 0, 63);
4417   cl[ 5] = __gen_uint(values->header, 0, 63) >> 32;
4418   cl[ 6] = __gen_uint(values->row_stride, 0, 12);
4419   cl[ 7] = __gen_uint(values->chunk_size, 0, 11) |
4420            __gen_uint(values->afbc_split_block_enable, 18, 18) |
4421            __gen_uint(values->afbc_wide_block_enable, 19, 19) |
4422            __gen_uint(values->reverse_issue_order, 20, 20) |
4423            __gen_uint(values->yuv_transform_enable, 17, 17);
4424   cl[ 8] = __gen_uint(values->body, 0, 63);
4425   cl[ 9] = __gen_uint(values->body, 0, 63) >> 32;
4426   cl[10] = __gen_uint(values->body_size, 0, 31);
4427   cl[11] = 0;
4428   cl[12] = 0;
4429   cl[13] = 0;
4430   cl[14] = 0;
4431   cl[15] = 0;
4432}
4433
4434
4435#define MALI_RENDER_TARGET_AFBC_OVERLAY_LENGTH 64
4436struct mali_render_target_afbc_overlay_packed { uint32_t opaque[16]; };
4437static inline void
4438MALI_RENDER_TARGET_AFBC_OVERLAY_unpack(const uint8_t * restrict cl,
4439                                       struct MALI_RENDER_TARGET_AFBC_OVERLAY * restrict values)
4440{
4441   if (((const uint32_t *) cl)[0] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target AFBC Overlay unpacked at word 0\n");
4442   if (((const uint32_t *) cl)[1] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target AFBC Overlay unpacked at word 1\n");
4443   if (((const uint32_t *) cl)[2] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target AFBC Overlay unpacked at word 2\n");
4444   if (((const uint32_t *) cl)[3] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target AFBC Overlay unpacked at word 3\n");
4445   if (((const uint32_t *) cl)[6] & 0xffffe000) fprintf(stderr, "XXX: Invalid field of Render Target AFBC Overlay unpacked at word 6\n");
4446   if (((const uint32_t *) cl)[7] & 0xffe1f000) fprintf(stderr, "XXX: Invalid field of Render Target AFBC Overlay unpacked at word 7\n");
4447   if (((const uint32_t *) cl)[11] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target AFBC Overlay unpacked at word 11\n");
4448   if (((const uint32_t *) cl)[12] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target AFBC Overlay unpacked at word 12\n");
4449   if (((const uint32_t *) cl)[13] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target AFBC Overlay unpacked at word 13\n");
4450   if (((const uint32_t *) cl)[14] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target AFBC Overlay unpacked at word 14\n");
4451   if (((const uint32_t *) cl)[15] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target AFBC Overlay unpacked at word 15\n");
4452   values->header = __gen_unpack_uint(cl, 128, 191);
4453   values->row_stride = __gen_unpack_uint(cl, 192, 204);
4454   values->chunk_size = __gen_unpack_uint(cl, 224, 235);
4455   values->afbc_split_block_enable = __gen_unpack_uint(cl, 242, 242);
4456   values->afbc_wide_block_enable = __gen_unpack_uint(cl, 243, 243);
4457   values->reverse_issue_order = __gen_unpack_uint(cl, 244, 244);
4458   values->yuv_transform_enable = __gen_unpack_uint(cl, 241, 241);
4459   values->body = __gen_unpack_uint(cl, 256, 319);
4460   values->body_size = __gen_unpack_uint(cl, 320, 351);
4461}
4462
4463static inline void
4464MALI_RENDER_TARGET_AFBC_OVERLAY_print(FILE *fp, const struct MALI_RENDER_TARGET_AFBC_OVERLAY * values, unsigned indent)
4465{
4466   fprintf(fp, "%*sHeader: 0x%" PRIx64 "\n", indent, "", values->header);
4467   fprintf(fp, "%*sRow Stride: %u\n", indent, "", values->row_stride);
4468   fprintf(fp, "%*sChunk Size: %u\n", indent, "", values->chunk_size);
4469   fprintf(fp, "%*sAFBC Split Block Enable: %s\n", indent, "", values->afbc_split_block_enable ? "true" : "false");
4470   fprintf(fp, "%*sAFBC Wide Block Enable: %s\n", indent, "", values->afbc_wide_block_enable ? "true" : "false");
4471   fprintf(fp, "%*sReverse Issue Order: %s\n", indent, "", values->reverse_issue_order ? "true" : "false");
4472   fprintf(fp, "%*sYUV Transform Enable: %s\n", indent, "", values->yuv_transform_enable ? "true" : "false");
4473   fprintf(fp, "%*sBody: 0x%" PRIx64 "\n", indent, "", values->body);
4474   fprintf(fp, "%*sBody Size: %u\n", indent, "", values->body_size);
4475}
4476
4477struct MALI_RT_CLEAR {
4478   uint32_t                             color_0;
4479   uint32_t                             color_1;
4480   uint32_t                             color_2;
4481   uint32_t                             color_3;
4482};
4483
4484#define MALI_RT_CLEAR_header                    \
4485   0
4486
4487static inline void
4488MALI_RT_CLEAR_pack(uint32_t * restrict cl,
4489                   const struct MALI_RT_CLEAR * restrict values)
4490{
4491   cl[ 0] = __gen_uint(values->color_0, 0, 31);
4492   cl[ 1] = __gen_uint(values->color_1, 0, 31);
4493   cl[ 2] = __gen_uint(values->color_2, 0, 31);
4494   cl[ 3] = __gen_uint(values->color_3, 0, 31);
4495}
4496
4497
4498#define MALI_RT_CLEAR_LENGTH 16
4499struct mali_rt_clear_packed { uint32_t opaque[4]; };
4500static inline void
4501MALI_RT_CLEAR_unpack(const uint8_t * restrict cl,
4502                     struct MALI_RT_CLEAR * restrict values)
4503{
4504   values->color_0 = __gen_unpack_uint(cl, 0, 31);
4505   values->color_1 = __gen_unpack_uint(cl, 32, 63);
4506   values->color_2 = __gen_unpack_uint(cl, 64, 95);
4507   values->color_3 = __gen_unpack_uint(cl, 96, 127);
4508}
4509
4510static inline void
4511MALI_RT_CLEAR_print(FILE *fp, const struct MALI_RT_CLEAR * values, unsigned indent)
4512{
4513   fprintf(fp, "%*sColor 0: %u\n", indent, "", values->color_0);
4514   fprintf(fp, "%*sColor 1: %u\n", indent, "", values->color_1);
4515   fprintf(fp, "%*sColor 2: %u\n", indent, "", values->color_2);
4516   fprintf(fp, "%*sColor 3: %u\n", indent, "", values->color_3);
4517}
4518
4519struct MALI_RENDER_TARGET {
4520   struct MALI_RENDER_TARGET_YUV_OVERLAY yuv;
4521   struct MALI_RENDER_TARGET_AFBC_OVERLAY afbc;
4522   uint32_t                             internal_buffer_offset;
4523   bool                                 yuv_enable;
4524   bool                                 dithered_clear;
4525   enum mali_color_buffer_internal_format internal_format;
4526   bool                                 write_enable;
4527   enum mali_color_format               writeback_format;
4528   enum mali_block_format               writeback_block_format;
4529   enum mali_msaa                       writeback_msaa;
4530   bool                                 srgb;
4531   bool                                 dithering_enable;
4532   uint32_t                             swizzle;
4533   bool                                 clean_pixel_write_enable;
4534   struct MALI_RT_BUFFER                rgb;
4535   struct MALI_RT_CLEAR                 clear;
4536};
4537
4538#define MALI_RENDER_TARGET_header               \
4539   .yuv = { MALI_RENDER_TARGET_YUV_OVERLAY_header },  \
4540   .afbc = { MALI_RENDER_TARGET_AFBC_OVERLAY_header },  \
4541   .rgb = { MALI_RT_BUFFER_header },  \
4542   .clear = { MALI_RT_CLEAR_header }
4543
4544static inline void
4545MALI_RENDER_TARGET_pack(uint32_t * restrict cl,
4546                        const struct MALI_RENDER_TARGET * restrict values)
4547{
4548   assert((values->internal_buffer_offset & 0xf) == 0);
4549   cl[ 0] = __gen_uint(values->internal_buffer_offset >> 4, 4, 15) |
4550            __gen_uint(values->yuv_enable, 24, 24) |
4551            __gen_uint(values->dithered_clear, 25, 25) |
4552            __gen_uint(values->internal_format, 26, 31);
4553   cl[ 1] = __gen_uint(values->write_enable, 0, 0) |
4554            __gen_uint(values->writeback_format, 3, 7) |
4555            __gen_uint(values->writeback_block_format, 8, 11) |
4556            __gen_uint(values->writeback_msaa, 12, 13) |
4557            __gen_uint(values->srgb, 14, 14) |
4558            __gen_uint(values->dithering_enable, 15, 15) |
4559            __gen_uint(values->swizzle, 16, 27) |
4560            __gen_uint(values->clean_pixel_write_enable, 31, 31);
4561   cl[ 2] = __gen_uint(values->yuv.swizzle, 16, 18) |
4562            __gen_uint(values->yuv.full_range, 20, 20) |
4563            __gen_uint(values->yuv.conversion_mode, 21, 24) |
4564            __gen_uint(values->yuv.cr_siting, 25, 27) |
4565            __gen_uint(values->yuv.unsigned_cr_range, 28, 28);
4566   cl[ 3] = 0;
4567   cl[ 4] = __gen_uint(values->yuv.plane_0_base, 0, 63) |
4568            __gen_uint(values->afbc.header, 0, 63);
4569   cl[ 5] = __gen_uint(values->yuv.plane_0_base, 0, 63) >> 32 |
4570            __gen_uint(values->afbc.header, 0, 63) >> 32;
4571   cl[ 6] = __gen_uint(values->yuv.plane_1_base, 0, 63) |
4572            __gen_uint(values->afbc.row_stride, 0, 12);
4573   cl[ 7] = __gen_uint(values->yuv.plane_1_base, 0, 63) >> 32 |
4574            __gen_uint(values->afbc.chunk_size, 0, 11) |
4575            __gen_uint(values->afbc.afbc_split_block_enable, 18, 18) |
4576            __gen_uint(values->afbc.afbc_wide_block_enable, 19, 19) |
4577            __gen_uint(values->afbc.reverse_issue_order, 20, 20) |
4578            __gen_uint(values->afbc.yuv_transform_enable, 17, 17);
4579   cl[ 8] = __gen_uint(values->yuv.plane_2_base, 0, 63) |
4580            __gen_uint(values->afbc.body, 0, 63) |
4581            __gen_uint(values->rgb.base, 0, 63);
4582   cl[ 9] = __gen_uint(values->yuv.plane_2_base, 0, 63) >> 32 |
4583            __gen_uint(values->afbc.body, 0, 63) >> 32 |
4584            __gen_uint(values->rgb.base, 0, 63) >> 32;
4585   cl[10] = __gen_uint(values->yuv.plane_0_stride, 0, 31) |
4586            __gen_uint(values->afbc.body_size, 0, 31) |
4587            __gen_uint(values->rgb.row_stride, 0, 31);
4588   cl[11] = __gen_uint(values->yuv.plane_1_2_stride, 0, 31) |
4589            __gen_uint(values->rgb.surface_stride, 0, 31);
4590   cl[12] = __gen_uint(values->clear.color_0, 0, 31);
4591   cl[13] = __gen_uint(values->clear.color_1, 0, 31);
4592   cl[14] = __gen_uint(values->clear.color_2, 0, 31);
4593   cl[15] = __gen_uint(values->clear.color_3, 0, 31);
4594}
4595
4596
4597#define MALI_RENDER_TARGET_LENGTH 64
4598#define MALI_RENDER_TARGET_ALIGN 64
4599struct mali_render_target_packed { uint32_t opaque[16]; };
4600static inline void
4601MALI_RENDER_TARGET_unpack(const uint8_t * restrict cl,
4602                          struct MALI_RENDER_TARGET * restrict values)
4603{
4604   if (((const uint32_t *) cl)[0] & 0xff000f) fprintf(stderr, "XXX: Invalid field of Render Target unpacked at word 0\n");
4605   if (((const uint32_t *) cl)[1] & 0x70000006) fprintf(stderr, "XXX: Invalid field of Render Target unpacked at word 1\n");
4606   if (((const uint32_t *) cl)[2] & 0xe008ffff) fprintf(stderr, "XXX: Invalid field of Render Target unpacked at word 2\n");
4607   if (((const uint32_t *) cl)[3] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Render Target unpacked at word 3\n");
4608   values->yuv.swizzle = (enum mali_yuv_swizzle)__gen_unpack_uint(cl, 80, 82);
4609   values->yuv.full_range = __gen_unpack_uint(cl, 84, 84);
4610   values->yuv.conversion_mode = (enum mali_yuv_conversion_mode)__gen_unpack_uint(cl, 85, 88);
4611   values->yuv.cr_siting = (enum mali_yuv_cr_siting)__gen_unpack_uint(cl, 89, 91);
4612   values->yuv.unsigned_cr_range = __gen_unpack_uint(cl, 92, 92);
4613   values->yuv.plane_0_base = __gen_unpack_uint(cl, 128, 191);
4614   values->yuv.plane_1_base = __gen_unpack_uint(cl, 192, 255);
4615   values->yuv.plane_2_base = __gen_unpack_uint(cl, 256, 319);
4616   values->yuv.plane_0_stride = __gen_unpack_uint(cl, 320, 351);
4617   values->yuv.plane_1_2_stride = __gen_unpack_uint(cl, 352, 383);
4618   values->afbc.header = __gen_unpack_uint(cl, 128, 191);
4619   values->afbc.row_stride = __gen_unpack_uint(cl, 192, 204);
4620   values->afbc.chunk_size = __gen_unpack_uint(cl, 224, 235);
4621   values->afbc.afbc_split_block_enable = __gen_unpack_uint(cl, 242, 242);
4622   values->afbc.afbc_wide_block_enable = __gen_unpack_uint(cl, 243, 243);
4623   values->afbc.reverse_issue_order = __gen_unpack_uint(cl, 244, 244);
4624   values->afbc.yuv_transform_enable = __gen_unpack_uint(cl, 241, 241);
4625   values->afbc.body = __gen_unpack_uint(cl, 256, 319);
4626   values->afbc.body_size = __gen_unpack_uint(cl, 320, 351);
4627   values->internal_buffer_offset = __gen_unpack_uint(cl, 4, 15) << 4;
4628   values->yuv_enable = __gen_unpack_uint(cl, 24, 24);
4629   values->dithered_clear = __gen_unpack_uint(cl, 25, 25);
4630   values->internal_format = (enum mali_color_buffer_internal_format)__gen_unpack_uint(cl, 26, 31);
4631   values->write_enable = __gen_unpack_uint(cl, 32, 32);
4632   values->writeback_format = (enum mali_color_format)__gen_unpack_uint(cl, 35, 39);
4633   values->writeback_block_format = (enum mali_block_format)__gen_unpack_uint(cl, 40, 43);
4634   values->writeback_msaa = (enum mali_msaa)__gen_unpack_uint(cl, 44, 45);
4635   values->srgb = __gen_unpack_uint(cl, 46, 46);
4636   values->dithering_enable = __gen_unpack_uint(cl, 47, 47);
4637   values->swizzle = __gen_unpack_uint(cl, 48, 59);
4638   values->clean_pixel_write_enable = __gen_unpack_uint(cl, 63, 63);
4639   values->rgb.base = __gen_unpack_uint(cl, 256, 319);
4640   values->rgb.row_stride = __gen_unpack_uint(cl, 320, 351);
4641   values->rgb.surface_stride = __gen_unpack_uint(cl, 352, 383);
4642   values->clear.color_0 = __gen_unpack_uint(cl, 384, 415);
4643   values->clear.color_1 = __gen_unpack_uint(cl, 416, 447);
4644   values->clear.color_2 = __gen_unpack_uint(cl, 448, 479);
4645   values->clear.color_3 = __gen_unpack_uint(cl, 480, 511);
4646}
4647
4648static inline void
4649MALI_RENDER_TARGET_print(FILE *fp, const struct MALI_RENDER_TARGET * values, unsigned indent)
4650{
4651   fprintf(fp, "%*sYUV:\n", indent, "");
4652   MALI_RENDER_TARGET_YUV_OVERLAY_print(fp, &values->yuv, indent + 2);
4653   fprintf(fp, "%*sAFBC:\n", indent, "");
4654   MALI_RENDER_TARGET_AFBC_OVERLAY_print(fp, &values->afbc, indent + 2);
4655   fprintf(fp, "%*sInternal Buffer Offset: %u\n", indent, "", values->internal_buffer_offset);
4656   fprintf(fp, "%*sYUV Enable: %s\n", indent, "", values->yuv_enable ? "true" : "false");
4657   fprintf(fp, "%*sDithered Clear: %s\n", indent, "", values->dithered_clear ? "true" : "false");
4658   fprintf(fp, "%*sInternal Format: %s\n", indent, "", mali_color_buffer_internal_format_as_str(values->internal_format));
4659   fprintf(fp, "%*sWrite Enable: %s\n", indent, "", values->write_enable ? "true" : "false");
4660   fprintf(fp, "%*sWriteback Format: %s\n", indent, "", mali_color_format_as_str(values->writeback_format));
4661   fprintf(fp, "%*sWriteback Block Format: %s\n", indent, "", mali_block_format_as_str(values->writeback_block_format));
4662   fprintf(fp, "%*sWriteback MSAA: %s\n", indent, "", mali_msaa_as_str(values->writeback_msaa));
4663   fprintf(fp, "%*ssRGB: %s\n", indent, "", values->srgb ? "true" : "false");
4664   fprintf(fp, "%*sDithering Enable: %s\n", indent, "", values->dithering_enable ? "true" : "false");
4665   fprintf(fp, "%*sSwizzle: %u\n", indent, "", values->swizzle);
4666   fprintf(fp, "%*sClean Pixel Write Enable: %s\n", indent, "", values->clean_pixel_write_enable ? "true" : "false");
4667   fprintf(fp, "%*sRGB:\n", indent, "");
4668   MALI_RT_BUFFER_print(fp, &values->rgb, indent + 2);
4669   fprintf(fp, "%*sClear:\n", indent, "");
4670   MALI_RT_CLEAR_print(fp, &values->clear, indent + 2);
4671}
4672
4673struct MALI_TILER_HEAP {
4674   uint32_t                             size;
4675   uint64_t                             base;
4676   uint64_t                             bottom;
4677   uint64_t                             top;
4678};
4679
4680#define MALI_TILER_HEAP_header                  \
4681   0
4682
4683static inline void
4684MALI_TILER_HEAP_pack(uint32_t * restrict cl,
4685                     const struct MALI_TILER_HEAP * restrict values)
4686{
4687   cl[ 0] = 0;
4688   cl[ 1] = __gen_uint(ALIGN_POT(values->size, 4096), 0, 31);
4689   cl[ 2] = __gen_uint(values->base, 0, 63);
4690   cl[ 3] = __gen_uint(values->base, 0, 63) >> 32;
4691   cl[ 4] = __gen_uint(values->bottom, 0, 63);
4692   cl[ 5] = __gen_uint(values->bottom, 0, 63) >> 32;
4693   cl[ 6] = __gen_uint(values->top, 0, 63);
4694   cl[ 7] = __gen_uint(values->top, 0, 63) >> 32;
4695}
4696
4697
4698#define MALI_TILER_HEAP_LENGTH 32
4699#define MALI_TILER_HEAP_ALIGN 64
4700struct mali_tiler_heap_packed { uint32_t opaque[8]; };
4701static inline void
4702MALI_TILER_HEAP_unpack(const uint8_t * restrict cl,
4703                       struct MALI_TILER_HEAP * restrict values)
4704{
4705   if (((const uint32_t *) cl)[0] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Heap unpacked at word 0\n");
4706   values->size = __gen_unpack_uint(cl, 32, 63);
4707   assert(!(values->size & 0xfff));
4708   values->base = __gen_unpack_uint(cl, 64, 127);
4709   values->bottom = __gen_unpack_uint(cl, 128, 191);
4710   values->top = __gen_unpack_uint(cl, 192, 255);
4711}
4712
4713static inline void
4714MALI_TILER_HEAP_print(FILE *fp, const struct MALI_TILER_HEAP * values, unsigned indent)
4715{
4716   fprintf(fp, "%*sSize: %u\n", indent, "", values->size);
4717   fprintf(fp, "%*sBase: 0x%" PRIx64 "\n", indent, "", values->base);
4718   fprintf(fp, "%*sBottom: 0x%" PRIx64 "\n", indent, "", values->bottom);
4719   fprintf(fp, "%*sTop: 0x%" PRIx64 "\n", indent, "", values->top);
4720}
4721
4722struct MALI_TILER_WEIGHTS {
4723   uint32_t                             weight0;
4724   uint32_t                             weight1;
4725   uint32_t                             weight2;
4726   uint32_t                             weight3;
4727   uint32_t                             weight4;
4728   uint32_t                             weight5;
4729   uint32_t                             weight6;
4730   uint32_t                             weight7;
4731};
4732
4733#define MALI_TILER_WEIGHTS_header               \
4734   0
4735
4736static inline void
4737MALI_TILER_WEIGHTS_pack(uint32_t * restrict cl,
4738                        const struct MALI_TILER_WEIGHTS * restrict values)
4739{
4740   cl[ 0] = __gen_uint(values->weight0, 16, 31);
4741   cl[ 1] = __gen_uint(values->weight1, 16, 31);
4742   cl[ 2] = __gen_uint(values->weight2, 16, 31);
4743   cl[ 3] = __gen_uint(values->weight3, 16, 31);
4744   cl[ 4] = __gen_uint(values->weight4, 16, 31);
4745   cl[ 5] = __gen_uint(values->weight5, 16, 31);
4746   cl[ 6] = __gen_uint(values->weight6, 16, 31);
4747   cl[ 7] = __gen_uint(values->weight7, 16, 31);
4748}
4749
4750
4751#define MALI_TILER_WEIGHTS_LENGTH 32
4752struct mali_tiler_weights_packed { uint32_t opaque[8]; };
4753static inline void
4754MALI_TILER_WEIGHTS_unpack(const uint8_t * restrict cl,
4755                          struct MALI_TILER_WEIGHTS * restrict values)
4756{
4757   if (((const uint32_t *) cl)[0] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Weights unpacked at word 0\n");
4758   if (((const uint32_t *) cl)[1] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Weights unpacked at word 1\n");
4759   if (((const uint32_t *) cl)[2] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Weights unpacked at word 2\n");
4760   if (((const uint32_t *) cl)[3] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Weights unpacked at word 3\n");
4761   if (((const uint32_t *) cl)[4] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Weights unpacked at word 4\n");
4762   if (((const uint32_t *) cl)[5] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Weights unpacked at word 5\n");
4763   if (((const uint32_t *) cl)[6] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Weights unpacked at word 6\n");
4764   if (((const uint32_t *) cl)[7] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Weights unpacked at word 7\n");
4765   values->weight0 = __gen_unpack_uint(cl, 16, 31);
4766   values->weight1 = __gen_unpack_uint(cl, 48, 63);
4767   values->weight2 = __gen_unpack_uint(cl, 80, 95);
4768   values->weight3 = __gen_unpack_uint(cl, 112, 127);
4769   values->weight4 = __gen_unpack_uint(cl, 144, 159);
4770   values->weight5 = __gen_unpack_uint(cl, 176, 191);
4771   values->weight6 = __gen_unpack_uint(cl, 208, 223);
4772   values->weight7 = __gen_unpack_uint(cl, 240, 255);
4773}
4774
4775static inline void
4776MALI_TILER_WEIGHTS_print(FILE *fp, const struct MALI_TILER_WEIGHTS * values, unsigned indent)
4777{
4778   fprintf(fp, "%*sWeight0: %u\n", indent, "", values->weight0);
4779   fprintf(fp, "%*sWeight1: %u\n", indent, "", values->weight1);
4780   fprintf(fp, "%*sWeight2: %u\n", indent, "", values->weight2);
4781   fprintf(fp, "%*sWeight3: %u\n", indent, "", values->weight3);
4782   fprintf(fp, "%*sWeight4: %u\n", indent, "", values->weight4);
4783   fprintf(fp, "%*sWeight5: %u\n", indent, "", values->weight5);
4784   fprintf(fp, "%*sWeight6: %u\n", indent, "", values->weight6);
4785   fprintf(fp, "%*sWeight7: %u\n", indent, "", values->weight7);
4786}
4787
4788struct MALI_TILER_STATE {
4789   uint32_t                             word0;
4790   uint32_t                             word1;
4791   uint32_t                             word2;
4792   uint32_t                             word3;
4793   uint32_t                             word4;
4794   uint32_t                             word5;
4795   uint32_t                             word6;
4796   uint32_t                             word7;
4797   uint32_t                             word8;
4798   uint32_t                             word9;
4799   uint32_t                             word10;
4800   uint32_t                             word11;
4801   uint32_t                             word12;
4802   uint32_t                             word13;
4803   uint32_t                             word14;
4804   uint32_t                             word15;
4805};
4806
4807#define MALI_TILER_STATE_header                 \
4808   0
4809
4810static inline void
4811MALI_TILER_STATE_pack(uint32_t * restrict cl,
4812                      const struct MALI_TILER_STATE * restrict values)
4813{
4814   cl[ 0] = __gen_uint(values->word0, 0, 31);
4815   cl[ 1] = __gen_uint(values->word1, 0, 31);
4816   cl[ 2] = __gen_uint(values->word2, 0, 31);
4817   cl[ 3] = __gen_uint(values->word3, 0, 31);
4818   cl[ 4] = __gen_uint(values->word4, 0, 31);
4819   cl[ 5] = __gen_uint(values->word5, 0, 31);
4820   cl[ 6] = __gen_uint(values->word6, 0, 31);
4821   cl[ 7] = __gen_uint(values->word7, 0, 31);
4822   cl[ 8] = __gen_uint(values->word8, 0, 31);
4823   cl[ 9] = __gen_uint(values->word9, 0, 31);
4824   cl[10] = __gen_uint(values->word10, 0, 31);
4825   cl[11] = __gen_uint(values->word11, 0, 31);
4826   cl[12] = __gen_uint(values->word12, 0, 31);
4827   cl[13] = __gen_uint(values->word13, 0, 31);
4828   cl[14] = __gen_uint(values->word14, 0, 31);
4829   cl[15] = __gen_uint(values->word15, 0, 31);
4830}
4831
4832
4833#define MALI_TILER_STATE_LENGTH 64
4834struct mali_tiler_state_packed { uint32_t opaque[16]; };
4835static inline void
4836MALI_TILER_STATE_unpack(const uint8_t * restrict cl,
4837                        struct MALI_TILER_STATE * restrict values)
4838{
4839   values->word0 = __gen_unpack_uint(cl, 0, 31);
4840   values->word1 = __gen_unpack_uint(cl, 32, 63);
4841   values->word2 = __gen_unpack_uint(cl, 64, 95);
4842   values->word3 = __gen_unpack_uint(cl, 96, 127);
4843   values->word4 = __gen_unpack_uint(cl, 128, 159);
4844   values->word5 = __gen_unpack_uint(cl, 160, 191);
4845   values->word6 = __gen_unpack_uint(cl, 192, 223);
4846   values->word7 = __gen_unpack_uint(cl, 224, 255);
4847   values->word8 = __gen_unpack_uint(cl, 256, 287);
4848   values->word9 = __gen_unpack_uint(cl, 288, 319);
4849   values->word10 = __gen_unpack_uint(cl, 320, 351);
4850   values->word11 = __gen_unpack_uint(cl, 352, 383);
4851   values->word12 = __gen_unpack_uint(cl, 384, 415);
4852   values->word13 = __gen_unpack_uint(cl, 416, 447);
4853   values->word14 = __gen_unpack_uint(cl, 448, 479);
4854   values->word15 = __gen_unpack_uint(cl, 480, 511);
4855}
4856
4857static inline void
4858MALI_TILER_STATE_print(FILE *fp, const struct MALI_TILER_STATE * values, unsigned indent)
4859{
4860   fprintf(fp, "%*sWord0: %u\n", indent, "", values->word0);
4861   fprintf(fp, "%*sWord1: %u\n", indent, "", values->word1);
4862   fprintf(fp, "%*sWord2: %u\n", indent, "", values->word2);
4863   fprintf(fp, "%*sWord3: %u\n", indent, "", values->word3);
4864   fprintf(fp, "%*sWord4: %u\n", indent, "", values->word4);
4865   fprintf(fp, "%*sWord5: %u\n", indent, "", values->word5);
4866   fprintf(fp, "%*sWord6: %u\n", indent, "", values->word6);
4867   fprintf(fp, "%*sWord7: %u\n", indent, "", values->word7);
4868   fprintf(fp, "%*sWord8: %u\n", indent, "", values->word8);
4869   fprintf(fp, "%*sWord9: %u\n", indent, "", values->word9);
4870   fprintf(fp, "%*sWord10: %u\n", indent, "", values->word10);
4871   fprintf(fp, "%*sWord11: %u\n", indent, "", values->word11);
4872   fprintf(fp, "%*sWord12: %u\n", indent, "", values->word12);
4873   fprintf(fp, "%*sWord13: %u\n", indent, "", values->word13);
4874   fprintf(fp, "%*sWord14: %u\n", indent, "", values->word14);
4875   fprintf(fp, "%*sWord15: %u\n", indent, "", values->word15);
4876}
4877
4878struct MALI_TILER_CONTEXT {
4879   uint64_t                             polygon_list;
4880   uint32_t                             hierarchy_mask;
4881   enum mali_sample_pattern             sample_pattern;
4882   bool                                 update_cost_table;
4883   uint32_t                             fb_width;
4884   uint32_t                             fb_height;
4885   uint64_t                             heap;
4886   struct MALI_TILER_WEIGHTS            weights;
4887   struct MALI_TILER_STATE              state;
4888};
4889
4890#define MALI_TILER_CONTEXT_header               \
4891   .weights = { MALI_TILER_WEIGHTS_header },  \
4892   .state = { MALI_TILER_STATE_header }
4893
4894static inline void
4895MALI_TILER_CONTEXT_pack(uint32_t * restrict cl,
4896                        const struct MALI_TILER_CONTEXT * restrict values)
4897{
4898   assert(values->fb_width >= 1);
4899   assert(values->fb_height >= 1);
4900   cl[ 0] = __gen_uint(values->polygon_list, 0, 63);
4901   cl[ 1] = __gen_uint(values->polygon_list, 0, 63) >> 32;
4902   cl[ 2] = __gen_uint(values->hierarchy_mask, 0, 12) |
4903            __gen_uint(values->sample_pattern, 13, 15) |
4904            __gen_uint(values->update_cost_table, 16, 16);
4905   cl[ 3] = __gen_uint(values->fb_width - 1, 0, 15) |
4906            __gen_uint(values->fb_height - 1, 16, 31);
4907   cl[ 4] = 0;
4908   cl[ 5] = 0;
4909   cl[ 6] = __gen_uint(values->heap, 0, 63);
4910   cl[ 7] = __gen_uint(values->heap, 0, 63) >> 32;
4911   cl[ 8] = __gen_uint(values->weights.weight0, 16, 31);
4912   cl[ 9] = __gen_uint(values->weights.weight1, 16, 31);
4913   cl[10] = __gen_uint(values->weights.weight2, 16, 31);
4914   cl[11] = __gen_uint(values->weights.weight3, 16, 31);
4915   cl[12] = __gen_uint(values->weights.weight4, 16, 31);
4916   cl[13] = __gen_uint(values->weights.weight5, 16, 31);
4917   cl[14] = __gen_uint(values->weights.weight6, 16, 31);
4918   cl[15] = __gen_uint(values->weights.weight7, 16, 31);
4919   cl[16] = 0;
4920   cl[17] = 0;
4921   cl[18] = 0;
4922   cl[19] = 0;
4923   cl[20] = 0;
4924   cl[21] = 0;
4925   cl[22] = 0;
4926   cl[23] = 0;
4927   cl[24] = 0;
4928   cl[25] = 0;
4929   cl[26] = 0;
4930   cl[27] = 0;
4931   cl[28] = 0;
4932   cl[29] = 0;
4933   cl[30] = 0;
4934   cl[31] = 0;
4935   cl[32] = __gen_uint(values->state.word0, 0, 31);
4936   cl[33] = __gen_uint(values->state.word1, 0, 31);
4937   cl[34] = __gen_uint(values->state.word2, 0, 31);
4938   cl[35] = __gen_uint(values->state.word3, 0, 31);
4939   cl[36] = __gen_uint(values->state.word4, 0, 31);
4940   cl[37] = __gen_uint(values->state.word5, 0, 31);
4941   cl[38] = __gen_uint(values->state.word6, 0, 31);
4942   cl[39] = __gen_uint(values->state.word7, 0, 31);
4943   cl[40] = __gen_uint(values->state.word8, 0, 31);
4944   cl[41] = __gen_uint(values->state.word9, 0, 31);
4945   cl[42] = __gen_uint(values->state.word10, 0, 31);
4946   cl[43] = __gen_uint(values->state.word11, 0, 31);
4947   cl[44] = __gen_uint(values->state.word12, 0, 31);
4948   cl[45] = __gen_uint(values->state.word13, 0, 31);
4949   cl[46] = __gen_uint(values->state.word14, 0, 31);
4950   cl[47] = __gen_uint(values->state.word15, 0, 31);
4951}
4952
4953
4954#define MALI_TILER_CONTEXT_LENGTH 192
4955#define MALI_TILER_CONTEXT_ALIGN 64
4956struct mali_tiler_context_packed { uint32_t opaque[48]; };
4957static inline void
4958MALI_TILER_CONTEXT_unpack(const uint8_t * restrict cl,
4959                          struct MALI_TILER_CONTEXT * restrict values)
4960{
4961   if (((const uint32_t *) cl)[2] & 0xfffe0000) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 2\n");
4962   if (((const uint32_t *) cl)[4] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 4\n");
4963   if (((const uint32_t *) cl)[5] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 5\n");
4964   if (((const uint32_t *) cl)[8] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 8\n");
4965   if (((const uint32_t *) cl)[9] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 9\n");
4966   if (((const uint32_t *) cl)[10] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 10\n");
4967   if (((const uint32_t *) cl)[11] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 11\n");
4968   if (((const uint32_t *) cl)[12] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 12\n");
4969   if (((const uint32_t *) cl)[13] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 13\n");
4970   if (((const uint32_t *) cl)[14] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 14\n");
4971   if (((const uint32_t *) cl)[15] & 0xffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 15\n");
4972   if (((const uint32_t *) cl)[16] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 16\n");
4973   if (((const uint32_t *) cl)[17] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 17\n");
4974   if (((const uint32_t *) cl)[18] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 18\n");
4975   if (((const uint32_t *) cl)[19] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 19\n");
4976   if (((const uint32_t *) cl)[20] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 20\n");
4977   if (((const uint32_t *) cl)[21] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 21\n");
4978   if (((const uint32_t *) cl)[22] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 22\n");
4979   if (((const uint32_t *) cl)[23] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 23\n");
4980   if (((const uint32_t *) cl)[24] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 24\n");
4981   if (((const uint32_t *) cl)[25] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 25\n");
4982   if (((const uint32_t *) cl)[26] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 26\n");
4983   if (((const uint32_t *) cl)[27] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 27\n");
4984   if (((const uint32_t *) cl)[28] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 28\n");
4985   if (((const uint32_t *) cl)[29] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 29\n");
4986   if (((const uint32_t *) cl)[30] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 30\n");
4987   if (((const uint32_t *) cl)[31] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Context unpacked at word 31\n");
4988   values->polygon_list = __gen_unpack_uint(cl, 0, 63);
4989   values->hierarchy_mask = __gen_unpack_uint(cl, 64, 76);
4990   values->sample_pattern = (enum mali_sample_pattern)__gen_unpack_uint(cl, 77, 79);
4991   values->update_cost_table = __gen_unpack_uint(cl, 80, 80);
4992   values->fb_width = __gen_unpack_uint(cl, 96, 111) + 1;
4993   values->fb_height = __gen_unpack_uint(cl, 112, 127) + 1;
4994   values->heap = __gen_unpack_uint(cl, 192, 255);
4995   values->weights.weight0 = __gen_unpack_uint(cl, 272, 287);
4996   values->weights.weight1 = __gen_unpack_uint(cl, 304, 319);
4997   values->weights.weight2 = __gen_unpack_uint(cl, 336, 351);
4998   values->weights.weight3 = __gen_unpack_uint(cl, 368, 383);
4999   values->weights.weight4 = __gen_unpack_uint(cl, 400, 415);
5000   values->weights.weight5 = __gen_unpack_uint(cl, 432, 447);
5001   values->weights.weight6 = __gen_unpack_uint(cl, 464, 479);
5002   values->weights.weight7 = __gen_unpack_uint(cl, 496, 511);
5003   values->state.word0 = __gen_unpack_uint(cl, 1024, 1055);
5004   values->state.word1 = __gen_unpack_uint(cl, 1056, 1087);
5005   values->state.word2 = __gen_unpack_uint(cl, 1088, 1119);
5006   values->state.word3 = __gen_unpack_uint(cl, 1120, 1151);
5007   values->state.word4 = __gen_unpack_uint(cl, 1152, 1183);
5008   values->state.word5 = __gen_unpack_uint(cl, 1184, 1215);
5009   values->state.word6 = __gen_unpack_uint(cl, 1216, 1247);
5010   values->state.word7 = __gen_unpack_uint(cl, 1248, 1279);
5011   values->state.word8 = __gen_unpack_uint(cl, 1280, 1311);
5012   values->state.word9 = __gen_unpack_uint(cl, 1312, 1343);
5013   values->state.word10 = __gen_unpack_uint(cl, 1344, 1375);
5014   values->state.word11 = __gen_unpack_uint(cl, 1376, 1407);
5015   values->state.word12 = __gen_unpack_uint(cl, 1408, 1439);
5016   values->state.word13 = __gen_unpack_uint(cl, 1440, 1471);
5017   values->state.word14 = __gen_unpack_uint(cl, 1472, 1503);
5018   values->state.word15 = __gen_unpack_uint(cl, 1504, 1535);
5019}
5020
5021static inline void
5022MALI_TILER_CONTEXT_print(FILE *fp, const struct MALI_TILER_CONTEXT * values, unsigned indent)
5023{
5024   fprintf(fp, "%*sPolygon List: 0x%" PRIx64 "\n", indent, "", values->polygon_list);
5025   fprintf(fp, "%*sHierarchy Mask: %u\n", indent, "", values->hierarchy_mask);
5026   fprintf(fp, "%*sSample Pattern: %s\n", indent, "", mali_sample_pattern_as_str(values->sample_pattern));
5027   fprintf(fp, "%*sUpdate Cost Table: %s\n", indent, "", values->update_cost_table ? "true" : "false");
5028   fprintf(fp, "%*sFB Width: %u\n", indent, "", values->fb_width);
5029   fprintf(fp, "%*sFB Height: %u\n", indent, "", values->fb_height);
5030   fprintf(fp, "%*sHeap: 0x%" PRIx64 "\n", indent, "", values->heap);
5031   fprintf(fp, "%*sWeights:\n", indent, "");
5032   MALI_TILER_WEIGHTS_print(fp, &values->weights, indent + 2);
5033   fprintf(fp, "%*sState:\n", indent, "");
5034   MALI_TILER_STATE_print(fp, &values->state, indent + 2);
5035}
5036
5037struct MALI_FRAMEBUFFER_PADDING {
5038   int dummy;
5039};
5040
5041#define MALI_FRAMEBUFFER_PADDING_header         \
5042   0
5043
5044static inline void
5045MALI_FRAMEBUFFER_PADDING_pack(uint32_t * restrict cl,
5046                              const struct MALI_FRAMEBUFFER_PADDING * restrict values)
5047{
5048   cl[ 0] = 0;
5049   cl[ 1] = 0;
5050   cl[ 2] = 0;
5051   cl[ 3] = 0;
5052   cl[ 4] = 0;
5053   cl[ 5] = 0;
5054   cl[ 6] = 0;
5055   cl[ 7] = 0;
5056   cl[ 8] = 0;
5057   cl[ 9] = 0;
5058   cl[10] = 0;
5059   cl[11] = 0;
5060   cl[12] = 0;
5061   cl[13] = 0;
5062   cl[14] = 0;
5063   cl[15] = 0;
5064}
5065
5066
5067#define MALI_FRAMEBUFFER_PADDING_LENGTH 64
5068struct mali_framebuffer_padding_packed { uint32_t opaque[16]; };
5069static inline void
5070MALI_FRAMEBUFFER_PADDING_unpack(const uint8_t * restrict cl,
5071                                struct MALI_FRAMEBUFFER_PADDING * restrict values)
5072{
5073   if (((const uint32_t *) cl)[0] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 0\n");
5074   if (((const uint32_t *) cl)[1] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 1\n");
5075   if (((const uint32_t *) cl)[2] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 2\n");
5076   if (((const uint32_t *) cl)[3] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 3\n");
5077   if (((const uint32_t *) cl)[4] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 4\n");
5078   if (((const uint32_t *) cl)[5] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 5\n");
5079   if (((const uint32_t *) cl)[6] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 6\n");
5080   if (((const uint32_t *) cl)[7] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 7\n");
5081   if (((const uint32_t *) cl)[8] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 8\n");
5082   if (((const uint32_t *) cl)[9] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 9\n");
5083   if (((const uint32_t *) cl)[10] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 10\n");
5084   if (((const uint32_t *) cl)[11] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 11\n");
5085   if (((const uint32_t *) cl)[12] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 12\n");
5086   if (((const uint32_t *) cl)[13] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 13\n");
5087   if (((const uint32_t *) cl)[14] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 14\n");
5088   if (((const uint32_t *) cl)[15] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Framebuffer Padding unpacked at word 15\n");
5089}
5090
5091static inline void
5092MALI_FRAMEBUFFER_PADDING_print(FILE *fp, const struct MALI_FRAMEBUFFER_PADDING * values, unsigned indent)
5093{
5094}
5095
5096struct mali_framebuffer_packed {
5097   uint32_t opaque[32];
5098};
5099
5100#define MALI_FRAMEBUFFER_LENGTH 128
5101#define MALI_FRAMEBUFFER_ALIGN 64
5102#define MALI_FRAMEBUFFER_SECTION_PARAMETERS_TYPE struct MALI_FRAMEBUFFER_PARAMETERS
5103#define MALI_FRAMEBUFFER_SECTION_PARAMETERS_header MALI_FRAMEBUFFER_PARAMETERS_header
5104#define MALI_FRAMEBUFFER_SECTION_PARAMETERS_pack MALI_FRAMEBUFFER_PARAMETERS_pack
5105#define MALI_FRAMEBUFFER_SECTION_PARAMETERS_unpack MALI_FRAMEBUFFER_PARAMETERS_unpack
5106#define MALI_FRAMEBUFFER_SECTION_PARAMETERS_print MALI_FRAMEBUFFER_PARAMETERS_print
5107#define MALI_FRAMEBUFFER_SECTION_PARAMETERS_OFFSET 0
5108#define MALI_FRAMEBUFFER_SECTION_PADDING_TYPE struct MALI_FRAMEBUFFER_PADDING
5109#define MALI_FRAMEBUFFER_SECTION_PADDING_header MALI_FRAMEBUFFER_PADDING_header
5110#define MALI_FRAMEBUFFER_SECTION_PADDING_pack MALI_FRAMEBUFFER_PADDING_pack
5111#define MALI_FRAMEBUFFER_SECTION_PADDING_unpack MALI_FRAMEBUFFER_PADDING_unpack
5112#define MALI_FRAMEBUFFER_SECTION_PADDING_print MALI_FRAMEBUFFER_PADDING_print
5113#define MALI_FRAMEBUFFER_SECTION_PADDING_OFFSET 64
5114
5115struct MALI_JOB_HEADER {
5116   uint32_t                             exception_status;
5117   uint32_t                             first_incomplete_task;
5118   uint64_t                             fault_pointer;
5119   bool                                 is_64b;
5120   enum mali_job_type                   type;
5121   bool                                 barrier;
5122   bool                                 invalidate_cache;
5123   bool                                 suppress_prefetch;
5124   bool                                 enable_texture_mapper;
5125   bool                                 relax_dependency_1;
5126   bool                                 relax_dependency_2;
5127   uint32_t                             index;
5128   uint32_t                             dependency_1;
5129   uint32_t                             dependency_2;
5130   uint64_t                             next;
5131};
5132
5133#define MALI_JOB_HEADER_header                  \
5134   .is_64b = true
5135
5136static inline void
5137MALI_JOB_HEADER_pack(uint32_t * restrict cl,
5138                     const struct MALI_JOB_HEADER * restrict values)
5139{
5140   cl[ 0] = __gen_uint(values->exception_status, 0, 31);
5141   cl[ 1] = __gen_uint(values->first_incomplete_task, 0, 31);
5142   cl[ 2] = __gen_uint(values->fault_pointer, 0, 63);
5143   cl[ 3] = __gen_uint(values->fault_pointer, 0, 63) >> 32;
5144   cl[ 4] = __gen_uint(values->is_64b, 0, 0) |
5145            __gen_uint(values->type, 1, 7) |
5146            __gen_uint(values->barrier, 8, 8) |
5147            __gen_uint(values->invalidate_cache, 9, 9) |
5148            __gen_uint(values->suppress_prefetch, 11, 11) |
5149            __gen_uint(values->enable_texture_mapper, 12, 12) |
5150            __gen_uint(values->relax_dependency_1, 14, 14) |
5151            __gen_uint(values->relax_dependency_2, 15, 15) |
5152            __gen_uint(values->index, 16, 31);
5153   cl[ 5] = __gen_uint(values->dependency_1, 0, 15) |
5154            __gen_uint(values->dependency_2, 16, 31);
5155   cl[ 6] = __gen_uint(values->next, 0, 63);
5156   cl[ 7] = __gen_uint(values->next, 0, 63) >> 32;
5157}
5158
5159
5160#define MALI_JOB_HEADER_LENGTH 32
5161#define MALI_JOB_HEADER_ALIGN 64
5162struct mali_job_header_packed { uint32_t opaque[8]; };
5163static inline void
5164MALI_JOB_HEADER_unpack(const uint8_t * restrict cl,
5165                       struct MALI_JOB_HEADER * restrict values)
5166{
5167   if (((const uint32_t *) cl)[4] & 0x2400) fprintf(stderr, "XXX: Invalid field of Job Header unpacked at word 4\n");
5168   values->exception_status = __gen_unpack_uint(cl, 0, 31);
5169   values->first_incomplete_task = __gen_unpack_uint(cl, 32, 63);
5170   values->fault_pointer = __gen_unpack_uint(cl, 64, 127);
5171   values->is_64b = __gen_unpack_uint(cl, 128, 128);
5172   values->type = (enum mali_job_type)__gen_unpack_uint(cl, 129, 135);
5173   values->barrier = __gen_unpack_uint(cl, 136, 136);
5174   values->invalidate_cache = __gen_unpack_uint(cl, 137, 137);
5175   values->suppress_prefetch = __gen_unpack_uint(cl, 139, 139);
5176   values->enable_texture_mapper = __gen_unpack_uint(cl, 140, 140);
5177   values->relax_dependency_1 = __gen_unpack_uint(cl, 142, 142);
5178   values->relax_dependency_2 = __gen_unpack_uint(cl, 143, 143);
5179   values->index = __gen_unpack_uint(cl, 144, 159);
5180   values->dependency_1 = __gen_unpack_uint(cl, 160, 175);
5181   values->dependency_2 = __gen_unpack_uint(cl, 176, 191);
5182   values->next = __gen_unpack_uint(cl, 192, 255);
5183}
5184
5185static inline void
5186MALI_JOB_HEADER_print(FILE *fp, const struct MALI_JOB_HEADER * values, unsigned indent)
5187{
5188   fprintf(fp, "%*sException Status: %u\n", indent, "", values->exception_status);
5189   fprintf(fp, "%*sFirst Incomplete Task: %u\n", indent, "", values->first_incomplete_task);
5190   fprintf(fp, "%*sFault Pointer: 0x%" PRIx64 "\n", indent, "", values->fault_pointer);
5191   fprintf(fp, "%*sIs 64b: %s\n", indent, "", values->is_64b ? "true" : "false");
5192   fprintf(fp, "%*sType: %s\n", indent, "", mali_job_type_as_str(values->type));
5193   fprintf(fp, "%*sBarrier: %s\n", indent, "", values->barrier ? "true" : "false");
5194   fprintf(fp, "%*sInvalidate Cache: %s\n", indent, "", values->invalidate_cache ? "true" : "false");
5195   fprintf(fp, "%*sSuppress Prefetch: %s\n", indent, "", values->suppress_prefetch ? "true" : "false");
5196   fprintf(fp, "%*sEnable Texture Mapper: %s\n", indent, "", values->enable_texture_mapper ? "true" : "false");
5197   fprintf(fp, "%*sRelax Dependency 1: %s\n", indent, "", values->relax_dependency_1 ? "true" : "false");
5198   fprintf(fp, "%*sRelax Dependency 2: %s\n", indent, "", values->relax_dependency_2 ? "true" : "false");
5199   fprintf(fp, "%*sIndex: %u\n", indent, "", values->index);
5200   fprintf(fp, "%*sDependency 1: %u\n", indent, "", values->dependency_1);
5201   fprintf(fp, "%*sDependency 2: %u\n", indent, "", values->dependency_2);
5202   fprintf(fp, "%*sNext: 0x%" PRIx64 "\n", indent, "", values->next);
5203}
5204
5205struct MALI_FRAGMENT_JOB_PAYLOAD {
5206   uint32_t                             bound_min_x;
5207   uint32_t                             bound_min_y;
5208   uint32_t                             bound_max_x;
5209   uint32_t                             bound_max_y;
5210   bool                                 has_tile_enable_map;
5211   uint64_t                             framebuffer;
5212   uint64_t                             tile_enable_map;
5213   uint32_t                             tile_enable_map_row_stride;
5214};
5215
5216#define MALI_FRAGMENT_JOB_PAYLOAD_header        \
5217   0
5218
5219static inline void
5220MALI_FRAGMENT_JOB_PAYLOAD_pack(uint32_t * restrict cl,
5221                               const struct MALI_FRAGMENT_JOB_PAYLOAD * restrict values)
5222{
5223   cl[ 0] = __gen_uint(values->bound_min_x, 0, 11) |
5224            __gen_uint(values->bound_min_y, 16, 27);
5225   cl[ 1] = __gen_uint(values->bound_max_x, 0, 11) |
5226            __gen_uint(values->bound_max_y, 16, 27) |
5227            __gen_uint(values->has_tile_enable_map, 31, 31);
5228   cl[ 2] = __gen_uint(values->framebuffer, 0, 63);
5229   cl[ 3] = __gen_uint(values->framebuffer, 0, 63) >> 32;
5230   cl[ 4] = __gen_uint(values->tile_enable_map, 0, 63);
5231   cl[ 5] = __gen_uint(values->tile_enable_map, 0, 63) >> 32;
5232   cl[ 6] = __gen_uint(values->tile_enable_map_row_stride, 0, 7);
5233   cl[ 7] = 0;
5234}
5235
5236
5237#define MALI_FRAGMENT_JOB_PAYLOAD_LENGTH 32
5238struct mali_fragment_job_payload_packed { uint32_t opaque[8]; };
5239static inline void
5240MALI_FRAGMENT_JOB_PAYLOAD_unpack(const uint8_t * restrict cl,
5241                                 struct MALI_FRAGMENT_JOB_PAYLOAD * restrict values)
5242{
5243   if (((const uint32_t *) cl)[0] & 0xf000f000) fprintf(stderr, "XXX: Invalid field of Fragment Job Payload unpacked at word 0\n");
5244   if (((const uint32_t *) cl)[1] & 0x7000f000) fprintf(stderr, "XXX: Invalid field of Fragment Job Payload unpacked at word 1\n");
5245   if (((const uint32_t *) cl)[6] & 0xffffff00) fprintf(stderr, "XXX: Invalid field of Fragment Job Payload unpacked at word 6\n");
5246   if (((const uint32_t *) cl)[7] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Fragment Job Payload unpacked at word 7\n");
5247   values->bound_min_x = __gen_unpack_uint(cl, 0, 11);
5248   values->bound_min_y = __gen_unpack_uint(cl, 16, 27);
5249   values->bound_max_x = __gen_unpack_uint(cl, 32, 43);
5250   values->bound_max_y = __gen_unpack_uint(cl, 48, 59);
5251   values->has_tile_enable_map = __gen_unpack_uint(cl, 63, 63);
5252   values->framebuffer = __gen_unpack_uint(cl, 64, 127);
5253   values->tile_enable_map = __gen_unpack_uint(cl, 128, 191);
5254   values->tile_enable_map_row_stride = __gen_unpack_uint(cl, 192, 199);
5255}
5256
5257static inline void
5258MALI_FRAGMENT_JOB_PAYLOAD_print(FILE *fp, const struct MALI_FRAGMENT_JOB_PAYLOAD * values, unsigned indent)
5259{
5260   fprintf(fp, "%*sBound Min X: %u\n", indent, "", values->bound_min_x);
5261   fprintf(fp, "%*sBound Min Y: %u\n", indent, "", values->bound_min_y);
5262   fprintf(fp, "%*sBound Max X: %u\n", indent, "", values->bound_max_x);
5263   fprintf(fp, "%*sBound Max Y: %u\n", indent, "", values->bound_max_y);
5264   fprintf(fp, "%*sHas Tile Enable Map: %s\n", indent, "", values->has_tile_enable_map ? "true" : "false");
5265   fprintf(fp, "%*sFramebuffer: 0x%" PRIx64 "\n", indent, "", values->framebuffer);
5266   fprintf(fp, "%*sTile Enable Map: 0x%" PRIx64 "\n", indent, "", values->tile_enable_map);
5267   fprintf(fp, "%*sTile Enable Map Row Stride: %u\n", indent, "", values->tile_enable_map_row_stride);
5268}
5269
5270struct mali_fragment_job_packed {
5271   uint32_t opaque[16];
5272};
5273
5274#define MALI_FRAGMENT_JOB_LENGTH 64
5275#define MALI_FRAGMENT_JOB_ALIGN 64
5276#define MALI_FRAGMENT_JOB_SECTION_HEADER_TYPE struct MALI_JOB_HEADER
5277#define MALI_FRAGMENT_JOB_SECTION_HEADER_header MALI_JOB_HEADER_header
5278#define MALI_FRAGMENT_JOB_SECTION_HEADER_pack MALI_JOB_HEADER_pack
5279#define MALI_FRAGMENT_JOB_SECTION_HEADER_unpack MALI_JOB_HEADER_unpack
5280#define MALI_FRAGMENT_JOB_SECTION_HEADER_print MALI_JOB_HEADER_print
5281#define MALI_FRAGMENT_JOB_SECTION_HEADER_OFFSET 0
5282#define MALI_FRAGMENT_JOB_SECTION_PAYLOAD_TYPE struct MALI_FRAGMENT_JOB_PAYLOAD
5283#define MALI_FRAGMENT_JOB_SECTION_PAYLOAD_header MALI_FRAGMENT_JOB_PAYLOAD_header
5284#define MALI_FRAGMENT_JOB_SECTION_PAYLOAD_pack MALI_FRAGMENT_JOB_PAYLOAD_pack
5285#define MALI_FRAGMENT_JOB_SECTION_PAYLOAD_unpack MALI_FRAGMENT_JOB_PAYLOAD_unpack
5286#define MALI_FRAGMENT_JOB_SECTION_PAYLOAD_print MALI_FRAGMENT_JOB_PAYLOAD_print
5287#define MALI_FRAGMENT_JOB_SECTION_PAYLOAD_OFFSET 32
5288
5289enum mali_write_value_type {
5290        MALI_WRITE_VALUE_TYPE_CYCLE_COUNTER  =      1,
5291        MALI_WRITE_VALUE_TYPE_SYSTEM_TIMESTAMP =      2,
5292        MALI_WRITE_VALUE_TYPE_ZERO           =      3,
5293        MALI_WRITE_VALUE_TYPE_IMMEDIATE_8    =      4,
5294        MALI_WRITE_VALUE_TYPE_IMMEDIATE_16   =      5,
5295        MALI_WRITE_VALUE_TYPE_IMMEDIATE_32   =      6,
5296        MALI_WRITE_VALUE_TYPE_IMMEDIATE_64   =      7,
5297};
5298
5299static inline const char *
5300mali_write_value_type_as_str(enum mali_write_value_type imm)
5301{
5302    switch (imm) {
5303    case MALI_WRITE_VALUE_TYPE_CYCLE_COUNTER: return "Cycle Counter";
5304    case MALI_WRITE_VALUE_TYPE_SYSTEM_TIMESTAMP: return "System Timestamp";
5305    case MALI_WRITE_VALUE_TYPE_ZERO: return "Zero";
5306    case MALI_WRITE_VALUE_TYPE_IMMEDIATE_8: return "Immediate 8";
5307    case MALI_WRITE_VALUE_TYPE_IMMEDIATE_16: return "Immediate 16";
5308    case MALI_WRITE_VALUE_TYPE_IMMEDIATE_32: return "Immediate 32";
5309    case MALI_WRITE_VALUE_TYPE_IMMEDIATE_64: return "Immediate 64";
5310    default: return "XXX: INVALID";
5311    }
5312}
5313
5314struct MALI_WRITE_VALUE_JOB_PAYLOAD {
5315   uint64_t                             address;
5316   enum mali_write_value_type           type;
5317   uint64_t                             immediate_value;
5318};
5319
5320#define MALI_WRITE_VALUE_JOB_PAYLOAD_header     \
5321   0
5322
5323static inline void
5324MALI_WRITE_VALUE_JOB_PAYLOAD_pack(uint32_t * restrict cl,
5325                                  const struct MALI_WRITE_VALUE_JOB_PAYLOAD * restrict values)
5326{
5327   cl[ 0] = __gen_uint(values->address, 0, 63);
5328   cl[ 1] = __gen_uint(values->address, 0, 63) >> 32;
5329   cl[ 2] = __gen_uint(values->type, 0, 31);
5330   cl[ 3] = 0;
5331   cl[ 4] = __gen_uint(values->immediate_value, 0, 63);
5332   cl[ 5] = __gen_uint(values->immediate_value, 0, 63) >> 32;
5333}
5334
5335
5336#define MALI_WRITE_VALUE_JOB_PAYLOAD_LENGTH 24
5337struct mali_write_value_job_payload_packed { uint32_t opaque[6]; };
5338static inline void
5339MALI_WRITE_VALUE_JOB_PAYLOAD_unpack(const uint8_t * restrict cl,
5340                                    struct MALI_WRITE_VALUE_JOB_PAYLOAD * restrict values)
5341{
5342   if (((const uint32_t *) cl)[3] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Write Value Job Payload unpacked at word 3\n");
5343   values->address = __gen_unpack_uint(cl, 0, 63);
5344   values->type = (enum mali_write_value_type)__gen_unpack_uint(cl, 64, 95);
5345   values->immediate_value = __gen_unpack_uint(cl, 128, 191);
5346}
5347
5348static inline void
5349MALI_WRITE_VALUE_JOB_PAYLOAD_print(FILE *fp, const struct MALI_WRITE_VALUE_JOB_PAYLOAD * values, unsigned indent)
5350{
5351   fprintf(fp, "%*sAddress: 0x%" PRIx64 "\n", indent, "", values->address);
5352   fprintf(fp, "%*sType: %s\n", indent, "", mali_write_value_type_as_str(values->type));
5353   fprintf(fp, "%*sImmediate Value: 0x%" PRIx64 "\n", indent, "", values->immediate_value);
5354}
5355
5356struct MALI_CACHE_FLUSH_JOB_PAYLOAD {
5357   bool                                 clean_shader_core_ls;
5358   bool                                 invalidate_shader_core_ls;
5359   bool                                 invalidate_shader_core_other;
5360   bool                                 job_manager_clean;
5361   bool                                 job_manager_invalidate;
5362   bool                                 tiler_clean;
5363   bool                                 tiler_invalidate;
5364   bool                                 l2_clean;
5365   bool                                 l2_invalidate;
5366};
5367
5368#define MALI_CACHE_FLUSH_JOB_PAYLOAD_header     \
5369   0
5370
5371static inline void
5372MALI_CACHE_FLUSH_JOB_PAYLOAD_pack(uint32_t * restrict cl,
5373                                  const struct MALI_CACHE_FLUSH_JOB_PAYLOAD * restrict values)
5374{
5375   cl[ 0] = __gen_uint(values->clean_shader_core_ls, 0, 0) |
5376            __gen_uint(values->invalidate_shader_core_ls, 1, 1) |
5377            __gen_uint(values->invalidate_shader_core_other, 2, 2) |
5378            __gen_uint(values->job_manager_clean, 16, 16) |
5379            __gen_uint(values->job_manager_invalidate, 17, 17) |
5380            __gen_uint(values->tiler_clean, 24, 24) |
5381            __gen_uint(values->tiler_invalidate, 25, 25);
5382   cl[ 1] = __gen_uint(values->l2_clean, 0, 0) |
5383            __gen_uint(values->l2_invalidate, 1, 1);
5384}
5385
5386
5387#define MALI_CACHE_FLUSH_JOB_PAYLOAD_LENGTH 8
5388struct mali_cache_flush_job_payload_packed { uint32_t opaque[2]; };
5389static inline void
5390MALI_CACHE_FLUSH_JOB_PAYLOAD_unpack(const uint8_t * restrict cl,
5391                                    struct MALI_CACHE_FLUSH_JOB_PAYLOAD * restrict values)
5392{
5393   if (((const uint32_t *) cl)[0] & 0xfcfcfff8) fprintf(stderr, "XXX: Invalid field of Cache Flush Job Payload unpacked at word 0\n");
5394   if (((const uint32_t *) cl)[1] & 0xfffffffc) fprintf(stderr, "XXX: Invalid field of Cache Flush Job Payload unpacked at word 1\n");
5395   values->clean_shader_core_ls = __gen_unpack_uint(cl, 0, 0);
5396   values->invalidate_shader_core_ls = __gen_unpack_uint(cl, 1, 1);
5397   values->invalidate_shader_core_other = __gen_unpack_uint(cl, 2, 2);
5398   values->job_manager_clean = __gen_unpack_uint(cl, 16, 16);
5399   values->job_manager_invalidate = __gen_unpack_uint(cl, 17, 17);
5400   values->tiler_clean = __gen_unpack_uint(cl, 24, 24);
5401   values->tiler_invalidate = __gen_unpack_uint(cl, 25, 25);
5402   values->l2_clean = __gen_unpack_uint(cl, 32, 32);
5403   values->l2_invalidate = __gen_unpack_uint(cl, 33, 33);
5404}
5405
5406static inline void
5407MALI_CACHE_FLUSH_JOB_PAYLOAD_print(FILE *fp, const struct MALI_CACHE_FLUSH_JOB_PAYLOAD * values, unsigned indent)
5408{
5409   fprintf(fp, "%*sClean Shader Core LS: %s\n", indent, "", values->clean_shader_core_ls ? "true" : "false");
5410   fprintf(fp, "%*sInvalidate Shader Core LS: %s\n", indent, "", values->invalidate_shader_core_ls ? "true" : "false");
5411   fprintf(fp, "%*sInvalidate Shader Core Other: %s\n", indent, "", values->invalidate_shader_core_other ? "true" : "false");
5412   fprintf(fp, "%*sJob Manager Clean: %s\n", indent, "", values->job_manager_clean ? "true" : "false");
5413   fprintf(fp, "%*sJob Manager Invalidate: %s\n", indent, "", values->job_manager_invalidate ? "true" : "false");
5414   fprintf(fp, "%*sTiler Clean: %s\n", indent, "", values->tiler_clean ? "true" : "false");
5415   fprintf(fp, "%*sTiler Invalidate: %s\n", indent, "", values->tiler_invalidate ? "true" : "false");
5416   fprintf(fp, "%*sL2 Clean: %s\n", indent, "", values->l2_clean ? "true" : "false");
5417   fprintf(fp, "%*sL2 Invalidate: %s\n", indent, "", values->l2_invalidate ? "true" : "false");
5418}
5419
5420struct mali_write_value_job_packed {
5421   uint32_t opaque[14];
5422};
5423
5424#define MALI_WRITE_VALUE_JOB_LENGTH 56
5425#define MALI_WRITE_VALUE_JOB_ALIGN 64
5426#define MALI_WRITE_VALUE_JOB_SECTION_HEADER_TYPE struct MALI_JOB_HEADER
5427#define MALI_WRITE_VALUE_JOB_SECTION_HEADER_header MALI_JOB_HEADER_header
5428#define MALI_WRITE_VALUE_JOB_SECTION_HEADER_pack MALI_JOB_HEADER_pack
5429#define MALI_WRITE_VALUE_JOB_SECTION_HEADER_unpack MALI_JOB_HEADER_unpack
5430#define MALI_WRITE_VALUE_JOB_SECTION_HEADER_print MALI_JOB_HEADER_print
5431#define MALI_WRITE_VALUE_JOB_SECTION_HEADER_OFFSET 0
5432#define MALI_WRITE_VALUE_JOB_SECTION_PAYLOAD_TYPE struct MALI_WRITE_VALUE_JOB_PAYLOAD
5433#define MALI_WRITE_VALUE_JOB_SECTION_PAYLOAD_header MALI_WRITE_VALUE_JOB_PAYLOAD_header
5434#define MALI_WRITE_VALUE_JOB_SECTION_PAYLOAD_pack MALI_WRITE_VALUE_JOB_PAYLOAD_pack
5435#define MALI_WRITE_VALUE_JOB_SECTION_PAYLOAD_unpack MALI_WRITE_VALUE_JOB_PAYLOAD_unpack
5436#define MALI_WRITE_VALUE_JOB_SECTION_PAYLOAD_print MALI_WRITE_VALUE_JOB_PAYLOAD_print
5437#define MALI_WRITE_VALUE_JOB_SECTION_PAYLOAD_OFFSET 32
5438
5439struct mali_cache_flush_job_packed {
5440   uint32_t opaque[10];
5441};
5442
5443#define MALI_CACHE_FLUSH_JOB_LENGTH 40
5444#define MALI_CACHE_FLUSH_JOB_ALIGN 64
5445#define MALI_CACHE_FLUSH_JOB_SECTION_HEADER_TYPE struct MALI_JOB_HEADER
5446#define MALI_CACHE_FLUSH_JOB_SECTION_HEADER_header MALI_JOB_HEADER_header
5447#define MALI_CACHE_FLUSH_JOB_SECTION_HEADER_pack MALI_JOB_HEADER_pack
5448#define MALI_CACHE_FLUSH_JOB_SECTION_HEADER_unpack MALI_JOB_HEADER_unpack
5449#define MALI_CACHE_FLUSH_JOB_SECTION_HEADER_print MALI_JOB_HEADER_print
5450#define MALI_CACHE_FLUSH_JOB_SECTION_HEADER_OFFSET 0
5451#define MALI_CACHE_FLUSH_JOB_SECTION_PAYLOAD_TYPE struct MALI_CACHE_FLUSH_JOB_PAYLOAD
5452#define MALI_CACHE_FLUSH_JOB_SECTION_PAYLOAD_header MALI_CACHE_FLUSH_JOB_PAYLOAD_header
5453#define MALI_CACHE_FLUSH_JOB_SECTION_PAYLOAD_pack MALI_CACHE_FLUSH_JOB_PAYLOAD_pack
5454#define MALI_CACHE_FLUSH_JOB_SECTION_PAYLOAD_unpack MALI_CACHE_FLUSH_JOB_PAYLOAD_unpack
5455#define MALI_CACHE_FLUSH_JOB_SECTION_PAYLOAD_print MALI_CACHE_FLUSH_JOB_PAYLOAD_print
5456#define MALI_CACHE_FLUSH_JOB_SECTION_PAYLOAD_OFFSET 32
5457
5458struct MALI_COMPUTE_JOB_PARAMETERS {
5459   uint32_t                             job_task_split;
5460};
5461
5462#define MALI_COMPUTE_JOB_PARAMETERS_header      \
5463   0
5464
5465static inline void
5466MALI_COMPUTE_JOB_PARAMETERS_pack(uint32_t * restrict cl,
5467                                 const struct MALI_COMPUTE_JOB_PARAMETERS * restrict values)
5468{
5469   cl[ 0] = __gen_uint(values->job_task_split, 26, 29);
5470   cl[ 1] = 0;
5471   cl[ 2] = 0;
5472   cl[ 3] = 0;
5473   cl[ 4] = 0;
5474   cl[ 5] = 0;
5475}
5476
5477
5478#define MALI_COMPUTE_JOB_PARAMETERS_LENGTH 24
5479struct mali_compute_job_parameters_packed { uint32_t opaque[6]; };
5480static inline void
5481MALI_COMPUTE_JOB_PARAMETERS_unpack(const uint8_t * restrict cl,
5482                                   struct MALI_COMPUTE_JOB_PARAMETERS * restrict values)
5483{
5484   if (((const uint32_t *) cl)[0] & 0xc3ffffff) fprintf(stderr, "XXX: Invalid field of Compute Job Parameters unpacked at word 0\n");
5485   if (((const uint32_t *) cl)[1] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Compute Job Parameters unpacked at word 1\n");
5486   if (((const uint32_t *) cl)[2] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Compute Job Parameters unpacked at word 2\n");
5487   if (((const uint32_t *) cl)[3] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Compute Job Parameters unpacked at word 3\n");
5488   if (((const uint32_t *) cl)[4] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Compute Job Parameters unpacked at word 4\n");
5489   if (((const uint32_t *) cl)[5] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Compute Job Parameters unpacked at word 5\n");
5490   values->job_task_split = __gen_unpack_uint(cl, 26, 29);
5491}
5492
5493static inline void
5494MALI_COMPUTE_JOB_PARAMETERS_print(FILE *fp, const struct MALI_COMPUTE_JOB_PARAMETERS * values, unsigned indent)
5495{
5496   fprintf(fp, "%*sJob Task Split: %u\n", indent, "", values->job_task_split);
5497}
5498
5499struct mali_compute_job_packed {
5500   uint32_t opaque[48];
5501};
5502
5503#define MALI_COMPUTE_JOB_LENGTH 192
5504#define MALI_COMPUTE_JOB_ALIGN 64
5505#define MALI_COMPUTE_JOB_SECTION_HEADER_TYPE struct MALI_JOB_HEADER
5506#define MALI_COMPUTE_JOB_SECTION_HEADER_header MALI_JOB_HEADER_header
5507#define MALI_COMPUTE_JOB_SECTION_HEADER_pack MALI_JOB_HEADER_pack
5508#define MALI_COMPUTE_JOB_SECTION_HEADER_unpack MALI_JOB_HEADER_unpack
5509#define MALI_COMPUTE_JOB_SECTION_HEADER_print MALI_JOB_HEADER_print
5510#define MALI_COMPUTE_JOB_SECTION_HEADER_OFFSET 0
5511#define MALI_COMPUTE_JOB_SECTION_INVOCATION_TYPE struct MALI_INVOCATION
5512#define MALI_COMPUTE_JOB_SECTION_INVOCATION_header MALI_INVOCATION_header
5513#define MALI_COMPUTE_JOB_SECTION_INVOCATION_pack MALI_INVOCATION_pack
5514#define MALI_COMPUTE_JOB_SECTION_INVOCATION_unpack MALI_INVOCATION_unpack
5515#define MALI_COMPUTE_JOB_SECTION_INVOCATION_print MALI_INVOCATION_print
5516#define MALI_COMPUTE_JOB_SECTION_INVOCATION_OFFSET 32
5517#define MALI_COMPUTE_JOB_SECTION_PARAMETERS_TYPE struct MALI_COMPUTE_JOB_PARAMETERS
5518#define MALI_COMPUTE_JOB_SECTION_PARAMETERS_header MALI_COMPUTE_JOB_PARAMETERS_header
5519#define MALI_COMPUTE_JOB_SECTION_PARAMETERS_pack MALI_COMPUTE_JOB_PARAMETERS_pack
5520#define MALI_COMPUTE_JOB_SECTION_PARAMETERS_unpack MALI_COMPUTE_JOB_PARAMETERS_unpack
5521#define MALI_COMPUTE_JOB_SECTION_PARAMETERS_print MALI_COMPUTE_JOB_PARAMETERS_print
5522#define MALI_COMPUTE_JOB_SECTION_PARAMETERS_OFFSET 40
5523#define MALI_COMPUTE_JOB_SECTION_DRAW_TYPE struct MALI_DRAW
5524#define MALI_COMPUTE_JOB_SECTION_DRAW_header MALI_DRAW_header
5525#define MALI_COMPUTE_JOB_SECTION_DRAW_pack MALI_DRAW_pack
5526#define MALI_COMPUTE_JOB_SECTION_DRAW_unpack MALI_DRAW_unpack
5527#define MALI_COMPUTE_JOB_SECTION_DRAW_print MALI_DRAW_print
5528#define MALI_COMPUTE_JOB_SECTION_DRAW_OFFSET 64
5529
5530struct MALI_PRIMITIVE_SIZE {
5531   float                                constant;
5532   uint64_t                             size_array;
5533};
5534
5535#define MALI_PRIMITIVE_SIZE_header              \
5536   0
5537
5538static inline void
5539MALI_PRIMITIVE_SIZE_pack(uint32_t * restrict cl,
5540                         const struct MALI_PRIMITIVE_SIZE * restrict values)
5541{
5542   cl[ 0] = __gen_uint(fui(values->constant), 0, 32) |
5543            __gen_uint(values->size_array, 0, 63);
5544   cl[ 1] = __gen_uint(values->size_array, 0, 63) >> 32;
5545}
5546
5547
5548#define MALI_PRIMITIVE_SIZE_LENGTH 8
5549struct mali_primitive_size_packed { uint32_t opaque[2]; };
5550static inline void
5551MALI_PRIMITIVE_SIZE_unpack(const uint8_t * restrict cl,
5552                           struct MALI_PRIMITIVE_SIZE * restrict values)
5553{
5554   values->constant = __gen_unpack_float(cl, 0, 31);
5555   values->size_array = __gen_unpack_uint(cl, 0, 63);
5556}
5557
5558static inline void
5559MALI_PRIMITIVE_SIZE_print(FILE *fp, const struct MALI_PRIMITIVE_SIZE * values, unsigned indent)
5560{
5561   fprintf(fp, "%*sConstant: %f\n", indent, "", values->constant);
5562   fprintf(fp, "%*sSize Array: 0x%" PRIx64 "\n", indent, "", values->size_array);
5563}
5564
5565struct MALI_TILER_POINTER {
5566   uint64_t                             address;
5567};
5568
5569#define MALI_TILER_POINTER_header               \
5570   0
5571
5572static inline void
5573MALI_TILER_POINTER_pack(uint32_t * restrict cl,
5574                        const struct MALI_TILER_POINTER * restrict values)
5575{
5576   cl[ 0] = __gen_uint(values->address, 0, 63);
5577   cl[ 1] = __gen_uint(values->address, 0, 63) >> 32;
5578}
5579
5580
5581#define MALI_TILER_POINTER_LENGTH 8
5582struct mali_tiler_pointer_packed { uint32_t opaque[2]; };
5583static inline void
5584MALI_TILER_POINTER_unpack(const uint8_t * restrict cl,
5585                          struct MALI_TILER_POINTER * restrict values)
5586{
5587   values->address = __gen_unpack_uint(cl, 0, 63);
5588}
5589
5590static inline void
5591MALI_TILER_POINTER_print(FILE *fp, const struct MALI_TILER_POINTER * values, unsigned indent)
5592{
5593   fprintf(fp, "%*sAddress: 0x%" PRIx64 "\n", indent, "", values->address);
5594}
5595
5596struct MALI_TILER_JOB_PADDING {
5597   int dummy;
5598};
5599
5600#define MALI_TILER_JOB_PADDING_header           \
5601   0
5602
5603static inline void
5604MALI_TILER_JOB_PADDING_pack(uint32_t * restrict cl,
5605                            const struct MALI_TILER_JOB_PADDING * restrict values)
5606{
5607   cl[ 0] = 0;
5608   cl[ 1] = 0;
5609   cl[ 2] = 0;
5610   cl[ 3] = 0;
5611   cl[ 4] = 0;
5612   cl[ 5] = 0;
5613   cl[ 6] = 0;
5614   cl[ 7] = 0;
5615   cl[ 8] = 0;
5616   cl[ 9] = 0;
5617   cl[10] = 0;
5618   cl[11] = 0;
5619}
5620
5621
5622#define MALI_TILER_JOB_PADDING_LENGTH 48
5623struct mali_tiler_job_padding_packed { uint32_t opaque[12]; };
5624static inline void
5625MALI_TILER_JOB_PADDING_unpack(const uint8_t * restrict cl,
5626                              struct MALI_TILER_JOB_PADDING * restrict values)
5627{
5628   if (((const uint32_t *) cl)[0] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 0\n");
5629   if (((const uint32_t *) cl)[1] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 1\n");
5630   if (((const uint32_t *) cl)[2] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 2\n");
5631   if (((const uint32_t *) cl)[3] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 3\n");
5632   if (((const uint32_t *) cl)[4] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 4\n");
5633   if (((const uint32_t *) cl)[5] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 5\n");
5634   if (((const uint32_t *) cl)[6] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 6\n");
5635   if (((const uint32_t *) cl)[7] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 7\n");
5636   if (((const uint32_t *) cl)[8] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 8\n");
5637   if (((const uint32_t *) cl)[9] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 9\n");
5638   if (((const uint32_t *) cl)[10] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 10\n");
5639   if (((const uint32_t *) cl)[11] & 0xffffffff) fprintf(stderr, "XXX: Invalid field of Tiler Job Padding unpacked at word 11\n");
5640}
5641
5642static inline void
5643MALI_TILER_JOB_PADDING_print(FILE *fp, const struct MALI_TILER_JOB_PADDING * values, unsigned indent)
5644{
5645}
5646
5647struct mali_tiler_job_packed {
5648   uint32_t opaque[64];
5649};
5650
5651#define MALI_TILER_JOB_LENGTH 256
5652#define MALI_TILER_JOB_ALIGN 64
5653#define MALI_TILER_JOB_SECTION_HEADER_TYPE struct MALI_JOB_HEADER
5654#define MALI_TILER_JOB_SECTION_HEADER_header MALI_JOB_HEADER_header
5655#define MALI_TILER_JOB_SECTION_HEADER_pack MALI_JOB_HEADER_pack
5656#define MALI_TILER_JOB_SECTION_HEADER_unpack MALI_JOB_HEADER_unpack
5657#define MALI_TILER_JOB_SECTION_HEADER_print MALI_JOB_HEADER_print
5658#define MALI_TILER_JOB_SECTION_HEADER_OFFSET 0
5659#define MALI_TILER_JOB_SECTION_INVOCATION_TYPE struct MALI_INVOCATION
5660#define MALI_TILER_JOB_SECTION_INVOCATION_header MALI_INVOCATION_header
5661#define MALI_TILER_JOB_SECTION_INVOCATION_pack MALI_INVOCATION_pack
5662#define MALI_TILER_JOB_SECTION_INVOCATION_unpack MALI_INVOCATION_unpack
5663#define MALI_TILER_JOB_SECTION_INVOCATION_print MALI_INVOCATION_print
5664#define MALI_TILER_JOB_SECTION_INVOCATION_OFFSET 32
5665#define MALI_TILER_JOB_SECTION_PRIMITIVE_TYPE struct MALI_PRIMITIVE
5666#define MALI_TILER_JOB_SECTION_PRIMITIVE_header MALI_PRIMITIVE_header
5667#define MALI_TILER_JOB_SECTION_PRIMITIVE_pack MALI_PRIMITIVE_pack
5668#define MALI_TILER_JOB_SECTION_PRIMITIVE_unpack MALI_PRIMITIVE_unpack
5669#define MALI_TILER_JOB_SECTION_PRIMITIVE_print MALI_PRIMITIVE_print
5670#define MALI_TILER_JOB_SECTION_PRIMITIVE_OFFSET 40
5671#define MALI_TILER_JOB_SECTION_PRIMITIVE_SIZE_TYPE struct MALI_PRIMITIVE_SIZE
5672#define MALI_TILER_JOB_SECTION_PRIMITIVE_SIZE_header MALI_PRIMITIVE_SIZE_header
5673#define MALI_TILER_JOB_SECTION_PRIMITIVE_SIZE_pack MALI_PRIMITIVE_SIZE_pack
5674#define MALI_TILER_JOB_SECTION_PRIMITIVE_SIZE_unpack MALI_PRIMITIVE_SIZE_unpack
5675#define MALI_TILER_JOB_SECTION_PRIMITIVE_SIZE_print MALI_PRIMITIVE_SIZE_print
5676#define MALI_TILER_JOB_SECTION_PRIMITIVE_SIZE_OFFSET 64
5677#define MALI_TILER_JOB_SECTION_TILER_TYPE struct MALI_TILER_POINTER
5678#define MALI_TILER_JOB_SECTION_TILER_header MALI_TILER_POINTER_header
5679#define MALI_TILER_JOB_SECTION_TILER_pack MALI_TILER_POINTER_pack
5680#define MALI_TILER_JOB_SECTION_TILER_unpack MALI_TILER_POINTER_unpack
5681#define MALI_TILER_JOB_SECTION_TILER_print MALI_TILER_POINTER_print
5682#define MALI_TILER_JOB_SECTION_TILER_OFFSET 72
5683#define MALI_TILER_JOB_SECTION_PADDING_TYPE struct MALI_TILER_JOB_PADDING
5684#define MALI_TILER_JOB_SECTION_PADDING_header MALI_TILER_JOB_PADDING_header
5685#define MALI_TILER_JOB_SECTION_PADDING_pack MALI_TILER_JOB_PADDING_pack
5686#define MALI_TILER_JOB_SECTION_PADDING_unpack MALI_TILER_JOB_PADDING_unpack
5687#define MALI_TILER_JOB_SECTION_PADDING_print MALI_TILER_JOB_PADDING_print
5688#define MALI_TILER_JOB_SECTION_PADDING_OFFSET 80
5689#define MALI_TILER_JOB_SECTION_DRAW_TYPE struct MALI_DRAW
5690#define MALI_TILER_JOB_SECTION_DRAW_header MALI_DRAW_header
5691#define MALI_TILER_JOB_SECTION_DRAW_pack MALI_DRAW_pack
5692#define MALI_TILER_JOB_SECTION_DRAW_unpack MALI_DRAW_unpack
5693#define MALI_TILER_JOB_SECTION_DRAW_print MALI_DRAW_print
5694#define MALI_TILER_JOB_SECTION_DRAW_OFFSET 128
5695
5696struct mali_indexed_vertex_job_packed {
5697   uint32_t opaque[96];
5698};
5699
5700#define MALI_INDEXED_VERTEX_JOB_LENGTH 384
5701#define MALI_INDEXED_VERTEX_JOB_ALIGN 64
5702#define MALI_INDEXED_VERTEX_JOB_SECTION_HEADER_TYPE struct MALI_JOB_HEADER
5703#define MALI_INDEXED_VERTEX_JOB_SECTION_HEADER_header MALI_JOB_HEADER_header
5704#define MALI_INDEXED_VERTEX_JOB_SECTION_HEADER_pack MALI_JOB_HEADER_pack
5705#define MALI_INDEXED_VERTEX_JOB_SECTION_HEADER_unpack MALI_JOB_HEADER_unpack
5706#define MALI_INDEXED_VERTEX_JOB_SECTION_HEADER_print MALI_JOB_HEADER_print
5707#define MALI_INDEXED_VERTEX_JOB_SECTION_HEADER_OFFSET 0
5708#define MALI_INDEXED_VERTEX_JOB_SECTION_INVOCATION_TYPE struct MALI_INVOCATION
5709#define MALI_INDEXED_VERTEX_JOB_SECTION_INVOCATION_header MALI_INVOCATION_header
5710#define MALI_INDEXED_VERTEX_JOB_SECTION_INVOCATION_pack MALI_INVOCATION_pack
5711#define MALI_INDEXED_VERTEX_JOB_SECTION_INVOCATION_unpack MALI_INVOCATION_unpack
5712#define MALI_INDEXED_VERTEX_JOB_SECTION_INVOCATION_print MALI_INVOCATION_print
5713#define MALI_INDEXED_VERTEX_JOB_SECTION_INVOCATION_OFFSET 32
5714#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_TYPE struct MALI_PRIMITIVE
5715#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_header MALI_PRIMITIVE_header
5716#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_pack MALI_PRIMITIVE_pack
5717#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_unpack MALI_PRIMITIVE_unpack
5718#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_print MALI_PRIMITIVE_print
5719#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_OFFSET 40
5720#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_SIZE_TYPE struct MALI_PRIMITIVE_SIZE
5721#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_SIZE_header MALI_PRIMITIVE_SIZE_header
5722#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_SIZE_pack MALI_PRIMITIVE_SIZE_pack
5723#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_SIZE_unpack MALI_PRIMITIVE_SIZE_unpack
5724#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_SIZE_print MALI_PRIMITIVE_SIZE_print
5725#define MALI_INDEXED_VERTEX_JOB_SECTION_PRIMITIVE_SIZE_OFFSET 64
5726#define MALI_INDEXED_VERTEX_JOB_SECTION_TILER_TYPE struct MALI_TILER_POINTER
5727#define MALI_INDEXED_VERTEX_JOB_SECTION_TILER_header MALI_TILER_POINTER_header
5728#define MALI_INDEXED_VERTEX_JOB_SECTION_TILER_pack MALI_TILER_POINTER_pack
5729#define MALI_INDEXED_VERTEX_JOB_SECTION_TILER_unpack MALI_TILER_POINTER_unpack
5730#define MALI_INDEXED_VERTEX_JOB_SECTION_TILER_print MALI_TILER_POINTER_print
5731#define MALI_INDEXED_VERTEX_JOB_SECTION_TILER_OFFSET 72
5732#define MALI_INDEXED_VERTEX_JOB_SECTION_PADDING_TYPE struct MALI_TILER_JOB_PADDING
5733#define MALI_INDEXED_VERTEX_JOB_SECTION_PADDING_header MALI_TILER_JOB_PADDING_header
5734#define MALI_INDEXED_VERTEX_JOB_SECTION_PADDING_pack MALI_TILER_JOB_PADDING_pack
5735#define MALI_INDEXED_VERTEX_JOB_SECTION_PADDING_unpack MALI_TILER_JOB_PADDING_unpack
5736#define MALI_INDEXED_VERTEX_JOB_SECTION_PADDING_print MALI_TILER_JOB_PADDING_print
5737#define MALI_INDEXED_VERTEX_JOB_SECTION_PADDING_OFFSET 80
5738#define MALI_INDEXED_VERTEX_JOB_SECTION_FRAGMENT_DRAW_TYPE struct MALI_DRAW
5739#define MALI_INDEXED_VERTEX_JOB_SECTION_FRAGMENT_DRAW_header MALI_DRAW_header
5740#define MALI_INDEXED_VERTEX_JOB_SECTION_FRAGMENT_DRAW_pack MALI_DRAW_pack
5741#define MALI_INDEXED_VERTEX_JOB_SECTION_FRAGMENT_DRAW_unpack MALI_DRAW_unpack
5742#define MALI_INDEXED_VERTEX_JOB_SECTION_FRAGMENT_DRAW_print MALI_DRAW_print
5743#define MALI_INDEXED_VERTEX_JOB_SECTION_FRAGMENT_DRAW_OFFSET 128
5744#define MALI_INDEXED_VERTEX_JOB_SECTION_VERTEX_DRAW_TYPE struct MALI_DRAW
5745#define MALI_INDEXED_VERTEX_JOB_SECTION_VERTEX_DRAW_header MALI_DRAW_header
5746#define MALI_INDEXED_VERTEX_JOB_SECTION_VERTEX_DRAW_pack MALI_DRAW_pack
5747#define MALI_INDEXED_VERTEX_JOB_SECTION_VERTEX_DRAW_unpack MALI_DRAW_unpack
5748#define MALI_INDEXED_VERTEX_JOB_SECTION_VERTEX_DRAW_print MALI_DRAW_print
5749#define MALI_INDEXED_VERTEX_JOB_SECTION_VERTEX_DRAW_OFFSET 256
5750
5751#include "panfrost-job.h"
5752#endif
5753