1 /* 2 * Copyright (C) 2016 Rob Clark <robclark (at) freedesktop.org> 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 * Authors: 24 * Rob Clark <robclark (at) freedesktop.org> 25 */ 26 27 #include "pipe/p_defines.h" 28 #include "util/u_format.h" 29 30 #include "fd5_format.h" 31 32 33 /* Specifies the table of all the formats and their features. Also supplies 34 * the helpers that look up various data in those tables. 35 */ 36 37 struct fd5_format { 38 enum a5xx_vtx_fmt vtx; 39 enum a5xx_tex_fmt tex; 40 enum a5xx_color_fmt rb; 41 enum a3xx_color_swap swap; 42 boolean present; 43 }; 44 45 #define RB5_NONE ~0 46 47 /* vertex + texture */ 48 #define VT(pipe, fmt, rbfmt, swapfmt) \ 49 [PIPE_FORMAT_ ## pipe] = { \ 50 .present = 1, \ 51 .vtx = VFMT5_ ## fmt, \ 52 .tex = TFMT5_ ## fmt, \ 53 .rb = RB5_ ## rbfmt, \ 54 .swap = swapfmt \ 55 } 56 57 /* texture-only */ 58 #define _T(pipe, fmt, rbfmt, swapfmt) \ 59 [PIPE_FORMAT_ ## pipe] = { \ 60 .present = 1, \ 61 .vtx = ~0, \ 62 .tex = TFMT5_ ## fmt, \ 63 .rb = RB5_ ## rbfmt, \ 64 .swap = swapfmt \ 65 } 66 67 /* vertex-only */ 68 #define V_(pipe, fmt, rbfmt, swapfmt) \ 69 [PIPE_FORMAT_ ## pipe] = { \ 70 .present = 1, \ 71 .vtx = VFMT5_ ## fmt, \ 72 .tex = ~0, \ 73 .rb = RB5_ ## rbfmt, \ 74 .swap = swapfmt \ 75 } 76 77 static struct fd5_format formats[PIPE_FORMAT_COUNT] = { 78 /* 8-bit */ 79 VT(R8_UNORM, 8_UNORM, R8_UNORM, WZYX), 80 V_(R8_SNORM, 8_SNORM, NONE, WZYX), 81 VT(R8_UINT, 8_UINT, R8_UINT, WZYX), 82 VT(R8_SINT, 8_SINT, R8_SINT, WZYX), 83 V_(R8_USCALED, 8_UINT, NONE, WZYX), 84 V_(R8_SSCALED, 8_UINT, NONE, WZYX), 85 86 _T(A8_UNORM, 8_UNORM, NONE, WZYX), 87 _T(L8_UNORM, 8_UNORM, R8_UNORM, WZYX), 88 _T(I8_UNORM, 8_UNORM, NONE, WZYX), 89 90 // _T(A8_UINT, 8_UINT, NONE, WZYX), 91 // _T(A8_SINT, 8_SINT, NONE, WZYX), 92 // _T(L8_UINT, 8_UINT, NONE, WZYX), 93 // _T(L8_SINT, 8_SINT, NONE, WZYX), 94 // _T(I8_UINT, 8_UINT, NONE, WZYX), 95 // _T(I8_SINT, 8_SINT, NONE, WZYX), 96 97 // _T(S8_UINT, 8_UINT, R8_UNORM, WZYX), 98 99 /* 16-bit */ 100 VT(R16_UNORM, 16_UNORM, R16_UNORM, WZYX), 101 VT(R16_SNORM, 16_SNORM, R16_SNORM, WZYX), 102 VT(R16_UINT, 16_UINT, R16_UINT, WZYX), 103 VT(R16_SINT, 16_SINT, R16_SINT, WZYX), 104 V_(R16_USCALED, 16_UINT, NONE, WZYX), 105 V_(R16_SSCALED, 16_UINT, NONE, WZYX), 106 VT(R16_FLOAT, 16_FLOAT, R16_FLOAT, WZYX), 107 108 // _T(A16_UNORM, 16_UNORM, NONE, WZYX), 109 // _T(A16_SNORM, 16_SNORM, NONE, WZYX), 110 // _T(A16_UINT, 16_UINT, NONE, WZYX), 111 // _T(A16_SINT, 16_SINT, NONE, WZYX), 112 // _T(L16_UNORM, 16_UNORM, NONE, WZYX), 113 // _T(L16_SNORM, 16_SNORM, NONE, WZYX), 114 // _T(L16_UINT, 16_UINT, NONE, WZYX), 115 // _T(L16_SINT, 16_SINT, NONE, WZYX), 116 // _T(I16_UNORM, 16_UNORM, NONE, WZYX), 117 // _T(I16_SNORM, 16_SNORM, NONE, WZYX), 118 // _T(I16_UINT, 16_UINT, NONE, WZYX), 119 // _T(I16_SINT, 16_SINT, NONE, WZYX), 120 121 VT(R8G8_UNORM, 8_8_UNORM, R8G8_UNORM, WZYX), 122 VT(R8G8_SNORM, 8_8_SNORM, R8G8_SNORM, WZYX), 123 VT(R8G8_UINT, 8_8_UINT, R8G8_UINT, WZYX), 124 VT(R8G8_SINT, 8_8_SINT, R8G8_SINT, WZYX), 125 V_(R8G8_USCALED, 8_8_UINT, NONE, WZYX), 126 V_(R8G8_SSCALED, 8_8_SINT, NONE, WZYX), 127 128 // _T(L8A8_UINT, 8_8_UINT, NONE, WZYX), 129 // _T(L8A8_SINT, 8_8_SINT, NONE, WZYX), 130 131 _T(B5G6R5_UNORM, 5_6_5_UNORM, R5G6B5_UNORM, WXYZ), 132 _T(B5G5R5A1_UNORM, 5_5_5_1_UNORM, R5G5B5A1_UNORM, WXYZ), 133 _T(B5G5R5X1_UNORM, 5_5_5_1_UNORM, R5G5B5A1_UNORM, WXYZ), 134 _T(B4G4R4A4_UNORM, 4_4_4_4_UNORM, R4G4B4A4_UNORM, WXYZ), 135 136 /* 24-bit */ 137 V_(R8G8B8_UNORM, 8_8_8_UNORM, NONE, WZYX), 138 V_(R8G8B8_SNORM, 8_8_8_SNORM, NONE, WZYX), 139 V_(R8G8B8_UINT, 8_8_8_UINT, NONE, WZYX), 140 V_(R8G8B8_SINT, 8_8_8_SINT, NONE, WZYX), 141 V_(R8G8B8_USCALED, 8_8_8_UINT, NONE, WZYX), 142 V_(R8G8B8_SSCALED, 8_8_8_SINT, NONE, WZYX), 143 144 /* 32-bit */ 145 VT(R32_UINT, 32_UINT, R32_UINT, WZYX), 146 VT(R32_SINT, 32_SINT, R32_SINT, WZYX), 147 V_(R32_USCALED, 32_UINT, NONE, WZYX), 148 V_(R32_SSCALED, 32_UINT, NONE, WZYX), 149 VT(R32_FLOAT, 32_FLOAT, R32_FLOAT,WZYX), 150 V_(R32_FIXED, 32_FIXED, NONE, WZYX), 151 152 // _T(A32_UINT, 32_UINT, NONE, WZYX), 153 // _T(A32_SINT, 32_SINT, NONE, WZYX), 154 // _T(L32_UINT, 32_UINT, NONE, WZYX), 155 // _T(L32_SINT, 32_SINT, NONE, WZYX), 156 // _T(I32_UINT, 32_UINT, NONE, WZYX), 157 // _T(I32_SINT, 32_SINT, NONE, WZYX), 158 159 VT(R16G16_UNORM, 16_16_UNORM, R16G16_UNORM, WZYX), 160 VT(R16G16_SNORM, 16_16_SNORM, R16G16_SNORM, WZYX), 161 VT(R16G16_UINT, 16_16_UINT, R16G16_UINT, WZYX), 162 VT(R16G16_SINT, 16_16_SINT, R16G16_SINT, WZYX), 163 V_(R16G16_USCALED, 16_16_UINT, NONE, WZYX), 164 V_(R16G16_SSCALED, 16_16_SINT, NONE, WZYX), 165 VT(R16G16_FLOAT, 16_16_FLOAT, R16G16_FLOAT, WZYX), 166 167 // _T(L16A16_UNORM, 16_16_UNORM, NONE, WZYX), 168 // _T(L16A16_SNORM, 16_16_SNORM, NONE, WZYX), 169 // _T(L16A16_UINT, 16_16_UINT, NONE, WZYX), 170 // _T(L16A16_SINT, 16_16_SINT, NONE, WZYX), 171 172 VT(R8G8B8A8_UNORM, 8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX), 173 _T(R8G8B8X8_UNORM, 8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX), 174 _T(R8G8B8A8_SRGB, 8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX), 175 _T(R8G8B8X8_SRGB, 8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX), 176 V_(R8G8B8A8_SNORM, 8_8_8_8_SNORM, NONE, WZYX), 177 V_(R8G8B8A8_UINT, 8_8_8_8_UINT, R8G8B8A8_UINT, WZYX), 178 V_(R8G8B8A8_SINT, 8_8_8_8_SINT, NONE, WZYX), 179 V_(R8G8B8A8_USCALED, 8_8_8_8_UINT, NONE, WZYX), 180 V_(R8G8B8A8_SSCALED, 8_8_8_8_SINT, NONE, WZYX), 181 182 VT(B8G8R8A8_UNORM, 8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ), 183 _T(B8G8R8X8_UNORM, 8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ), 184 VT(B8G8R8A8_SRGB, 8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ), 185 _T(B8G8R8X8_SRGB, 8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ), 186 187 VT(A8B8G8R8_UNORM, 8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW), 188 _T(X8B8G8R8_UNORM, 8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW), 189 _T(A8B8G8R8_SRGB, 8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW), 190 _T(X8B8G8R8_SRGB, 8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW), 191 192 VT(A8R8G8B8_UNORM, 8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW), 193 _T(X8R8G8B8_UNORM, 8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW), 194 _T(A8R8G8B8_SRGB, 8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW), 195 _T(X8R8G8B8_SRGB, 8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW), 196 197 _T(R10G10B10A2_UNORM, 10_10_10_2_UNORM, NONE, WZYX), 198 _T(B10G10R10A2_UNORM, 10_10_10_2_UNORM, NONE, WXYZ), 199 _T(B10G10R10X2_UNORM, 10_10_10_2_UNORM, NONE, WXYZ), 200 // V_(R10G10B10A2_SNORM, 10_10_10_2_SNORM, NONE, WZYX), 201 // V_(B10G10R10A2_SNORM, 10_10_10_2_SNORM, NONE, WXYZ), 202 _T(R10G10B10A2_UINT, 10_10_10_2_UINT, R10G10B10A2_UINT, WZYX), 203 _T(B10G10R10A2_UINT, 10_10_10_2_UINT, R10G10B10A2_UINT, WXYZ), 204 // V_(R10G10B10A2_USCALED, 10_10_10_2_UINT, NONE, WZYX), 205 // V_(B10G10R10A2_USCALED, 10_10_10_2_UINT, NONE, WXYZ), 206 // V_(R10G10B10A2_SSCALED, 10_10_10_2_SINT, NONE, WZYX), 207 // V_(B10G10R10A2_SSCALED, 10_10_10_2_SINT, NONE, WXYZ), 208 209 _T(R11G11B10_FLOAT, 11_11_10_FLOAT, R11G11B10_FLOAT, WZYX), 210 _T(R9G9B9E5_FLOAT, 9_9_9_E5_FLOAT, NONE, WZYX), 211 212 _T(Z24X8_UNORM, X8Z24_UNORM, R8G8B8A8_UNORM, WZYX), 213 _T(Z24_UNORM_S8_UINT, X8Z24_UNORM, R8G8B8A8_UNORM, WZYX), 214 _T(Z32_FLOAT, 32_FLOAT, R8G8B8A8_UNORM, WZYX), 215 _T(Z32_FLOAT_S8X24_UINT, 32_FLOAT,R8G8B8A8_UNORM, WZYX), 216 217 /* 48-bit */ 218 V_(R16G16B16_UNORM, 16_16_16_UNORM, NONE, WZYX), 219 V_(R16G16B16_SNORM, 16_16_16_SNORM, NONE, WZYX), 220 V_(R16G16B16_UINT, 16_16_16_UINT, NONE, WZYX), 221 V_(R16G16B16_SINT, 16_16_16_SINT, NONE, WZYX), 222 V_(R16G16B16_USCALED, 16_16_16_UINT, NONE, WZYX), 223 V_(R16G16B16_SSCALED, 16_16_16_SINT, NONE, WZYX), 224 V_(R16G16B16_FLOAT, 16_16_16_FLOAT, NONE, WZYX), 225 226 /* 64-bit */ 227 V_(R16G16B16A16_UNORM, 16_16_16_16_UNORM, NONE, WZYX), 228 V_(R16G16B16X16_UNORM, 16_16_16_16_UNORM, NONE, WZYX), 229 V_(R16G16B16A16_SNORM, 16_16_16_16_SNORM, NONE, WZYX), 230 V_(R16G16B16X16_SNORM, 16_16_16_16_SNORM, NONE, WZYX), 231 V_(R16G16B16A16_UINT, 16_16_16_16_UINT, NONE, WZYX), 232 // _T(R16G16B16X16_UINT, 16_16_16_16_UINT, R16G16B16A16_UINT, WZYX), 233 V_(R16G16B16A16_SINT, 16_16_16_16_SINT, NONE, WZYX), 234 // _T(R16G16B16X16_SINT, 16_16_16_16_SINT, R16G16B16A16_SINT, WZYX), 235 V_(R16G16B16A16_USCALED, 16_16_16_16_UINT, NONE, WZYX), 236 V_(R16G16B16A16_SSCALED, 16_16_16_16_SINT, NONE, WZYX), 237 VT(R16G16B16A16_FLOAT, 16_16_16_16_FLOAT, R16G16B16A16_FLOAT, WZYX), 238 _T(R16G16B16X16_FLOAT, 16_16_16_16_FLOAT, R16G16B16A16_FLOAT, WZYX), 239 240 VT(R32G32_UINT, 32_32_UINT, R32G32_UINT, WZYX), 241 VT(R32G32_SINT, 32_32_SINT, R32G32_SINT, WZYX), 242 V_(R32G32_USCALED, 32_32_UINT, NONE, WZYX), 243 V_(R32G32_SSCALED, 32_32_SINT, NONE, WZYX), 244 VT(R32G32_FLOAT, 32_32_FLOAT, R32G32_FLOAT,WZYX), 245 V_(R32G32_FIXED, 32_32_FIXED, NONE, WZYX), 246 247 // _T(L32A32_UINT, 32_32_UINT, NONE, WZYX), 248 // _T(L32A32_SINT, 32_32_SINT, NONE, WZYX), 249 250 /* 96-bit */ 251 V_(R32G32B32_UINT, 32_32_32_UINT, NONE, WZYX), 252 V_(R32G32B32_SINT, 32_32_32_SINT, NONE, WZYX), 253 V_(R32G32B32_USCALED, 32_32_32_UINT, NONE, WZYX), 254 V_(R32G32B32_SSCALED, 32_32_32_SINT, NONE, WZYX), 255 V_(R32G32B32_FLOAT, 32_32_32_FLOAT, NONE, WZYX), 256 V_(R32G32B32_FIXED, 32_32_32_FIXED, NONE, WZYX), 257 258 /* 128-bit */ 259 VT(R32G32B32A32_UINT, 32_32_32_32_UINT, R32G32B32A32_UINT, WZYX), 260 _T(R32G32B32X32_UINT, 32_32_32_32_UINT, R32G32B32A32_UINT, WZYX), 261 VT(R32G32B32A32_SINT, 32_32_32_32_SINT, R32G32B32A32_SINT, WZYX), 262 _T(R32G32B32X32_SINT, 32_32_32_32_SINT, R32G32B32A32_SINT, WZYX), 263 V_(R32G32B32A32_USCALED, 32_32_32_32_UINT, NONE, WZYX), 264 V_(R32G32B32A32_SSCALED, 32_32_32_32_SINT, NONE, WZYX), 265 VT(R32G32B32A32_FLOAT, 32_32_32_32_FLOAT, R32G32B32A32_FLOAT, WZYX), 266 _T(R32G32B32X32_FLOAT, 32_32_32_32_FLOAT, R32G32B32A32_FLOAT, WZYX), 267 V_(R32G32B32A32_FIXED, 32_32_32_32_FIXED, NONE, WZYX), 268 269 /* compressed */ 270 // _T(ETC1_RGB8, ETC1, NONE, WZYX), 271 // _T(ETC2_RGB8, ETC2_RGB8, NONE, WZYX), 272 // _T(ETC2_SRGB8, ETC2_RGB8, NONE, WZYX), 273 // _T(ETC2_RGB8A1, ETC2_RGB8A1, NONE, WZYX), 274 // _T(ETC2_SRGB8A1, ETC2_RGB8A1, NONE, WZYX), 275 // _T(ETC2_RGBA8, ETC2_RGBA8, NONE, WZYX), 276 // _T(ETC2_SRGBA8, ETC2_RGBA8, NONE, WZYX), 277 // _T(ETC2_R11_UNORM, ETC2_R11_UNORM, NONE, WZYX), 278 // _T(ETC2_R11_SNORM, ETC2_R11_SNORM, NONE, WZYX), 279 // _T(ETC2_RG11_UNORM, ETC2_RG11_UNORM, NONE, WZYX), 280 // _T(ETC2_RG11_SNORM, ETC2_RG11_SNORM, NONE, WZYX), 281 282 // _T(DXT1_RGB, DXT1, NONE, WZYX), 283 // _T(DXT1_SRGB, DXT1, NONE, WZYX), 284 // _T(DXT1_RGBA, DXT1, NONE, WZYX), 285 // _T(DXT1_SRGBA, DXT1, NONE, WZYX), 286 // _T(DXT3_RGBA, DXT3, NONE, WZYX), 287 // _T(DXT3_SRGBA, DXT3, NONE, WZYX), 288 // _T(DXT5_RGBA, DXT5, NONE, WZYX), 289 // _T(DXT5_SRGBA, DXT5, NONE, WZYX), 290 291 // _T(BPTC_RGBA_UNORM, BPTC, NONE, WZYX), 292 // _T(BPTC_SRGBA, BPTC, NONE, WZYX), 293 // _T(BPTC_RGB_FLOAT, BPTC_FLOAT, NONE, WZYX), 294 // _T(BPTC_RGB_UFLOAT, BPTC_UFLOAT, NONE, WZYX), 295 296 // _T(RGTC1_UNORM, RGTC1_UNORM, NONE, WZYX), 297 // _T(RGTC1_SNORM, RGTC1_SNORM, NONE, WZYX), 298 // _T(RGTC2_UNORM, RGTC2_UNORM, NONE, WZYX), 299 // _T(RGTC2_SNORM, RGTC2_SNORM, NONE, WZYX), 300 // _T(LATC1_UNORM, RGTC1_UNORM, NONE, WZYX), 301 // _T(LATC1_SNORM, RGTC1_SNORM, NONE, WZYX), 302 // _T(LATC2_UNORM, RGTC2_UNORM, NONE, WZYX), 303 // _T(LATC2_SNORM, RGTC2_SNORM, NONE, WZYX), 304 305 // _T(ASTC_4x4, ASTC_4x4, NONE, WZYX), 306 // _T(ASTC_5x4, ASTC_5x4, NONE, WZYX), 307 // _T(ASTC_5x5, ASTC_5x5, NONE, WZYX), 308 // _T(ASTC_6x5, ASTC_6x5, NONE, WZYX), 309 // _T(ASTC_6x6, ASTC_6x6, NONE, WZYX), 310 // _T(ASTC_8x5, ASTC_8x5, NONE, WZYX), 311 // _T(ASTC_8x6, ASTC_8x6, NONE, WZYX), 312 // _T(ASTC_8x8, ASTC_8x8, NONE, WZYX), 313 // _T(ASTC_10x5, ASTC_10x5, NONE, WZYX), 314 // _T(ASTC_10x6, ASTC_10x6, NONE, WZYX), 315 // _T(ASTC_10x8, ASTC_10x8, NONE, WZYX), 316 // _T(ASTC_10x10, ASTC_10x10, NONE, WZYX), 317 // _T(ASTC_12x10, ASTC_12x10, NONE, WZYX), 318 // _T(ASTC_12x12, ASTC_12x12, NONE, WZYX), 319 320 // _T(ASTC_4x4_SRGB, ASTC_4x4, NONE, WZYX), 321 // _T(ASTC_5x4_SRGB, ASTC_5x4, NONE, WZYX), 322 // _T(ASTC_5x5_SRGB, ASTC_5x5, NONE, WZYX), 323 // _T(ASTC_6x5_SRGB, ASTC_6x5, NONE, WZYX), 324 // _T(ASTC_6x6_SRGB, ASTC_6x6, NONE, WZYX), 325 // _T(ASTC_8x5_SRGB, ASTC_8x5, NONE, WZYX), 326 // _T(ASTC_8x6_SRGB, ASTC_8x6, NONE, WZYX), 327 // _T(ASTC_8x8_SRGB, ASTC_8x8, NONE, WZYX), 328 // _T(ASTC_10x5_SRGB, ASTC_10x5, NONE, WZYX), 329 // _T(ASTC_10x6_SRGB, ASTC_10x6, NONE, WZYX), 330 // _T(ASTC_10x8_SRGB, ASTC_10x8, NONE, WZYX), 331 // _T(ASTC_10x10_SRGB, ASTC_10x10, NONE, WZYX), 332 // _T(ASTC_12x10_SRGB, ASTC_12x10, NONE, WZYX), 333 // _T(ASTC_12x12_SRGB, ASTC_12x12, NONE, WZYX), 334 }; 335 336 /* convert pipe format to vertex buffer format: */ 337 enum a5xx_vtx_fmt 338 fd5_pipe2vtx(enum pipe_format format) 339 { 340 if (!formats[format].present) 341 return ~0; 342 return formats[format].vtx; 343 } 344 345 /* convert pipe format to texture sampler format: */ 346 enum a5xx_tex_fmt 347 fd5_pipe2tex(enum pipe_format format) 348 { 349 if (!formats[format].present) 350 return ~0; 351 return formats[format].tex; 352 } 353 354 /* convert pipe format to MRT / copydest format used for render-target: */ 355 enum a5xx_color_fmt 356 fd5_pipe2color(enum pipe_format format) 357 { 358 if (!formats[format].present) 359 return ~0; 360 return formats[format].rb; 361 } 362 363 enum a3xx_color_swap 364 fd5_pipe2swap(enum pipe_format format) 365 { 366 if (!formats[format].present) 367 return WZYX; 368 return formats[format].swap; 369 } 370 371 // XXX possibly same as a4xx.. 372 enum a5xx_tex_fetchsize 373 fd5_pipe2fetchsize(enum pipe_format format) 374 { 375 if (format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT) 376 format = PIPE_FORMAT_Z32_FLOAT; 377 378 if (util_format_description(format)->layout == UTIL_FORMAT_LAYOUT_ASTC) 379 return TFETCH5_16_BYTE; 380 381 switch (util_format_get_blocksizebits(format) / util_format_get_blockwidth(format)) { 382 case 8: return TFETCH5_1_BYTE; 383 case 16: return TFETCH5_2_BYTE; 384 case 32: return TFETCH5_4_BYTE; 385 case 64: return TFETCH5_8_BYTE; 386 case 96: return TFETCH5_1_BYTE; /* Does this matter? */ 387 case 128: return TFETCH5_16_BYTE; 388 default: 389 debug_printf("Unknown block size for format %s: %d\n", 390 util_format_name(format), 391 util_format_get_blocksizebits(format)); 392 return TFETCH5_1_BYTE; 393 } 394 } 395 396 enum a5xx_depth_format 397 fd5_pipe2depth(enum pipe_format format) 398 { 399 switch (format) { 400 case PIPE_FORMAT_Z16_UNORM: 401 return DEPTH5_16; 402 case PIPE_FORMAT_Z24X8_UNORM: 403 case PIPE_FORMAT_Z24_UNORM_S8_UINT: 404 case PIPE_FORMAT_X8Z24_UNORM: 405 case PIPE_FORMAT_S8_UINT_Z24_UNORM: 406 return DEPTH5_24_8; 407 case PIPE_FORMAT_Z32_FLOAT: 408 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 409 return DEPTH5_32; 410 default: 411 return ~0; 412 } 413 } 414 415 static inline enum a5xx_tex_swiz 416 tex_swiz(unsigned swiz) 417 { 418 switch (swiz) { 419 default: 420 case PIPE_SWIZZLE_X: return A5XX_TEX_X; 421 case PIPE_SWIZZLE_Y: return A5XX_TEX_Y; 422 case PIPE_SWIZZLE_Z: return A5XX_TEX_Z; 423 case PIPE_SWIZZLE_W: return A5XX_TEX_W; 424 case PIPE_SWIZZLE_0: return A5XX_TEX_ZERO; 425 case PIPE_SWIZZLE_1: return A5XX_TEX_ONE; 426 } 427 } 428 429 uint32_t 430 fd5_tex_swiz(enum pipe_format format, unsigned swizzle_r, unsigned swizzle_g, 431 unsigned swizzle_b, unsigned swizzle_a) 432 { 433 const struct util_format_description *desc = 434 util_format_description(format); 435 unsigned char swiz[4] = { 436 swizzle_r, swizzle_g, swizzle_b, swizzle_a, 437 }, rswiz[4]; 438 439 util_format_compose_swizzles(desc->swizzle, swiz, rswiz); 440 441 return A5XX_TEX_CONST_0_SWIZ_X(tex_swiz(rswiz[0])) | 442 A5XX_TEX_CONST_0_SWIZ_Y(tex_swiz(rswiz[1])) | 443 A5XX_TEX_CONST_0_SWIZ_Z(tex_swiz(rswiz[2])) | 444 A5XX_TEX_CONST_0_SWIZ_W(tex_swiz(rswiz[3])); 445 } 446