1 /* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */ 2 3 /* 4 * Copyright (C) 2012 Rob Clark <robclark (at) freedesktop.org> 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the next 14 * paragraph) shall be included in all copies or substantial portions of the 15 * Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 * SOFTWARE. 24 * 25 * Authors: 26 * Rob Clark <robclark (at) freedesktop.org> 27 */ 28 29 #include "pipe/p_defines.h" 30 #include "util/u_format.h" 31 32 #include "fd2_util.h" 33 34 enum a2xx_sq_surfaceformat 35 fd2_pipe2surface(enum pipe_format format) 36 { 37 switch (format) { 38 /* 8-bit buffers. */ 39 case PIPE_FORMAT_A8_UNORM: 40 case PIPE_FORMAT_A8_SNORM: 41 case PIPE_FORMAT_A8_UINT: 42 case PIPE_FORMAT_A8_SINT: 43 case PIPE_FORMAT_I8_UNORM: 44 case PIPE_FORMAT_I8_SNORM: 45 case PIPE_FORMAT_I8_UINT: 46 case PIPE_FORMAT_I8_SINT: 47 case PIPE_FORMAT_L8_UNORM: 48 case PIPE_FORMAT_L8_SNORM: 49 case PIPE_FORMAT_L8_UINT: 50 case PIPE_FORMAT_L8_SINT: 51 case PIPE_FORMAT_L8_SRGB: 52 case PIPE_FORMAT_R8_UNORM: 53 case PIPE_FORMAT_R8_SNORM: 54 case PIPE_FORMAT_R8_UINT: 55 case PIPE_FORMAT_R8_SINT: 56 return FMT_8; 57 58 /* 16-bit buffers. */ 59 case PIPE_FORMAT_B5G6R5_UNORM: 60 return FMT_5_6_5; 61 case PIPE_FORMAT_B5G5R5A1_UNORM: 62 case PIPE_FORMAT_B5G5R5X1_UNORM: 63 return FMT_1_5_5_5; 64 case PIPE_FORMAT_B4G4R4A4_UNORM: 65 case PIPE_FORMAT_B4G4R4X4_UNORM: 66 return FMT_4_4_4_4; 67 case PIPE_FORMAT_Z16_UNORM: 68 return FMT_16; 69 case PIPE_FORMAT_L8A8_UNORM: 70 case PIPE_FORMAT_L8A8_SNORM: 71 case PIPE_FORMAT_L8A8_UINT: 72 case PIPE_FORMAT_L8A8_SINT: 73 case PIPE_FORMAT_L8A8_SRGB: 74 case PIPE_FORMAT_R8G8_UNORM: 75 case PIPE_FORMAT_R8G8_SNORM: 76 case PIPE_FORMAT_R8G8_UINT: 77 case PIPE_FORMAT_R8G8_SINT: 78 return FMT_8_8; 79 case PIPE_FORMAT_R16_UNORM: 80 case PIPE_FORMAT_R16_SNORM: 81 case PIPE_FORMAT_R16_UINT: 82 case PIPE_FORMAT_R16_SINT: 83 case PIPE_FORMAT_A16_UNORM: 84 case PIPE_FORMAT_A16_SNORM: 85 case PIPE_FORMAT_A16_UINT: 86 case PIPE_FORMAT_A16_SINT: 87 case PIPE_FORMAT_L16_UNORM: 88 case PIPE_FORMAT_L16_SNORM: 89 case PIPE_FORMAT_L16_UINT: 90 case PIPE_FORMAT_L16_SINT: 91 case PIPE_FORMAT_I16_UNORM: 92 case PIPE_FORMAT_I16_SNORM: 93 case PIPE_FORMAT_I16_UINT: 94 case PIPE_FORMAT_I16_SINT: 95 return FMT_16; 96 case PIPE_FORMAT_R16_FLOAT: 97 case PIPE_FORMAT_A16_FLOAT: 98 case PIPE_FORMAT_L16_FLOAT: 99 case PIPE_FORMAT_I16_FLOAT: 100 return FMT_16_FLOAT; 101 102 /* 32-bit buffers. */ 103 case PIPE_FORMAT_A8B8G8R8_SRGB: 104 case PIPE_FORMAT_A8B8G8R8_UNORM: 105 case PIPE_FORMAT_A8R8G8B8_UNORM: 106 case PIPE_FORMAT_B8G8R8A8_SRGB: 107 case PIPE_FORMAT_B8G8R8A8_UNORM: 108 case PIPE_FORMAT_B8G8R8X8_UNORM: 109 case PIPE_FORMAT_R8G8B8A8_SNORM: 110 case PIPE_FORMAT_R8G8B8A8_UNORM: 111 case PIPE_FORMAT_R8G8B8X8_UNORM: 112 case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 113 case PIPE_FORMAT_X8B8G8R8_UNORM: 114 case PIPE_FORMAT_X8R8G8B8_UNORM: 115 case PIPE_FORMAT_R8G8B8_UNORM: 116 case PIPE_FORMAT_R8G8B8A8_SINT: 117 case PIPE_FORMAT_R8G8B8A8_UINT: 118 return FMT_8_8_8_8; 119 case PIPE_FORMAT_R10G10B10A2_UNORM: 120 case PIPE_FORMAT_R10G10B10X2_SNORM: 121 case PIPE_FORMAT_B10G10R10A2_UNORM: 122 case PIPE_FORMAT_B10G10R10A2_UINT: 123 case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 124 return FMT_2_10_10_10; 125 case PIPE_FORMAT_Z24X8_UNORM: 126 case PIPE_FORMAT_Z24_UNORM_S8_UINT: 127 return FMT_24_8; 128 case PIPE_FORMAT_R32_UINT: 129 case PIPE_FORMAT_R32_SINT: 130 case PIPE_FORMAT_A32_UINT: 131 case PIPE_FORMAT_A32_SINT: 132 case PIPE_FORMAT_L32_UINT: 133 case PIPE_FORMAT_L32_SINT: 134 case PIPE_FORMAT_I32_UINT: 135 case PIPE_FORMAT_I32_SINT: 136 return FMT_32; 137 case PIPE_FORMAT_R32_FLOAT: 138 case PIPE_FORMAT_A32_FLOAT: 139 case PIPE_FORMAT_L32_FLOAT: 140 case PIPE_FORMAT_I32_FLOAT: 141 case PIPE_FORMAT_Z32_FLOAT: 142 return FMT_32_FLOAT; 143 case PIPE_FORMAT_R16G16_FLOAT: 144 case PIPE_FORMAT_L16A16_FLOAT: 145 return FMT_16_16_FLOAT; 146 case PIPE_FORMAT_R16G16_UNORM: 147 case PIPE_FORMAT_R16G16_SNORM: 148 case PIPE_FORMAT_R16G16_UINT: 149 case PIPE_FORMAT_R16G16_SINT: 150 case PIPE_FORMAT_L16A16_UNORM: 151 case PIPE_FORMAT_L16A16_SNORM: 152 case PIPE_FORMAT_L16A16_UINT: 153 case PIPE_FORMAT_L16A16_SINT: 154 return FMT_16_16; 155 156 /* 64-bit buffers. */ 157 case PIPE_FORMAT_R16G16B16A16_UINT: 158 case PIPE_FORMAT_R16G16B16A16_SINT: 159 case PIPE_FORMAT_R16G16B16A16_UNORM: 160 case PIPE_FORMAT_R16G16B16A16_SNORM: 161 return FMT_16_16_16_16; 162 case PIPE_FORMAT_R16G16B16A16_FLOAT: 163 return FMT_16_16_16_16_FLOAT; 164 case PIPE_FORMAT_R32G32_FLOAT: 165 case PIPE_FORMAT_L32A32_FLOAT: 166 return FMT_32_32_FLOAT; 167 case PIPE_FORMAT_R32G32_SINT: 168 case PIPE_FORMAT_R32G32_UINT: 169 case PIPE_FORMAT_L32A32_UINT: 170 case PIPE_FORMAT_L32A32_SINT: 171 return FMT_32_32; 172 173 /* 96-bit buffers. */ 174 case PIPE_FORMAT_R32G32B32_FLOAT: 175 return FMT_32_32_32_FLOAT; 176 177 /* 128-bit buffers. */ 178 case PIPE_FORMAT_R32G32B32A32_SNORM: 179 case PIPE_FORMAT_R32G32B32A32_UNORM: 180 case PIPE_FORMAT_R32G32B32A32_SINT: 181 case PIPE_FORMAT_R32G32B32A32_UINT: 182 return FMT_32_32_32_32; 183 case PIPE_FORMAT_R32G32B32A32_FLOAT: 184 return FMT_32_32_32_32_FLOAT; 185 186 /* YUV buffers. */ 187 case PIPE_FORMAT_UYVY: 188 return FMT_Cr_Y1_Cb_Y0; 189 case PIPE_FORMAT_YUYV: 190 return FMT_Y1_Cr_Y0_Cb; 191 192 default: 193 return ~0; 194 } 195 } 196 197 enum a2xx_colorformatx 198 fd2_pipe2color(enum pipe_format format) 199 { 200 switch (format) { 201 /* 8-bit buffers. */ 202 case PIPE_FORMAT_A8_UNORM: 203 case PIPE_FORMAT_A8_SNORM: 204 case PIPE_FORMAT_A8_UINT: 205 case PIPE_FORMAT_A8_SINT: 206 case PIPE_FORMAT_I8_UNORM: 207 case PIPE_FORMAT_I8_SNORM: 208 case PIPE_FORMAT_I8_UINT: 209 case PIPE_FORMAT_I8_SINT: 210 case PIPE_FORMAT_L8_UNORM: 211 case PIPE_FORMAT_L8_SNORM: 212 case PIPE_FORMAT_L8_UINT: 213 case PIPE_FORMAT_L8_SINT: 214 case PIPE_FORMAT_L8_SRGB: 215 case PIPE_FORMAT_R8_UNORM: 216 case PIPE_FORMAT_R8_SNORM: 217 case PIPE_FORMAT_R8_UINT: 218 case PIPE_FORMAT_R8_SINT: 219 return COLORX_8; 220 221 /* 16-bit buffers. */ 222 case PIPE_FORMAT_B5G6R5_UNORM: 223 return COLORX_5_6_5; 224 case PIPE_FORMAT_B5G5R5A1_UNORM: 225 case PIPE_FORMAT_B5G5R5X1_UNORM: 226 return COLORX_1_5_5_5; 227 case PIPE_FORMAT_B4G4R4A4_UNORM: 228 case PIPE_FORMAT_B4G4R4X4_UNORM: 229 return COLORX_4_4_4_4; 230 case PIPE_FORMAT_L8A8_UNORM: 231 case PIPE_FORMAT_L8A8_SNORM: 232 case PIPE_FORMAT_L8A8_UINT: 233 case PIPE_FORMAT_L8A8_SINT: 234 case PIPE_FORMAT_L8A8_SRGB: 235 case PIPE_FORMAT_R8G8_UNORM: 236 case PIPE_FORMAT_R8G8_SNORM: 237 case PIPE_FORMAT_R8G8_UINT: 238 case PIPE_FORMAT_R8G8_SINT: 239 case PIPE_FORMAT_Z16_UNORM: 240 return COLORX_8_8; 241 case PIPE_FORMAT_R16_FLOAT: 242 case PIPE_FORMAT_A16_FLOAT: 243 case PIPE_FORMAT_L16_FLOAT: 244 case PIPE_FORMAT_I16_FLOAT: 245 return COLORX_16_FLOAT; 246 247 /* 32-bit buffers. */ 248 case PIPE_FORMAT_A8B8G8R8_SRGB: 249 case PIPE_FORMAT_A8B8G8R8_UNORM: 250 case PIPE_FORMAT_A8R8G8B8_UNORM: 251 case PIPE_FORMAT_B8G8R8A8_SRGB: 252 case PIPE_FORMAT_B8G8R8A8_UNORM: 253 case PIPE_FORMAT_B8G8R8X8_UNORM: 254 case PIPE_FORMAT_R8G8B8A8_SNORM: 255 case PIPE_FORMAT_R8G8B8A8_UNORM: 256 case PIPE_FORMAT_R8G8B8X8_UNORM: 257 case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 258 case PIPE_FORMAT_X8B8G8R8_UNORM: 259 case PIPE_FORMAT_X8R8G8B8_UNORM: 260 case PIPE_FORMAT_R8G8B8_UNORM: 261 case PIPE_FORMAT_R8G8B8A8_SINT: 262 case PIPE_FORMAT_R8G8B8A8_UINT: 263 case PIPE_FORMAT_Z24_UNORM_S8_UINT: 264 case PIPE_FORMAT_Z24X8_UNORM: 265 return COLORX_8_8_8_8; 266 case PIPE_FORMAT_R32_FLOAT: 267 case PIPE_FORMAT_A32_FLOAT: 268 case PIPE_FORMAT_L32_FLOAT: 269 case PIPE_FORMAT_I32_FLOAT: 270 case PIPE_FORMAT_Z32_FLOAT: 271 return COLORX_32_FLOAT; 272 case PIPE_FORMAT_R16G16_FLOAT: 273 case PIPE_FORMAT_L16A16_FLOAT: 274 return COLORX_16_16_FLOAT; 275 276 /* 64-bit buffers. */ 277 case PIPE_FORMAT_R16G16B16A16_FLOAT: 278 return COLORX_16_16_16_16_FLOAT; 279 case PIPE_FORMAT_R32G32_FLOAT: 280 case PIPE_FORMAT_L32A32_FLOAT: 281 return COLORX_32_32_FLOAT; 282 283 /* 128-bit buffers. */ 284 case PIPE_FORMAT_R32G32B32A32_FLOAT: 285 return COLORX_32_32_32_32_FLOAT; 286 287 default: 288 return ~0; 289 } 290 } 291 292 static inline enum sq_tex_swiz 293 tex_swiz(unsigned swiz) 294 { 295 switch (swiz) { 296 default: 297 case PIPE_SWIZZLE_X: return SQ_TEX_X; 298 case PIPE_SWIZZLE_Y: return SQ_TEX_Y; 299 case PIPE_SWIZZLE_Z: return SQ_TEX_Z; 300 case PIPE_SWIZZLE_W: return SQ_TEX_W; 301 case PIPE_SWIZZLE_0: return SQ_TEX_ZERO; 302 case PIPE_SWIZZLE_1: return SQ_TEX_ONE; 303 } 304 } 305 306 uint32_t 307 fd2_tex_swiz(enum pipe_format format, unsigned swizzle_r, unsigned swizzle_g, 308 unsigned swizzle_b, unsigned swizzle_a) 309 { 310 const struct util_format_description *desc = 311 util_format_description(format); 312 uint8_t swiz[] = { 313 swizzle_r, swizzle_g, swizzle_b, swizzle_a, 314 PIPE_SWIZZLE_0, PIPE_SWIZZLE_1, 315 PIPE_SWIZZLE_1, PIPE_SWIZZLE_1, 316 }; 317 318 return A2XX_SQ_TEX_3_SWIZ_X(tex_swiz(swiz[desc->swizzle[0]])) | 319 A2XX_SQ_TEX_3_SWIZ_Y(tex_swiz(swiz[desc->swizzle[1]])) | 320 A2XX_SQ_TEX_3_SWIZ_Z(tex_swiz(swiz[desc->swizzle[2]])) | 321 A2XX_SQ_TEX_3_SWIZ_W(tex_swiz(swiz[desc->swizzle[3]])); 322 } 323