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