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