pan/decode: Use GLSL style formats/swizzles
[mesa.git] / src / panfrost / pandecode / pan_pretty_print.c
1 /*
2 * © Copyright 2017-2098 The Panfrost Communiy
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 * SOFTWARE.
22 */
23
24 #include "pan_pretty_print.h"
25
26 #include <stdio.h>
27 #include <string.h>
28 #include <assert.h>
29
30 /* Some self-contained prettyprinting functions shared between pandecode and
31 * the main driver */
32
33 #define DEFINE_CASE(name) case MALI_## name: return "MALI_" #name
34 char *pandecode_format(enum mali_format format)
35 {
36 static char unk_format_str[10];
37
38 switch (format) {
39 DEFINE_CASE(RGB565);
40 DEFINE_CASE(RGB5_A1_UNORM);
41 DEFINE_CASE(RGB10_A2_UNORM);
42 DEFINE_CASE(RGB10_A2_SNORM);
43 DEFINE_CASE(RGB10_A2UI);
44 DEFINE_CASE(RGB10_A2I);
45 DEFINE_CASE(NV12);
46 DEFINE_CASE(Z32_UNORM);
47 DEFINE_CASE(R32_FIXED);
48 DEFINE_CASE(RG32_FIXED);
49 DEFINE_CASE(RGB32_FIXED);
50 DEFINE_CASE(RGBA32_FIXED);
51 DEFINE_CASE(R11F_G11F_B10F);
52 DEFINE_CASE(R9F_G9F_B9F_E5F);
53 DEFINE_CASE(VARYING_POS);
54 DEFINE_CASE(VARYING_DISCARD);
55
56 DEFINE_CASE(R8_SNORM);
57 DEFINE_CASE(R16_SNORM);
58 DEFINE_CASE(R32_SNORM);
59 DEFINE_CASE(RG8_SNORM);
60 DEFINE_CASE(RG16_SNORM);
61 DEFINE_CASE(RG32_SNORM);
62 DEFINE_CASE(RGB8_SNORM);
63 DEFINE_CASE(RGB16_SNORM);
64 DEFINE_CASE(RGB32_SNORM);
65 DEFINE_CASE(RGBA8_SNORM);
66 DEFINE_CASE(RGBA16_SNORM);
67 DEFINE_CASE(RGBA32_SNORM);
68
69 DEFINE_CASE(R8UI);
70 DEFINE_CASE(R16UI);
71 DEFINE_CASE(R32UI);
72 DEFINE_CASE(RG8UI);
73 DEFINE_CASE(RG16UI);
74 DEFINE_CASE(RG32UI);
75 DEFINE_CASE(RGB8UI);
76 DEFINE_CASE(RGB16UI);
77 DEFINE_CASE(RGB32UI);
78 DEFINE_CASE(RGBA8UI);
79 DEFINE_CASE(RGBA16UI);
80 DEFINE_CASE(RGBA32UI);
81
82 DEFINE_CASE(R8_UNORM);
83 DEFINE_CASE(R16_UNORM);
84 DEFINE_CASE(R32_UNORM);
85 DEFINE_CASE(R32F);
86 DEFINE_CASE(RG8_UNORM);
87 DEFINE_CASE(RG16_UNORM);
88 DEFINE_CASE(RG32_UNORM);
89 DEFINE_CASE(RG32F);
90 DEFINE_CASE(RGB8_UNORM);
91 DEFINE_CASE(RGB16_UNORM);
92 DEFINE_CASE(RGB32_UNORM);
93 DEFINE_CASE(RGB32F);
94 DEFINE_CASE(RGBA4_UNORM);
95 DEFINE_CASE(RGBA8_UNORM);
96 DEFINE_CASE(RGBA16_UNORM);
97 DEFINE_CASE(RGBA32_UNORM);
98 DEFINE_CASE(RGBA32F);
99
100 DEFINE_CASE(R8I);
101 DEFINE_CASE(R16I);
102 DEFINE_CASE(R32I);
103 DEFINE_CASE(RG8I);
104 DEFINE_CASE(R16F);
105 DEFINE_CASE(RG16I);
106 DEFINE_CASE(RG32I);
107 DEFINE_CASE(RG16F);
108 DEFINE_CASE(RGB8I);
109 DEFINE_CASE(RGB16I);
110 DEFINE_CASE(RGB32I);
111 DEFINE_CASE(RGB16F);
112 DEFINE_CASE(RGBA8I);
113 DEFINE_CASE(RGBA16I);
114 DEFINE_CASE(RGBA32I);
115 DEFINE_CASE(RGBA16F);
116
117 DEFINE_CASE(RGBA4);
118 DEFINE_CASE(RGBA8_2);
119 DEFINE_CASE(RGB10_A2_2);
120 default:
121 snprintf(unk_format_str, sizeof(unk_format_str), "MALI_0x%02x", format);
122 return unk_format_str;
123 }
124 }
125
126 #undef DEFINE_CASE
127
128 /* Helper to dump fixed-function blend part for debugging */
129
130 static const char *
131 panfrost_factor_name(enum mali_dominant_factor factor)
132 {
133 switch (factor) {
134 case MALI_DOMINANT_UNK0:
135 return "unk0";
136
137 case MALI_DOMINANT_ZERO:
138 return "zero";
139
140 case MALI_DOMINANT_SRC_COLOR:
141 return "source color";
142
143 case MALI_DOMINANT_DST_COLOR:
144 return "dest color";
145
146 case MALI_DOMINANT_UNK4:
147 return "unk4";
148
149 case MALI_DOMINANT_SRC_ALPHA:
150 return "source alpha";
151
152 case MALI_DOMINANT_DST_ALPHA:
153 return "dest alpha";
154
155 case MALI_DOMINANT_CONSTANT:
156 return "constant";
157 }
158
159 return "unreachable";
160 }
161
162 static const char *
163 panfrost_modifier_name(enum mali_blend_modifier mod)
164 {
165 switch (mod) {
166 case MALI_BLEND_MOD_UNK0:
167 return "unk0";
168
169 case MALI_BLEND_MOD_NORMAL:
170 return "normal";
171
172 case MALI_BLEND_MOD_SOURCE_ONE:
173 return "source one";
174
175 case MALI_BLEND_MOD_DEST_ONE:
176 return "dest one";
177 }
178
179 return "unreachable";
180 }
181
182 static void
183 panfrost_print_fixed_part(const char *name, unsigned u)
184 {
185 struct mali_blend_mode part;
186 memcpy(&part, &u, sizeof(part));
187
188 printf("%s blend mode (%X):\n", name, u);
189
190 printf(" %s dominant:\n",
191 (part.dominant == MALI_BLEND_DOM_SOURCE) ? "source" : "destination");
192
193 printf(" %s\n", panfrost_factor_name(part.dominant_factor));
194
195 if (part.complement_dominant)
196 printf(" complement\n");
197
198
199 printf(" nondominant %s\n",
200 (part.nondominant_mode == MALI_BLEND_NON_MIRROR) ? "mirror" : "zero");
201
202
203 printf(" mode: %s\n", panfrost_modifier_name(part.clip_modifier));
204
205 if (part.negate_source) printf(" negate source\n");
206
207 if (part.negate_dest) printf(" negate dest\n");
208
209 assert(!(part.unused_0 || part.unused_1));
210 }
211
212 void
213 panfrost_print_blend_equation(struct mali_blend_equation eq)
214 {
215 printf("\n");
216 panfrost_print_fixed_part("RGB", eq.rgb_mode);
217 panfrost_print_fixed_part("Alpha", eq.alpha_mode);
218
219 assert(!eq.zero1);
220
221 printf("Mask: %s%s%s%s\n",
222 (eq.color_mask & MALI_MASK_R) ? "R" : "",
223 (eq.color_mask & MALI_MASK_G) ? "G" : "",
224 (eq.color_mask & MALI_MASK_B) ? "B" : "",
225 (eq.color_mask & MALI_MASK_A) ? "A" : "");
226 }