blob: c02a01f586f14c2379d74432abe6e69ad6116f0c [file] [log] [blame]
Dave Houlton3c9fca72017-03-27 17:25:54 -06001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 * Author: Mark Lobodzinski <mark@lunarg.com>
18 * Author: Dave Houlton <daveh@lunarg.com>
19 *
20 */
21
22#include <string.h>
23#include <string>
24#include <vector>
25#include <map>
26#include "vulkan/vulkan.h"
27#include "vk_format_utils.h"
28
29struct VULKAN_FORMAT_INFO {
30 size_t size;
31 uint32_t channel_count;
32 VkFormatCompatibilityClass format_class;
33};
34
35// Disable auto-formatting for this large table
36// clang-format off
37
38// Set up data structure with number of bytes and number of channels for each Vulkan format
39const std::map<VkFormat, VULKAN_FORMAT_INFO> vk_format_table = {
40 {VK_FORMAT_UNDEFINED, {0, 0, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }},
41 {VK_FORMAT_R4G4_UNORM_PACK8, {1, 2, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
42 {VK_FORMAT_R4G4B4A4_UNORM_PACK16, {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
43 {VK_FORMAT_B4G4R4A4_UNORM_PACK16, {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
44 {VK_FORMAT_R5G6B5_UNORM_PACK16, {2, 3, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
45 {VK_FORMAT_B5G6R5_UNORM_PACK16, {2, 3, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
46 {VK_FORMAT_R5G5B5A1_UNORM_PACK16, {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
47 {VK_FORMAT_B5G5R5A1_UNORM_PACK16, {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
48 {VK_FORMAT_A1R5G5B5_UNORM_PACK16, {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
49 {VK_FORMAT_R8_UNORM, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
50 {VK_FORMAT_R8_SNORM, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
51 {VK_FORMAT_R8_USCALED, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
52 {VK_FORMAT_R8_SSCALED, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
53 {VK_FORMAT_R8_UINT, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
54 {VK_FORMAT_R8_SINT, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
55 {VK_FORMAT_R8_SRGB, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
56 {VK_FORMAT_R8G8_UNORM, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
57 {VK_FORMAT_R8G8_SNORM, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
58 {VK_FORMAT_R8G8_USCALED, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
59 {VK_FORMAT_R8G8_SSCALED, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
60 {VK_FORMAT_R8G8_UINT, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
61 {VK_FORMAT_R8G8_SINT, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
62 {VK_FORMAT_R8G8_SRGB, {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
63 {VK_FORMAT_R8G8B8_UNORM, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
64 {VK_FORMAT_R8G8B8_SNORM, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
65 {VK_FORMAT_R8G8B8_USCALED, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
66 {VK_FORMAT_R8G8B8_SSCALED, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
67 {VK_FORMAT_R8G8B8_UINT, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
68 {VK_FORMAT_R8G8B8_SINT, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
69 {VK_FORMAT_R8G8B8_SRGB, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
70 {VK_FORMAT_B8G8R8_UNORM, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
71 {VK_FORMAT_B8G8R8_SNORM, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
72 {VK_FORMAT_B8G8R8_USCALED, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
73 {VK_FORMAT_B8G8R8_SSCALED, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
74 {VK_FORMAT_B8G8R8_UINT, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
75 {VK_FORMAT_B8G8R8_SINT, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
76 {VK_FORMAT_B8G8R8_SRGB, {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
77 {VK_FORMAT_R8G8B8A8_UNORM, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
78 {VK_FORMAT_R8G8B8A8_SNORM, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
79 {VK_FORMAT_R8G8B8A8_USCALED, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
80 {VK_FORMAT_R8G8B8A8_SSCALED, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
81 {VK_FORMAT_R8G8B8A8_UINT, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
82 {VK_FORMAT_R8G8B8A8_SINT, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
83 {VK_FORMAT_R8G8B8A8_SRGB, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
84 {VK_FORMAT_B8G8R8A8_UNORM, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
85 {VK_FORMAT_B8G8R8A8_SNORM, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
86 {VK_FORMAT_B8G8R8A8_USCALED, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
87 {VK_FORMAT_B8G8R8A8_SSCALED, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
88 {VK_FORMAT_B8G8R8A8_UINT, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
89 {VK_FORMAT_B8G8R8A8_SINT, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
90 {VK_FORMAT_B8G8R8A8_SRGB, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
91 {VK_FORMAT_A8B8G8R8_UNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
92 {VK_FORMAT_A8B8G8R8_SNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
93 {VK_FORMAT_A8B8G8R8_USCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
94 {VK_FORMAT_A8B8G8R8_SSCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
95 {VK_FORMAT_A8B8G8R8_UINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
96 {VK_FORMAT_A8B8G8R8_SINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
97 {VK_FORMAT_A8B8G8R8_SRGB_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
98 {VK_FORMAT_A2R10G10B10_UNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
99 {VK_FORMAT_A2R10G10B10_SNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
100 {VK_FORMAT_A2R10G10B10_USCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
101 {VK_FORMAT_A2R10G10B10_SSCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
102 {VK_FORMAT_A2R10G10B10_UINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
103 {VK_FORMAT_A2R10G10B10_SINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
104 {VK_FORMAT_A2B10G10R10_UNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
105 {VK_FORMAT_A2B10G10R10_SNORM_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
106 {VK_FORMAT_A2B10G10R10_USCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
107 {VK_FORMAT_A2B10G10R10_SSCALED_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
108 {VK_FORMAT_A2B10G10R10_UINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
109 {VK_FORMAT_A2B10G10R10_SINT_PACK32, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
110 {VK_FORMAT_R16_UNORM, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
111 {VK_FORMAT_R16_SNORM, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
112 {VK_FORMAT_R16_USCALED, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
113 {VK_FORMAT_R16_SSCALED, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
114 {VK_FORMAT_R16_UINT, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
115 {VK_FORMAT_R16_SINT, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
116 {VK_FORMAT_R16_SFLOAT, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
117 {VK_FORMAT_R16G16_UNORM, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
118 {VK_FORMAT_R16G16_SNORM, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
119 {VK_FORMAT_R16G16_USCALED, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
120 {VK_FORMAT_R16G16_SSCALED, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
121 {VK_FORMAT_R16G16_UINT, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
122 {VK_FORMAT_R16G16_SINT, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
123 {VK_FORMAT_R16G16_SFLOAT, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
124 {VK_FORMAT_R16G16B16_UNORM, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
125 {VK_FORMAT_R16G16B16_SNORM, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
126 {VK_FORMAT_R16G16B16_USCALED, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
127 {VK_FORMAT_R16G16B16_SSCALED, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
128 {VK_FORMAT_R16G16B16_UINT, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
129 {VK_FORMAT_R16G16B16_SINT, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
130 {VK_FORMAT_R16G16B16_SFLOAT, {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
131 {VK_FORMAT_R16G16B16A16_UNORM, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
132 {VK_FORMAT_R16G16B16A16_SNORM, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
133 {VK_FORMAT_R16G16B16A16_USCALED, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
134 {VK_FORMAT_R16G16B16A16_SSCALED, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
135 {VK_FORMAT_R16G16B16A16_UINT, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
136 {VK_FORMAT_R16G16B16A16_SINT, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
137 {VK_FORMAT_R16G16B16A16_SFLOAT, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
138 {VK_FORMAT_R32_UINT, {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
139 {VK_FORMAT_R32_SINT, {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
140 {VK_FORMAT_R32_SFLOAT, {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
141 {VK_FORMAT_R32G32_UINT, {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
142 {VK_FORMAT_R32G32_SINT, {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
143 {VK_FORMAT_R32G32_SFLOAT, {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
144 {VK_FORMAT_R32G32B32_UINT, {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
145 {VK_FORMAT_R32G32B32_SINT, {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
146 {VK_FORMAT_R32G32B32_SFLOAT, {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
147 {VK_FORMAT_R32G32B32A32_UINT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
148 {VK_FORMAT_R32G32B32A32_SINT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
149 {VK_FORMAT_R32G32B32A32_SFLOAT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
150 {VK_FORMAT_R64_UINT, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
151 {VK_FORMAT_R64_SINT, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
152 {VK_FORMAT_R64_SFLOAT, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
153 {VK_FORMAT_R64G64_UINT, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
154 {VK_FORMAT_R64G64_SINT, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
155 {VK_FORMAT_R64G64_SFLOAT, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
156 {VK_FORMAT_R64G64B64_UINT, {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
157 {VK_FORMAT_R64G64B64_SINT, {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
158 {VK_FORMAT_R64G64B64_SFLOAT, {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
159 {VK_FORMAT_R64G64B64A64_UINT, {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
160 {VK_FORMAT_R64G64B64A64_SINT, {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
161 {VK_FORMAT_R64G64B64A64_SFLOAT, {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
162 {VK_FORMAT_B10G11R11_UFLOAT_PACK32, {4, 3, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
163 {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, {4, 3, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
164 {VK_FORMAT_D16_UNORM, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
Tony Barbourd7b9aeb2017-04-28 10:44:23 -0600165 {VK_FORMAT_X8_D24_UNORM_PACK32, {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
Dave Houlton3c9fca72017-03-27 17:25:54 -0600166 {VK_FORMAT_D32_SFLOAT, {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
167 {VK_FORMAT_S8_UINT, {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
168 {VK_FORMAT_D16_UNORM_S8_UINT, {3, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
169 {VK_FORMAT_D24_UNORM_S8_UINT, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
170 {VK_FORMAT_D32_SFLOAT_S8_UINT, {5, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
171 {VK_FORMAT_BC1_RGB_UNORM_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT}},
172 {VK_FORMAT_BC1_RGB_SRGB_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT}},
173 {VK_FORMAT_BC1_RGBA_UNORM_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT}},
174 {VK_FORMAT_BC1_RGBA_SRGB_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT}},
175 {VK_FORMAT_BC2_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT}},
176 {VK_FORMAT_BC2_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT}},
177 {VK_FORMAT_BC3_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT}},
178 {VK_FORMAT_BC3_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT}},
179 {VK_FORMAT_BC4_UNORM_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT}},
180 {VK_FORMAT_BC4_SNORM_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT}},
181 {VK_FORMAT_BC5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT}},
182 {VK_FORMAT_BC5_SNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT}},
183 {VK_FORMAT_BC6H_UFLOAT_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT}},
184 {VK_FORMAT_BC6H_SFLOAT_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT}},
185 {VK_FORMAT_BC7_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT}},
186 {VK_FORMAT_BC7_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT}},
187 {VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT}},
188 {VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT}},
189 {VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}},
190 {VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}},
191 {VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}},
192 {VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}},
193 {VK_FORMAT_EAC_R11_UNORM_BLOCK, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}},
194 {VK_FORMAT_EAC_R11_SNORM_BLOCK, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}},
195 {VK_FORMAT_EAC_R11G11_UNORM_BLOCK, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}},
196 {VK_FORMAT_EAC_R11G11_SNORM_BLOCK, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}},
197 {VK_FORMAT_ASTC_4x4_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}},
198 {VK_FORMAT_ASTC_4x4_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}},
199 {VK_FORMAT_ASTC_5x4_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}},
200 {VK_FORMAT_ASTC_5x4_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}},
201 {VK_FORMAT_ASTC_5x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}},
202 {VK_FORMAT_ASTC_5x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}},
203 {VK_FORMAT_ASTC_6x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}},
204 {VK_FORMAT_ASTC_6x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}},
205 {VK_FORMAT_ASTC_6x6_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}},
206 {VK_FORMAT_ASTC_6x6_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}},
207 {VK_FORMAT_ASTC_8x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}},
208 {VK_FORMAT_ASTC_8x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}},
209 {VK_FORMAT_ASTC_8x6_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}},
210 {VK_FORMAT_ASTC_8x6_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}},
211 {VK_FORMAT_ASTC_8x8_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}},
212 {VK_FORMAT_ASTC_8x8_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}},
213 {VK_FORMAT_ASTC_10x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}},
214 {VK_FORMAT_ASTC_10x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}},
215 {VK_FORMAT_ASTC_10x6_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
216 {VK_FORMAT_ASTC_10x6_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
217 {VK_FORMAT_ASTC_10x8_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
218 {VK_FORMAT_ASTC_10x8_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
219 {VK_FORMAT_ASTC_10x10_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
220 {VK_FORMAT_ASTC_10x10_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
221 {VK_FORMAT_ASTC_12x10_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
222 {VK_FORMAT_ASTC_12x10_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
223 {VK_FORMAT_ASTC_12x12_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}},
224 {VK_FORMAT_ASTC_12x12_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}},
225 {VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT }},
226 {VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
227 {VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
228 {VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
229 {VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
230 {VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
231 {VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
232 {VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
233};
234
235// Renable formatting
236// clang-format on
237
238// Return true if format is an ETC2 or EAC compressed texture format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600239VK_LAYER_EXPORT bool FormatIsCompressed_ETC2_EAC(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600240 bool found = false;
241
242 switch (format) {
243 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
244 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
245 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
246 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
247 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
248 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
249 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
250 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
251 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
252 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
253 found = true;
254 break;
255 default:
256 break;
257 }
258 return found;
259}
260
261// Return true if format is an ETC2 or EAC compressed texture format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600262VK_LAYER_EXPORT bool FormatIsCompressed_ASTC_LDR(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600263 bool found = false;
264
265 switch (format) {
266 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
267 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
268 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
269 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
270 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
271 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
272 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
273 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
274 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
275 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
276 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
277 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
278 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
279 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
280 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
281 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
282 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
283 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
284 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
285 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
286 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
287 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
288 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
289 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
290 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
291 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
292 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
293 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
294 found = true;
295 break;
296 default:
297 break;
298 }
299 return found;
300}
301
302// Return true if format is a BC compressed texture format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600303VK_LAYER_EXPORT bool FormatIsCompressed_BC(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600304 bool found = false;
305
306 switch (format) {
307 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
308 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
309 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
310 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
311 case VK_FORMAT_BC2_UNORM_BLOCK:
312 case VK_FORMAT_BC2_SRGB_BLOCK:
313 case VK_FORMAT_BC3_UNORM_BLOCK:
314 case VK_FORMAT_BC3_SRGB_BLOCK:
315 case VK_FORMAT_BC4_UNORM_BLOCK:
316 case VK_FORMAT_BC4_SNORM_BLOCK:
317 case VK_FORMAT_BC5_UNORM_BLOCK:
318 case VK_FORMAT_BC5_SNORM_BLOCK:
319 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
320 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
321 case VK_FORMAT_BC7_UNORM_BLOCK:
322 case VK_FORMAT_BC7_SRGB_BLOCK:
323 found = true;
324 break;
325 default:
326 break;
327 }
328 return found;
329}
330
331// Return true if format is a depth or stencil format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600332VK_LAYER_EXPORT bool FormatIsDepthOrStencil(VkFormat format) {
333 return (FormatIsDepthAndStencil(format) || FormatIsDepthOnly(format) || FormatIsStencilOnly(format));
Dave Houlton3c9fca72017-03-27 17:25:54 -0600334}
335
336// Return true if format contains depth and stencil information
Dave Houlton1d2022c2017-03-29 11:43:58 -0600337VK_LAYER_EXPORT bool FormatIsDepthAndStencil(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600338 bool is_ds = false;
339
340 switch (format) {
341 case VK_FORMAT_D16_UNORM_S8_UINT:
342 case VK_FORMAT_D24_UNORM_S8_UINT:
343 case VK_FORMAT_D32_SFLOAT_S8_UINT:
344 is_ds = true;
345 break;
346 default:
347 break;
348 }
349 return is_ds;
350}
351
352// Return true if format is a stencil-only format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600353VK_LAYER_EXPORT bool FormatIsStencilOnly(VkFormat format) { return (format == VK_FORMAT_S8_UINT); }
Dave Houlton3c9fca72017-03-27 17:25:54 -0600354
355// Return true if format is a depth-only format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600356VK_LAYER_EXPORT bool FormatIsDepthOnly(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600357 bool is_depth = false;
358
359 switch (format) {
360 case VK_FORMAT_D16_UNORM:
361 case VK_FORMAT_X8_D24_UNORM_PACK32:
362 case VK_FORMAT_D32_SFLOAT:
363 is_depth = true;
364 break;
365 default:
366 break;
367 }
368
369 return is_depth;
370}
371
372// Return true if format is of type NORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600373VK_LAYER_EXPORT bool FormatIsNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600374 bool is_norm = false;
375
376 switch (format) {
377 case VK_FORMAT_R4G4_UNORM_PACK8:
378 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
379 case VK_FORMAT_R5G6B5_UNORM_PACK16:
380 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
381 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
382 case VK_FORMAT_R8_UNORM:
383 case VK_FORMAT_R8_SNORM:
384 case VK_FORMAT_R8G8_UNORM:
385 case VK_FORMAT_R8G8_SNORM:
386 case VK_FORMAT_R8G8B8_UNORM:
387 case VK_FORMAT_R8G8B8_SNORM:
388 case VK_FORMAT_R8G8B8A8_UNORM:
389 case VK_FORMAT_R8G8B8A8_SNORM:
390 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
391 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
392 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
393 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
394 case VK_FORMAT_R16_UNORM:
395 case VK_FORMAT_R16_SNORM:
396 case VK_FORMAT_R16G16_UNORM:
397 case VK_FORMAT_R16G16_SNORM:
398 case VK_FORMAT_R16G16B16_UNORM:
399 case VK_FORMAT_R16G16B16_SNORM:
400 case VK_FORMAT_R16G16B16A16_UNORM:
401 case VK_FORMAT_R16G16B16A16_SNORM:
402 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
403 case VK_FORMAT_BC2_UNORM_BLOCK:
404 case VK_FORMAT_BC3_UNORM_BLOCK:
405 case VK_FORMAT_BC4_UNORM_BLOCK:
406 case VK_FORMAT_BC4_SNORM_BLOCK:
407 case VK_FORMAT_BC5_UNORM_BLOCK:
408 case VK_FORMAT_BC5_SNORM_BLOCK:
409 case VK_FORMAT_BC7_UNORM_BLOCK:
410 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
411 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
412 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
413 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
414 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
415 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
416 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
417 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
418 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
419 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
420 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
421 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
422 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
423 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
424 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
425 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
426 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
427 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
428 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
429 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
430 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
431 case VK_FORMAT_B5G6R5_UNORM_PACK16:
432 case VK_FORMAT_B8G8R8_UNORM:
433 case VK_FORMAT_B8G8R8_SNORM:
434 case VK_FORMAT_B8G8R8A8_UNORM:
435 case VK_FORMAT_B8G8R8A8_SNORM:
436 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
437 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
438 is_norm = true;
439 break;
440 default:
441 break;
442 }
443
444 return is_norm;
445};
446
447// Return true if format is of type UNORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600448VK_LAYER_EXPORT bool FormatIsUNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600449 bool is_unorm = false;
450
451 switch (format) {
452 case VK_FORMAT_R4G4_UNORM_PACK8:
453 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
454 case VK_FORMAT_R5G6B5_UNORM_PACK16:
455 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
456 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
457 case VK_FORMAT_R8_UNORM:
458 case VK_FORMAT_R8G8_UNORM:
459 case VK_FORMAT_R8G8B8_UNORM:
460 case VK_FORMAT_R8G8B8A8_UNORM:
461 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
462 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
463 case VK_FORMAT_R16_UNORM:
464 case VK_FORMAT_R16G16_UNORM:
465 case VK_FORMAT_R16G16B16_UNORM:
466 case VK_FORMAT_R16G16B16A16_UNORM:
467 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
468 case VK_FORMAT_BC2_UNORM_BLOCK:
469 case VK_FORMAT_BC3_UNORM_BLOCK:
470 case VK_FORMAT_BC4_UNORM_BLOCK:
471 case VK_FORMAT_BC5_UNORM_BLOCK:
472 case VK_FORMAT_BC7_UNORM_BLOCK:
473 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
474 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
475 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
476 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
477 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
478 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
479 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
480 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
481 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
482 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
483 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
484 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
485 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
486 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
487 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
488 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
489 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
490 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
491 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
492 case VK_FORMAT_B5G6R5_UNORM_PACK16:
493 case VK_FORMAT_B8G8R8_UNORM:
494 case VK_FORMAT_B8G8R8A8_UNORM:
495 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
496 is_unorm = true;
497 break;
498 default:
499 break;
500 }
501
502 return is_unorm;
503};
504
505// Return true if format is of type SNORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600506VK_LAYER_EXPORT bool FormatIsSNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600507 bool is_snorm = false;
508
509 switch (format) {
510 case VK_FORMAT_R8_SNORM:
511 case VK_FORMAT_R8G8_SNORM:
512 case VK_FORMAT_R8G8B8_SNORM:
513 case VK_FORMAT_R8G8B8A8_SNORM:
514 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
515 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
516 case VK_FORMAT_R16_SNORM:
517 case VK_FORMAT_R16G16_SNORM:
518 case VK_FORMAT_R16G16B16_SNORM:
519 case VK_FORMAT_R16G16B16A16_SNORM:
520 case VK_FORMAT_BC4_SNORM_BLOCK:
521 case VK_FORMAT_BC5_SNORM_BLOCK:
522 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
523 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
524 case VK_FORMAT_B8G8R8_SNORM:
525 case VK_FORMAT_B8G8R8A8_SNORM:
526 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
527 is_snorm = true;
528 break;
529 default:
530 break;
531 }
532
533 return is_snorm;
534};
535
536// Return true if format is an integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600537VK_LAYER_EXPORT bool FormatIsInt(VkFormat format) { return (FormatIsSInt(format) || FormatIsUInt(format)); }
Dave Houlton3c9fca72017-03-27 17:25:54 -0600538
539// Return true if format is an unsigned integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600540VK_LAYER_EXPORT bool FormatIsUInt(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600541 bool is_uint = false;
542
543 switch (format) {
544 case VK_FORMAT_R8_UINT:
545 case VK_FORMAT_R8G8_UINT:
546 case VK_FORMAT_R8G8B8_UINT:
547 case VK_FORMAT_R8G8B8A8_UINT:
548 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
549 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
550 case VK_FORMAT_R16_UINT:
551 case VK_FORMAT_R16G16_UINT:
552 case VK_FORMAT_R16G16B16_UINT:
553 case VK_FORMAT_R16G16B16A16_UINT:
554 case VK_FORMAT_R32_UINT:
555 case VK_FORMAT_R32G32_UINT:
556 case VK_FORMAT_R32G32B32_UINT:
557 case VK_FORMAT_R32G32B32A32_UINT:
558 case VK_FORMAT_R64_UINT:
559 case VK_FORMAT_R64G64_UINT:
560 case VK_FORMAT_R64G64B64_UINT:
561 case VK_FORMAT_R64G64B64A64_UINT:
562 case VK_FORMAT_B8G8R8_UINT:
563 case VK_FORMAT_B8G8R8A8_UINT:
564 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
565 is_uint = true;
566 break;
567 default:
568 break;
569 }
570
571 return is_uint;
572}
573
574// Return true if format is a signed integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600575VK_LAYER_EXPORT bool FormatIsSInt(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600576 bool is_sint = false;
577
578 switch (format) {
579 case VK_FORMAT_R8_SINT:
580 case VK_FORMAT_R8G8_SINT:
581 case VK_FORMAT_R8G8B8_SINT:
582 case VK_FORMAT_R8G8B8A8_SINT:
583 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
584 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
585 case VK_FORMAT_R16_SINT:
586 case VK_FORMAT_R16G16_SINT:
587 case VK_FORMAT_R16G16B16_SINT:
588 case VK_FORMAT_R16G16B16A16_SINT:
589 case VK_FORMAT_R32_SINT:
590 case VK_FORMAT_R32G32_SINT:
591 case VK_FORMAT_R32G32B32_SINT:
592 case VK_FORMAT_R32G32B32A32_SINT:
593 case VK_FORMAT_R64_SINT:
594 case VK_FORMAT_R64G64_SINT:
595 case VK_FORMAT_R64G64B64_SINT:
596 case VK_FORMAT_R64G64B64A64_SINT:
597 case VK_FORMAT_B8G8R8_SINT:
598 case VK_FORMAT_B8G8R8A8_SINT:
599 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
600 is_sint = true;
601 break;
602 default:
603 break;
604 }
605
606 return is_sint;
607}
608
609// Return true if format is a floating-point format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600610VK_LAYER_EXPORT bool FormatIsFloat(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600611 bool is_float = false;
612
613 switch (format) {
614 case VK_FORMAT_R16_SFLOAT:
615 case VK_FORMAT_R16G16_SFLOAT:
616 case VK_FORMAT_R16G16B16_SFLOAT:
617 case VK_FORMAT_R16G16B16A16_SFLOAT:
618 case VK_FORMAT_R32_SFLOAT:
619 case VK_FORMAT_R32G32_SFLOAT:
620 case VK_FORMAT_R32G32B32_SFLOAT:
621 case VK_FORMAT_R32G32B32A32_SFLOAT:
622 case VK_FORMAT_R64_SFLOAT:
623 case VK_FORMAT_R64G64_SFLOAT:
624 case VK_FORMAT_R64G64B64_SFLOAT:
625 case VK_FORMAT_R64G64B64A64_SFLOAT:
626 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
627 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
628 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
629 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
630 is_float = true;
631 break;
632 default:
633 break;
634 }
635
636 return is_float;
637}
638
639// Return true if format is in the SRGB colorspace
Dave Houlton1d2022c2017-03-29 11:43:58 -0600640VK_LAYER_EXPORT bool FormatIsSRGB(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600641 bool is_srgb = false;
642
643 switch (format) {
644 case VK_FORMAT_R8_SRGB:
645 case VK_FORMAT_R8G8_SRGB:
646 case VK_FORMAT_R8G8B8_SRGB:
647 case VK_FORMAT_R8G8B8A8_SRGB:
648 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
649 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
650 case VK_FORMAT_BC2_SRGB_BLOCK:
651 case VK_FORMAT_BC3_SRGB_BLOCK:
652 case VK_FORMAT_BC7_SRGB_BLOCK:
653 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
654 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
655 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
656 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
657 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
658 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
659 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
660 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
661 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
662 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
663 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
664 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
665 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
666 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
667 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
668 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
669 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
670 case VK_FORMAT_B8G8R8_SRGB:
671 case VK_FORMAT_B8G8R8A8_SRGB:
672 is_srgb = true;
673 break;
674 default:
675 break;
676 }
677
678 return is_srgb;
679}
680
Chris Forbes568cd692017-04-24 18:41:23 -0700681// Return true if format is a USCALED format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600682VK_LAYER_EXPORT bool FormatIsUScaled(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600683 bool is_uscaled = false;
684
685 switch (format) {
686 case VK_FORMAT_R8_USCALED:
687 case VK_FORMAT_R8G8_USCALED:
688 case VK_FORMAT_R8G8B8_USCALED:
689 case VK_FORMAT_B8G8R8_USCALED:
690 case VK_FORMAT_R8G8B8A8_USCALED:
691 case VK_FORMAT_B8G8R8A8_USCALED:
692 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
693 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
694 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
695 case VK_FORMAT_R16_USCALED:
696 case VK_FORMAT_R16G16_USCALED:
697 case VK_FORMAT_R16G16B16_USCALED:
698 case VK_FORMAT_R16G16B16A16_USCALED:
699 is_uscaled = true;
700 break;
701 default:
702 break;
703 }
704
705 return is_uscaled;
706}
707
Chris Forbes568cd692017-04-24 18:41:23 -0700708// Return true if format is a SSCALED format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600709VK_LAYER_EXPORT bool FormatIsSScaled(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600710 bool is_sscaled = false;
711
712 switch (format) {
713 case VK_FORMAT_R8_SSCALED:
714 case VK_FORMAT_R8G8_SSCALED:
715 case VK_FORMAT_R8G8B8_SSCALED:
716 case VK_FORMAT_B8G8R8_SSCALED:
717 case VK_FORMAT_R8G8B8A8_SSCALED:
718 case VK_FORMAT_B8G8R8A8_SSCALED:
719 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
720 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
721 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
722 case VK_FORMAT_R16_SSCALED:
723 case VK_FORMAT_R16G16_SSCALED:
724 case VK_FORMAT_R16G16B16_SSCALED:
725 case VK_FORMAT_R16G16B16A16_SSCALED:
726 is_sscaled = true;
727 break;
728 default:
729 break;
730 }
731
732 return is_sscaled;
733}
734
735// Return true if format is compressed
Dave Houlton1d2022c2017-03-29 11:43:58 -0600736VK_LAYER_EXPORT bool FormatIsCompressed(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600737 switch (format) {
738 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
739 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
740 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
741 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
742 case VK_FORMAT_BC2_UNORM_BLOCK:
743 case VK_FORMAT_BC2_SRGB_BLOCK:
744 case VK_FORMAT_BC3_UNORM_BLOCK:
745 case VK_FORMAT_BC3_SRGB_BLOCK:
746 case VK_FORMAT_BC4_UNORM_BLOCK:
747 case VK_FORMAT_BC4_SNORM_BLOCK:
748 case VK_FORMAT_BC5_UNORM_BLOCK:
749 case VK_FORMAT_BC5_SNORM_BLOCK:
750 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
751 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
752 case VK_FORMAT_BC7_UNORM_BLOCK:
753 case VK_FORMAT_BC7_SRGB_BLOCK:
754 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
755 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
756 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
757 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
758 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
759 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
760 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
761 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
762 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
763 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
764 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
765 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
766 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
767 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
768 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
769 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
770 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
771 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
772 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
773 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
774 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
775 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
776 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
777 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
778 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
779 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
780 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
781 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
782 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
783 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
784 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
785 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
786 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
787 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
788 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
789 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
790 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
791 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
792 return true;
793 default:
794 return false;
795 }
796}
797
798// Return compressed texel block sizes for block compressed formats
Dave Houlton1d2022c2017-03-29 11:43:58 -0600799VK_LAYER_EXPORT VkExtent3D FormatCompressedTexelBlockExtent(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600800 VkExtent3D block_size = {1, 1, 1};
801 switch (format) {
802 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
803 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
804 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
805 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
806 case VK_FORMAT_BC2_UNORM_BLOCK:
807 case VK_FORMAT_BC2_SRGB_BLOCK:
808 case VK_FORMAT_BC3_UNORM_BLOCK:
809 case VK_FORMAT_BC3_SRGB_BLOCK:
810 case VK_FORMAT_BC4_UNORM_BLOCK:
811 case VK_FORMAT_BC4_SNORM_BLOCK:
812 case VK_FORMAT_BC5_UNORM_BLOCK:
813 case VK_FORMAT_BC5_SNORM_BLOCK:
814 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
815 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
816 case VK_FORMAT_BC7_UNORM_BLOCK:
817 case VK_FORMAT_BC7_SRGB_BLOCK:
818 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
819 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
820 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
821 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
822 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
823 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
824 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
825 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
826 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
827 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
828 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
829 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
830 block_size = {4, 4, 1};
831 break;
832 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
833 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
834 block_size = {5, 4, 1};
835 break;
836 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
837 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
838 block_size = {5, 5, 1};
839 break;
840 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
841 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
842 block_size = {6, 5, 1};
843 break;
844 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
845 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
846 block_size = {6, 6, 1};
847 break;
848 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
849 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
850 block_size = {8, 5, 1};
851 break;
852 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
853 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
854 block_size = {8, 6, 1};
855 break;
856 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
857 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
858 block_size = {8, 8, 1};
859 break;
860 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
861 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
862 block_size = {10, 5, 1};
863 break;
864 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
865 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
866 block_size = {10, 6, 1};
867 break;
868 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
869 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
870 block_size = {10, 8, 1};
871 break;
872 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
873 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
874 block_size = {10, 10, 1};
875 break;
876 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
877 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
878 block_size = {12, 10, 1};
879 break;
880 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
881 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
882 block_size = {12, 12, 1};
883 break;
884 default:
885 break;
886 }
887 return block_size;
888}
889
890// Return format class of the specified format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600891VK_LAYER_EXPORT VkFormatCompatibilityClass FormatCompatibilityClass(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600892 auto item = vk_format_table.find(format);
893 if (item != vk_format_table.end()) {
894 return item->second.format_class;
895 }
896 return VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT;
897}
898
899// Return size, in bytes, of a pixel of the specified format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600900VK_LAYER_EXPORT size_t FormatSize(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600901 auto item = vk_format_table.find(format);
902 if (item != vk_format_table.end()) {
903 return item->second.size;
904 }
905 return 0;
906}
907
908// Return the number of channels for a given format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600909unsigned int FormatChannelCount(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600910 auto item = vk_format_table.find(format);
911 if (item != vk_format_table.end()) {
912 return item->second.channel_count;
913 }
914 return 0;
915}
916
917// Perform a zero-tolerant modulo operation
Dave Houlton1d2022c2017-03-29 11:43:58 -0600918VK_LAYER_EXPORT VkDeviceSize SafeModulo(VkDeviceSize dividend, VkDeviceSize divisor) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600919 VkDeviceSize result = 0;
920 if (divisor != 0) {
921 result = dividend % divisor;
922 }
923 return result;
924}