1#include "util/format/u_format.h" 2#include "zink_format.h" 3 4static const VkFormat formats[PIPE_FORMAT_COUNT] = { 5#define MAP_FORMAT_NORM(FMT) \ 6 [PIPE_FORMAT_ ## FMT ## _UNORM] = VK_FORMAT_ ## FMT ## _UNORM, \ 7 [PIPE_FORMAT_ ## FMT ## _SNORM] = VK_FORMAT_ ## FMT ## _SNORM, 8 9#define MAP_FORMAT_SCALED(FMT) \ 10 [PIPE_FORMAT_ ## FMT ## _USCALED] = VK_FORMAT_ ## FMT ## _USCALED, \ 11 [PIPE_FORMAT_ ## FMT ## _SSCALED] = VK_FORMAT_ ## FMT ## _SSCALED, 12 13#define MAP_FORMAT_INT(FMT) \ 14 [PIPE_FORMAT_ ## FMT ## _UINT] = VK_FORMAT_ ## FMT ## _UINT, \ 15 [PIPE_FORMAT_ ## FMT ## _SINT] = VK_FORMAT_ ## FMT ## _SINT, 16 17#define MAP_FORMAT_SRGB(FMT) \ 18 [PIPE_FORMAT_ ## FMT ## _SRGB] = VK_FORMAT_ ## FMT ## _SRGB, 19 20#define MAP_FORMAT_FLOAT(FMT) \ 21 [PIPE_FORMAT_ ## FMT ## _FLOAT] = VK_FORMAT_ ## FMT ## _SFLOAT, 22 23 // one component 24 25 // 8-bits 26 MAP_FORMAT_NORM(R8) 27 MAP_FORMAT_SCALED(R8) 28 MAP_FORMAT_INT(R8) 29 MAP_FORMAT_SRGB(R8) 30 // 16-bits 31 MAP_FORMAT_NORM(R16) 32 MAP_FORMAT_SCALED(R16) 33 MAP_FORMAT_INT(R16) 34 MAP_FORMAT_FLOAT(R16) 35 // 32-bits 36 MAP_FORMAT_INT(R32) 37 MAP_FORMAT_FLOAT(R32) 38 39 // two components 40 41 // 8-bits 42 MAP_FORMAT_NORM(R8G8) 43 MAP_FORMAT_SCALED(R8G8) 44 MAP_FORMAT_INT(R8G8) 45 MAP_FORMAT_SRGB(R8G8) 46 // 16-bits 47 MAP_FORMAT_NORM(R16G16) 48 MAP_FORMAT_SCALED(R16G16) 49 MAP_FORMAT_INT(R16G16) 50 MAP_FORMAT_FLOAT(R16G16) 51 // 32-bits 52 MAP_FORMAT_INT(R32G32) 53 MAP_FORMAT_FLOAT(R32G32) 54 55 // three components 56 57 // 8-bits 58 MAP_FORMAT_NORM(R8G8B8) 59 MAP_FORMAT_SCALED(R8G8B8) 60 MAP_FORMAT_INT(R8G8B8) 61 MAP_FORMAT_SRGB(R8G8B8) 62 MAP_FORMAT_NORM(B8G8R8) 63 MAP_FORMAT_SCALED(B8G8R8) 64 MAP_FORMAT_INT(B8G8R8) 65 MAP_FORMAT_SRGB(B8G8R8) 66 // 16-bits 67 MAP_FORMAT_NORM(R16G16B16) 68 MAP_FORMAT_SCALED(R16G16B16) 69 MAP_FORMAT_INT(R16G16B16) 70 MAP_FORMAT_FLOAT(R16G16B16) 71 // 32-bits 72 MAP_FORMAT_INT(R32G32B32) 73 MAP_FORMAT_FLOAT(R32G32B32) 74 75 // four components 76 77 // 8-bits 78 MAP_FORMAT_NORM(R8G8B8A8) 79 MAP_FORMAT_SCALED(R8G8B8A8) 80 MAP_FORMAT_INT(R8G8B8A8) 81 MAP_FORMAT_NORM(B8G8R8A8) 82 MAP_FORMAT_SCALED(B8G8R8A8) 83 MAP_FORMAT_INT(B8G8R8A8) 84 MAP_FORMAT_SRGB(B8G8R8A8) 85 [PIPE_FORMAT_RGBA8888_SRGB] = VK_FORMAT_A8B8G8R8_SRGB_PACK32, 86 // 16-bits 87 MAP_FORMAT_NORM(R16G16B16A16) 88 MAP_FORMAT_SCALED(R16G16B16A16) 89 MAP_FORMAT_INT(R16G16B16A16) 90 MAP_FORMAT_FLOAT(R16G16B16A16) 91 // 32-bits 92 MAP_FORMAT_INT(R32G32B32A32) 93 MAP_FORMAT_FLOAT(R32G32B32A32) 94 95 // other color formats 96 [PIPE_FORMAT_A4B4G4R4_UNORM] = VK_FORMAT_R4G4B4A4_UNORM_PACK16, 97 [PIPE_FORMAT_A4R4G4B4_UNORM] = VK_FORMAT_B4G4R4A4_UNORM_PACK16, 98 [PIPE_FORMAT_B4G4R4A4_UNORM] = VK_FORMAT_A4R4G4B4_UNORM_PACK16, 99 [PIPE_FORMAT_R4G4B4A4_UNORM] = VK_FORMAT_A4B4G4R4_UNORM_PACK16, 100 [PIPE_FORMAT_B5G6R5_UNORM] = VK_FORMAT_R5G6B5_UNORM_PACK16, 101 [PIPE_FORMAT_R5G6B5_UNORM] = VK_FORMAT_B5G6R5_UNORM_PACK16, 102 103 [PIPE_FORMAT_A1B5G5R5_UNORM] = VK_FORMAT_R5G5B5A1_UNORM_PACK16, 104 [PIPE_FORMAT_A1R5G5B5_UNORM] = VK_FORMAT_B5G5R5A1_UNORM_PACK16, 105 [PIPE_FORMAT_B5G5R5A1_UNORM] = VK_FORMAT_A1R5G5B5_UNORM_PACK16, 106 107 [PIPE_FORMAT_R11G11B10_FLOAT] = VK_FORMAT_B10G11R11_UFLOAT_PACK32, 108 [PIPE_FORMAT_R9G9B9E5_FLOAT] = VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, 109 /* ARB_vertex_type_2_10_10_10 */ 110 [PIPE_FORMAT_R10G10B10A2_UNORM] = VK_FORMAT_A2B10G10R10_UNORM_PACK32, 111 [PIPE_FORMAT_R10G10B10A2_SNORM] = VK_FORMAT_A2B10G10R10_SNORM_PACK32, 112 [PIPE_FORMAT_B10G10R10A2_UNORM] = VK_FORMAT_A2R10G10B10_UNORM_PACK32, 113 [PIPE_FORMAT_B10G10R10A2_SNORM] = VK_FORMAT_A2R10G10B10_SNORM_PACK32, 114 [PIPE_FORMAT_R10G10B10A2_USCALED] = VK_FORMAT_A2B10G10R10_USCALED_PACK32, 115 [PIPE_FORMAT_R10G10B10A2_SSCALED] = VK_FORMAT_A2B10G10R10_SSCALED_PACK32, 116 [PIPE_FORMAT_B10G10R10A2_USCALED] = VK_FORMAT_A2R10G10B10_USCALED_PACK32, 117 [PIPE_FORMAT_B10G10R10A2_SSCALED] = VK_FORMAT_A2R10G10B10_SSCALED_PACK32, 118 [PIPE_FORMAT_R10G10B10A2_UINT] = VK_FORMAT_A2B10G10R10_UINT_PACK32, 119 [PIPE_FORMAT_B10G10R10A2_UINT] = VK_FORMAT_A2R10G10B10_UINT_PACK32, 120 [PIPE_FORMAT_B10G10R10A2_SINT] = VK_FORMAT_A2R10G10B10_SINT_PACK32, 121 122 // depth/stencil formats 123 [PIPE_FORMAT_Z32_FLOAT] = VK_FORMAT_D32_SFLOAT, 124 [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = VK_FORMAT_D32_SFLOAT_S8_UINT, 125 [PIPE_FORMAT_Z16_UNORM] = VK_FORMAT_D16_UNORM, 126 [PIPE_FORMAT_Z16_UNORM_S8_UINT] = VK_FORMAT_D16_UNORM_S8_UINT, 127 [PIPE_FORMAT_Z24X8_UNORM] = VK_FORMAT_X8_D24_UNORM_PACK32, 128 [PIPE_FORMAT_Z24_UNORM_S8_UINT] = VK_FORMAT_D24_UNORM_S8_UINT, 129 [PIPE_FORMAT_S8_UINT] = VK_FORMAT_S8_UINT, 130 131 // compressed formats 132 [PIPE_FORMAT_DXT1_RGB] = VK_FORMAT_BC1_RGB_UNORM_BLOCK, 133 [PIPE_FORMAT_DXT1_RGBA] = VK_FORMAT_BC1_RGBA_UNORM_BLOCK, 134 [PIPE_FORMAT_DXT3_RGBA] = VK_FORMAT_BC2_UNORM_BLOCK, 135 [PIPE_FORMAT_DXT5_RGBA] = VK_FORMAT_BC3_UNORM_BLOCK, 136 [PIPE_FORMAT_DXT1_SRGB] = VK_FORMAT_BC1_RGB_SRGB_BLOCK, 137 [PIPE_FORMAT_DXT1_SRGBA] = VK_FORMAT_BC1_RGBA_SRGB_BLOCK, 138 [PIPE_FORMAT_DXT3_SRGBA] = VK_FORMAT_BC2_SRGB_BLOCK, 139 [PIPE_FORMAT_DXT5_SRGBA] = VK_FORMAT_BC3_SRGB_BLOCK, 140 141 [PIPE_FORMAT_RGTC1_UNORM] = VK_FORMAT_BC4_UNORM_BLOCK, 142 [PIPE_FORMAT_RGTC1_SNORM] = VK_FORMAT_BC4_SNORM_BLOCK, 143 [PIPE_FORMAT_RGTC2_UNORM] = VK_FORMAT_BC5_UNORM_BLOCK, 144 [PIPE_FORMAT_RGTC2_SNORM] = VK_FORMAT_BC5_SNORM_BLOCK, 145 [PIPE_FORMAT_BPTC_RGBA_UNORM] = VK_FORMAT_BC7_UNORM_BLOCK, 146 [PIPE_FORMAT_BPTC_SRGBA] = VK_FORMAT_BC7_SRGB_BLOCK, 147 [PIPE_FORMAT_BPTC_RGB_FLOAT] = VK_FORMAT_BC6H_SFLOAT_BLOCK, 148 [PIPE_FORMAT_BPTC_RGB_UFLOAT] = VK_FORMAT_BC6H_UFLOAT_BLOCK, 149}; 150 151enum pipe_format 152zink_decompose_vertex_format(enum pipe_format format) 153{ 154 const struct util_format_description *desc = util_format_description(format); 155 unsigned first_non_void = util_format_get_first_non_void_channel(format); 156 enum pipe_format new_format; 157 assert(first_non_void == 0); 158 if (!desc->is_array) 159 return PIPE_FORMAT_NONE; 160 if (desc->is_unorm) { 161 enum pipe_format unorm_formats[] = { 162 PIPE_FORMAT_R8_UNORM, 163 PIPE_FORMAT_R16_UNORM, 164 PIPE_FORMAT_R32_UNORM 165 }; 166 return unorm_formats[desc->channel[first_non_void].size >> 4]; 167 } else if (desc->is_snorm) { 168 enum pipe_format snorm_formats[] = { 169 PIPE_FORMAT_R8_SNORM, 170 PIPE_FORMAT_R16_SNORM, 171 PIPE_FORMAT_R32_SNORM 172 }; 173 return snorm_formats[desc->channel[first_non_void].size >> 4]; 174 } else { 175 enum pipe_format uint_formats[][3] = { 176 {PIPE_FORMAT_R8_USCALED, PIPE_FORMAT_R16_USCALED, PIPE_FORMAT_R32_USCALED}, 177 {PIPE_FORMAT_R8_UINT, PIPE_FORMAT_R16_UINT, PIPE_FORMAT_R32_UINT}, 178 }; 179 enum pipe_format sint_formats[][3] = { 180 {PIPE_FORMAT_R8_SSCALED, PIPE_FORMAT_R16_SSCALED, PIPE_FORMAT_R32_SSCALED}, 181 {PIPE_FORMAT_R8_SINT, PIPE_FORMAT_R16_SINT, PIPE_FORMAT_R32_SINT}, 182 }; 183 switch (desc->channel[first_non_void].type) { 184 case UTIL_FORMAT_TYPE_UNSIGNED: 185 return uint_formats[desc->channel[first_non_void].pure_integer][desc->channel[first_non_void].size >> 4]; 186 case UTIL_FORMAT_TYPE_SIGNED: 187 return sint_formats[desc->channel[first_non_void].pure_integer][desc->channel[first_non_void].size >> 4]; 188 case UTIL_FORMAT_TYPE_FLOAT: 189 return desc->channel[first_non_void].size == 16 ? PIPE_FORMAT_R16_FLOAT : PIPE_FORMAT_R32_FLOAT; 190 break; 191 default: 192 return PIPE_FORMAT_NONE; 193 } 194 } 195 return new_format; 196} 197 198VkFormat 199zink_pipe_format_to_vk_format(enum pipe_format format) 200{ 201 return formats[format]; 202} 203 204 205bool 206zink_format_is_voidable_rgba_variant(enum pipe_format format) 207{ 208 const struct util_format_description *desc = util_format_description(format); 209 unsigned chan; 210 211 if(desc->block.width != 1 || 212 desc->block.height != 1 || 213 (desc->block.bits != 32 && desc->block.bits != 64)) 214 return false; 215 216 if (desc->nr_channels != 4) 217 return false; 218 219 unsigned size = desc->channel[0].size; 220 for(chan = 0; chan < 4; ++chan) { 221 if(desc->channel[chan].size != size) 222 return false; 223 } 224 225 return true; 226} 227