xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/r600/r600_formats.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 // SPDX-License-Identifier: MIT
2 #ifndef R600_FORMATS_H
3 #define R600_FORMATS_H
4 
5 #include "util/format/u_format.h"
6 #include "util/u_endian.h"
7 
8 /* list of formats from R700 ISA document - apply across GPUs in different registers */
9 #define     FMT_INVALID                     0x00000000
10 #define     FMT_8                           0x00000001
11 #define     FMT_4_4                         0x00000002
12 #define     FMT_3_3_2                       0x00000003
13 #define     FMT_16                          0x00000005
14 #define     FMT_16_FLOAT                    0x00000006
15 #define     FMT_8_8                         0x00000007
16 #define     FMT_5_6_5                       0x00000008
17 #define     FMT_6_5_5                       0x00000009
18 #define     FMT_1_5_5_5                     0x0000000A
19 #define     FMT_4_4_4_4                     0x0000000B
20 #define     FMT_5_5_5_1                     0x0000000C
21 #define     FMT_32                          0x0000000D
22 #define     FMT_32_FLOAT                    0x0000000E
23 #define     FMT_16_16                       0x0000000F
24 #define     FMT_16_16_FLOAT                 0x00000010
25 #define     FMT_8_24                        0x00000011
26 #define     FMT_8_24_FLOAT                  0x00000012
27 #define     FMT_24_8                        0x00000013
28 #define     FMT_24_8_FLOAT                  0x00000014
29 #define     FMT_10_11_11                    0x00000015
30 #define     FMT_10_11_11_FLOAT              0x00000016
31 #define     FMT_11_11_10                    0x00000017
32 #define     FMT_11_11_10_FLOAT              0x00000018
33 #define     FMT_2_10_10_10                  0x00000019
34 #define     FMT_8_8_8_8                     0x0000001A
35 #define     FMT_10_10_10_2                  0x0000001B
36 #define     FMT_X24_8_32_FLOAT              0x0000001C
37 #define     FMT_32_32                       0x0000001D
38 #define     FMT_32_32_FLOAT                 0x0000001E
39 #define     FMT_16_16_16_16                 0x0000001F
40 #define     FMT_16_16_16_16_FLOAT           0x00000020
41 #define     FMT_32_32_32_32                 0x00000022
42 #define     FMT_32_32_32_32_FLOAT           0x00000023
43 #define     FMT_1                           0x00000025
44 #define     FMT_GB_GR                       0x00000027
45 #define     FMT_BG_RG                       0x00000028
46 #define     FMT_32_AS_8                     0x00000029
47 #define     FMT_32_AS_8_8                   0x0000002a
48 #define     FMT_5_9_9_9_SHAREDEXP           0x0000002b
49 #define     FMT_8_8_8                       0x0000002c
50 #define     FMT_16_16_16                    0x0000002d
51 #define     FMT_16_16_16_FLOAT              0x0000002e
52 #define     FMT_32_32_32                    0x0000002f
53 #define     FMT_32_32_32_FLOAT              0x00000030
54 #define     FMT_BC1                         0x00000031
55 #define     FMT_BC2                         0x00000032
56 #define     FMT_BC3                         0x00000033
57 #define     FMT_BC4                         0x00000034
58 #define     FMT_BC5                         0x00000035
59 #define     FMT_BC6                         0x00000036
60 #define     FMT_BC7                         0x00000037
61 #define     FMT_32_AS_32_32_32_32           0x00000038
62 
63 #define     ENDIAN_NONE                     0
64 #define     ENDIAN_8IN16                    1
65 #define     ENDIAN_8IN32                    2
66 #define     ENDIAN_8IN64                    3
67 
r600_endian_swap(unsigned size)68 static inline unsigned r600_endian_swap(unsigned size)
69 {
70 	if (UTIL_ARCH_BIG_ENDIAN) {
71 		switch (size) {
72 		case 64:
73 			return ENDIAN_8IN64;
74 		case 32:
75 			return ENDIAN_8IN32;
76 		case 16:
77 			return ENDIAN_8IN16;
78 		default:
79 			return ENDIAN_NONE;
80 		}
81 	} else {
82 		return ENDIAN_NONE;
83 	}
84 }
85 
r600_is_buffer_format_supported(enum pipe_format format,bool for_vbo)86 static inline bool r600_is_buffer_format_supported(enum pipe_format format, bool for_vbo)
87 {
88 	const struct util_format_description *desc = util_format_description(format);
89 	unsigned i;
90 
91 	if (format == PIPE_FORMAT_R11G11B10_FLOAT)
92 		return true;
93 
94 	i = util_format_get_first_non_void_channel(format);
95 	if (i == -1)
96 		return false;
97 
98 	/* No fixed, no double. */
99 	if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN ||
100 	    (desc->channel[i].size == 64 &&
101 	     desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) ||
102 	    desc->channel[i].type == UTIL_FORMAT_TYPE_FIXED)
103 		return false;
104 
105 	/* No scaled/norm formats with 32 bits per channel. */
106 	if (desc->channel[i].size == 32 &&
107 	    !desc->channel[i].pure_integer &&
108 	    (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED ||
109 	     desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED))
110 		return false;
111 
112     /* No 8 bit 3 channel formats for TBOs */
113 	if (desc->channel[i].size == 8 && desc->nr_channels == 3)
114 		return for_vbo;
115 
116 	return true;
117 }
118 
r600_is_index_format_supported(enum pipe_format format)119 static inline bool r600_is_index_format_supported(enum pipe_format format)
120 {
121 	switch (format) {
122 	case PIPE_FORMAT_R8_UINT:
123 	case PIPE_FORMAT_R16_UINT:
124 	case PIPE_FORMAT_R32_UINT:
125 		return true;
126 
127 	default:
128 		return false;
129 	}
130 }
131 
132 #endif
133