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
34char *pandecode_format_name(enum mali_format format)
35{
36	static char unk_format_str[5];
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(VARYING_POS);
53	DEFINE_CASE(VARYING_DISCARD);
54
55	DEFINE_CASE(R8_SNORM);
56	DEFINE_CASE(R16_SNORM);
57	DEFINE_CASE(R32_SNORM);
58	DEFINE_CASE(RG8_SNORM);
59	DEFINE_CASE(RG16_SNORM);
60	DEFINE_CASE(RG32_SNORM);
61	DEFINE_CASE(RGB8_SNORM);
62	DEFINE_CASE(RGB16_SNORM);
63	DEFINE_CASE(RGB32_SNORM);
64	DEFINE_CASE(RGBA8_SNORM);
65	DEFINE_CASE(RGBA16_SNORM);
66	DEFINE_CASE(RGBA32_SNORM);
67
68	DEFINE_CASE(R8UI);
69	DEFINE_CASE(R16UI);
70	DEFINE_CASE(R32UI);
71	DEFINE_CASE(RG8UI);
72	DEFINE_CASE(RG16UI);
73	DEFINE_CASE(RG32UI);
74	DEFINE_CASE(RGB8UI);
75	DEFINE_CASE(RGB16UI);
76	DEFINE_CASE(RGB32UI);
77	DEFINE_CASE(RGBA8UI);
78	DEFINE_CASE(RGBA16UI);
79	DEFINE_CASE(RGBA32UI);
80
81	DEFINE_CASE(R8_UNORM);
82	DEFINE_CASE(R16_UNORM);
83	DEFINE_CASE(R32_UNORM);
84	DEFINE_CASE(R32F);
85	DEFINE_CASE(RG8_UNORM);
86	DEFINE_CASE(RG16_UNORM);
87	DEFINE_CASE(RG32_UNORM);
88	DEFINE_CASE(RG32F);
89	DEFINE_CASE(RGB8_UNORM);
90	DEFINE_CASE(RGB16_UNORM);
91	DEFINE_CASE(RGB32_UNORM);
92	DEFINE_CASE(RGB32F);
93	DEFINE_CASE(RGBA4_UNORM);
94	DEFINE_CASE(RGBA8_UNORM);
95	DEFINE_CASE(RGBA16_UNORM);
96	DEFINE_CASE(RGBA32_UNORM);
97	DEFINE_CASE(RGBA32F);
98
99	DEFINE_CASE(R8I);
100	DEFINE_CASE(R16I);
101	DEFINE_CASE(R32I);
102	DEFINE_CASE(RG8I);
103	DEFINE_CASE(R16F);
104	DEFINE_CASE(RG16I);
105	DEFINE_CASE(RG32I);
106	DEFINE_CASE(RG16F);
107	DEFINE_CASE(RGB8I);
108	DEFINE_CASE(RGB16I);
109	DEFINE_CASE(RGB32I);
110	DEFINE_CASE(RGB16F);
111	DEFINE_CASE(RGBA8I);
112	DEFINE_CASE(RGBA16I);
113	DEFINE_CASE(RGBA32I);
114	DEFINE_CASE(RGBA16F);
115
116	DEFINE_CASE(RGBA4);
117	DEFINE_CASE(RGBA8_2);
118	DEFINE_CASE(RGB10_A2_2);
119	default:
120	snprintf(unk_format_str, sizeof(unk_format_str), "0x%02x", format);
121	return unk_format_str;
122	}
123}
124
125#undef DEFINE_CASE
126
127/* Helper to dump fixed-function blend part for debugging */
128
129static const char *
130panfrost_factor_name(enum mali_dominant_factor factor)
131{
132        switch (factor) {
133        case MALI_DOMINANT_UNK0:
134                return "unk0";
135
136        case MALI_DOMINANT_ZERO:
137                return "zero";
138
139        case MALI_DOMINANT_SRC_COLOR:
140                return "source color";
141
142        case MALI_DOMINANT_DST_COLOR:
143                return "dest color";
144
145        case MALI_DOMINANT_UNK4:
146                return "unk4";
147
148        case MALI_DOMINANT_SRC_ALPHA:
149                return "source alpha";
150
151        case MALI_DOMINANT_DST_ALPHA:
152                return "dest alpha";
153
154        case MALI_DOMINANT_CONSTANT:
155                return "constant";
156        }
157
158        return "unreachable";
159}
160
161static const char *
162panfrost_modifier_name(enum mali_blend_modifier mod)
163{
164        switch (mod) {
165        case MALI_BLEND_MOD_UNK0:
166                return "unk0";
167
168        case MALI_BLEND_MOD_NORMAL:
169                return "normal";
170
171        case MALI_BLEND_MOD_SOURCE_ONE:
172                return "source one";
173
174        case MALI_BLEND_MOD_DEST_ONE:
175                return "dest one";
176        }
177
178        return "unreachable";
179}
180
181static void
182panfrost_print_fixed_part(const char *name, unsigned u)
183{
184        struct mali_blend_mode part;
185        memcpy(&part, &u, sizeof(part));
186
187        printf("%s blend mode (%X):\n", name, u);
188
189        printf(" %s dominant:\n",
190               (part.dominant == MALI_BLEND_DOM_SOURCE) ? "source" : "destination");
191
192        printf("   %s\n", panfrost_factor_name(part.dominant_factor));
193
194        if (part.complement_dominant)
195                printf("   complement\n");
196
197
198        printf(" nondominant %s\n",
199               (part.nondominant_mode == MALI_BLEND_NON_MIRROR) ? "mirror" : "zero");
200
201
202        printf(" mode: %s\n", panfrost_modifier_name(part.clip_modifier));
203
204        if (part.negate_source) printf(" negate source\n");
205
206        if (part.negate_dest) printf(" negate dest\n");
207
208        assert(!(part.unused_0 || part.unused_1));
209}
210
211void
212panfrost_print_blend_equation(struct mali_blend_equation eq)
213{
214        printf("\n");
215        panfrost_print_fixed_part("RGB", eq.rgb_mode);
216        panfrost_print_fixed_part("Alpha", eq.alpha_mode);
217
218        assert(!eq.zero1);
219
220        printf("Mask: %s%s%s%s\n",
221               (eq.color_mask & MALI_MASK_R) ? "R" : "",
222               (eq.color_mask & MALI_MASK_G) ? "G" : "",
223               (eq.color_mask & MALI_MASK_B) ? "B" : "",
224               (eq.color_mask & MALI_MASK_A) ? "A" : "");
225
226        printf("Constant: %f\n", eq.constant);
227}
228