blob: ce5895e036ce96de0515a4475b3a8bf1406960dd [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}},
Dave Houlton7a152562017-04-28 14:03:39 -0600170 {VK_FORMAT_D32_SFLOAT_S8_UINT, {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
Dave Houlton3c9fca72017-03-27 17:25:54 -0600171 {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:
Dave Houltona2dcecd2017-05-22 13:52:20 -0600545 case VK_FORMAT_S8_UINT:
Dave Houlton3c9fca72017-03-27 17:25:54 -0600546 case VK_FORMAT_R8G8_UINT:
547 case VK_FORMAT_R8G8B8_UINT:
548 case VK_FORMAT_R8G8B8A8_UINT:
549 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
550 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
551 case VK_FORMAT_R16_UINT:
552 case VK_FORMAT_R16G16_UINT:
553 case VK_FORMAT_R16G16B16_UINT:
554 case VK_FORMAT_R16G16B16A16_UINT:
555 case VK_FORMAT_R32_UINT:
556 case VK_FORMAT_R32G32_UINT:
557 case VK_FORMAT_R32G32B32_UINT:
558 case VK_FORMAT_R32G32B32A32_UINT:
559 case VK_FORMAT_R64_UINT:
560 case VK_FORMAT_R64G64_UINT:
561 case VK_FORMAT_R64G64B64_UINT:
562 case VK_FORMAT_R64G64B64A64_UINT:
563 case VK_FORMAT_B8G8R8_UINT:
564 case VK_FORMAT_B8G8R8A8_UINT:
565 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
566 is_uint = true;
567 break;
568 default:
569 break;
570 }
571
572 return is_uint;
573}
574
575// Return true if format is a signed integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600576VK_LAYER_EXPORT bool FormatIsSInt(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600577 bool is_sint = false;
578
579 switch (format) {
580 case VK_FORMAT_R8_SINT:
581 case VK_FORMAT_R8G8_SINT:
582 case VK_FORMAT_R8G8B8_SINT:
583 case VK_FORMAT_R8G8B8A8_SINT:
584 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
585 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
586 case VK_FORMAT_R16_SINT:
587 case VK_FORMAT_R16G16_SINT:
588 case VK_FORMAT_R16G16B16_SINT:
589 case VK_FORMAT_R16G16B16A16_SINT:
590 case VK_FORMAT_R32_SINT:
591 case VK_FORMAT_R32G32_SINT:
592 case VK_FORMAT_R32G32B32_SINT:
593 case VK_FORMAT_R32G32B32A32_SINT:
594 case VK_FORMAT_R64_SINT:
595 case VK_FORMAT_R64G64_SINT:
596 case VK_FORMAT_R64G64B64_SINT:
597 case VK_FORMAT_R64G64B64A64_SINT:
598 case VK_FORMAT_B8G8R8_SINT:
599 case VK_FORMAT_B8G8R8A8_SINT:
600 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
601 is_sint = true;
602 break;
603 default:
604 break;
605 }
606
607 return is_sint;
608}
609
610// Return true if format is a floating-point format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600611VK_LAYER_EXPORT bool FormatIsFloat(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600612 bool is_float = false;
613
614 switch (format) {
615 case VK_FORMAT_R16_SFLOAT:
616 case VK_FORMAT_R16G16_SFLOAT:
617 case VK_FORMAT_R16G16B16_SFLOAT:
618 case VK_FORMAT_R16G16B16A16_SFLOAT:
619 case VK_FORMAT_R32_SFLOAT:
620 case VK_FORMAT_R32G32_SFLOAT:
621 case VK_FORMAT_R32G32B32_SFLOAT:
622 case VK_FORMAT_R32G32B32A32_SFLOAT:
623 case VK_FORMAT_R64_SFLOAT:
624 case VK_FORMAT_R64G64_SFLOAT:
625 case VK_FORMAT_R64G64B64_SFLOAT:
626 case VK_FORMAT_R64G64B64A64_SFLOAT:
627 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
628 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
629 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
630 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
631 is_float = true;
632 break;
633 default:
634 break;
635 }
636
637 return is_float;
638}
639
640// Return true if format is in the SRGB colorspace
Dave Houlton1d2022c2017-03-29 11:43:58 -0600641VK_LAYER_EXPORT bool FormatIsSRGB(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600642 bool is_srgb = false;
643
644 switch (format) {
645 case VK_FORMAT_R8_SRGB:
646 case VK_FORMAT_R8G8_SRGB:
647 case VK_FORMAT_R8G8B8_SRGB:
648 case VK_FORMAT_R8G8B8A8_SRGB:
649 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
650 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
651 case VK_FORMAT_BC2_SRGB_BLOCK:
652 case VK_FORMAT_BC3_SRGB_BLOCK:
653 case VK_FORMAT_BC7_SRGB_BLOCK:
654 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
655 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
656 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
657 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
658 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
659 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
660 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
661 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
662 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
663 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
664 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
665 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
666 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
667 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
668 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
669 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
670 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
671 case VK_FORMAT_B8G8R8_SRGB:
672 case VK_FORMAT_B8G8R8A8_SRGB:
673 is_srgb = true;
674 break;
675 default:
676 break;
677 }
678
679 return is_srgb;
680}
681
Chris Forbes568cd692017-04-24 18:41:23 -0700682// Return true if format is a USCALED format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600683VK_LAYER_EXPORT bool FormatIsUScaled(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600684 bool is_uscaled = false;
685
686 switch (format) {
687 case VK_FORMAT_R8_USCALED:
688 case VK_FORMAT_R8G8_USCALED:
689 case VK_FORMAT_R8G8B8_USCALED:
690 case VK_FORMAT_B8G8R8_USCALED:
691 case VK_FORMAT_R8G8B8A8_USCALED:
692 case VK_FORMAT_B8G8R8A8_USCALED:
693 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
694 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
695 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
696 case VK_FORMAT_R16_USCALED:
697 case VK_FORMAT_R16G16_USCALED:
698 case VK_FORMAT_R16G16B16_USCALED:
699 case VK_FORMAT_R16G16B16A16_USCALED:
700 is_uscaled = true;
701 break;
702 default:
703 break;
704 }
705
706 return is_uscaled;
707}
708
Chris Forbes568cd692017-04-24 18:41:23 -0700709// Return true if format is a SSCALED format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600710VK_LAYER_EXPORT bool FormatIsSScaled(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600711 bool is_sscaled = false;
712
713 switch (format) {
714 case VK_FORMAT_R8_SSCALED:
715 case VK_FORMAT_R8G8_SSCALED:
716 case VK_FORMAT_R8G8B8_SSCALED:
717 case VK_FORMAT_B8G8R8_SSCALED:
718 case VK_FORMAT_R8G8B8A8_SSCALED:
719 case VK_FORMAT_B8G8R8A8_SSCALED:
720 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
721 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
722 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
723 case VK_FORMAT_R16_SSCALED:
724 case VK_FORMAT_R16G16_SSCALED:
725 case VK_FORMAT_R16G16B16_SSCALED:
726 case VK_FORMAT_R16G16B16A16_SSCALED:
727 is_sscaled = true;
728 break;
729 default:
730 break;
731 }
732
733 return is_sscaled;
734}
735
736// Return true if format is compressed
Dave Houlton1d2022c2017-03-29 11:43:58 -0600737VK_LAYER_EXPORT bool FormatIsCompressed(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600738 switch (format) {
739 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
740 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
741 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
742 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
743 case VK_FORMAT_BC2_UNORM_BLOCK:
744 case VK_FORMAT_BC2_SRGB_BLOCK:
745 case VK_FORMAT_BC3_UNORM_BLOCK:
746 case VK_FORMAT_BC3_SRGB_BLOCK:
747 case VK_FORMAT_BC4_UNORM_BLOCK:
748 case VK_FORMAT_BC4_SNORM_BLOCK:
749 case VK_FORMAT_BC5_UNORM_BLOCK:
750 case VK_FORMAT_BC5_SNORM_BLOCK:
751 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
752 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
753 case VK_FORMAT_BC7_UNORM_BLOCK:
754 case VK_FORMAT_BC7_SRGB_BLOCK:
755 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
756 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
757 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
758 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
759 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
760 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
761 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
762 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
763 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
764 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
765 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
766 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
767 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
768 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
769 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
770 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
771 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
772 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
773 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
774 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
775 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
776 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
777 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
778 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
779 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
780 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
781 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
782 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
783 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
784 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
785 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
786 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
787 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
788 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
789 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
790 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
791 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
792 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
793 return true;
794 default:
795 return false;
796 }
797}
798
799// Return compressed texel block sizes for block compressed formats
Dave Houlton1d2022c2017-03-29 11:43:58 -0600800VK_LAYER_EXPORT VkExtent3D FormatCompressedTexelBlockExtent(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600801 VkExtent3D block_size = {1, 1, 1};
802 switch (format) {
803 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
804 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
805 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
806 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
807 case VK_FORMAT_BC2_UNORM_BLOCK:
808 case VK_FORMAT_BC2_SRGB_BLOCK:
809 case VK_FORMAT_BC3_UNORM_BLOCK:
810 case VK_FORMAT_BC3_SRGB_BLOCK:
811 case VK_FORMAT_BC4_UNORM_BLOCK:
812 case VK_FORMAT_BC4_SNORM_BLOCK:
813 case VK_FORMAT_BC5_UNORM_BLOCK:
814 case VK_FORMAT_BC5_SNORM_BLOCK:
815 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
816 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
817 case VK_FORMAT_BC7_UNORM_BLOCK:
818 case VK_FORMAT_BC7_SRGB_BLOCK:
819 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
820 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
821 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
822 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
823 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
824 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
825 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
826 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
827 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
828 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
829 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
830 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
831 block_size = {4, 4, 1};
832 break;
833 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
834 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
835 block_size = {5, 4, 1};
836 break;
837 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
838 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
839 block_size = {5, 5, 1};
840 break;
841 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
842 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
843 block_size = {6, 5, 1};
844 break;
845 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
846 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
847 block_size = {6, 6, 1};
848 break;
849 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
850 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
851 block_size = {8, 5, 1};
852 break;
853 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
854 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
855 block_size = {8, 6, 1};
856 break;
857 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
858 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
859 block_size = {8, 8, 1};
860 break;
861 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
862 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
863 block_size = {10, 5, 1};
864 break;
865 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
866 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
867 block_size = {10, 6, 1};
868 break;
869 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
870 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
871 block_size = {10, 8, 1};
872 break;
873 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
874 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
875 block_size = {10, 10, 1};
876 break;
877 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
878 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
879 block_size = {12, 10, 1};
880 break;
881 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
882 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
883 block_size = {12, 12, 1};
884 break;
885 default:
886 break;
887 }
888 return block_size;
889}
890
891// Return format class of the specified format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600892VK_LAYER_EXPORT VkFormatCompatibilityClass FormatCompatibilityClass(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600893 auto item = vk_format_table.find(format);
894 if (item != vk_format_table.end()) {
895 return item->second.format_class;
896 }
897 return VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT;
898}
899
900// Return size, in bytes, of a pixel of the specified format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600901VK_LAYER_EXPORT size_t FormatSize(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600902 auto item = vk_format_table.find(format);
903 if (item != vk_format_table.end()) {
904 return item->second.size;
905 }
906 return 0;
907}
908
909// Return the number of channels for a given format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600910unsigned int FormatChannelCount(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600911 auto item = vk_format_table.find(format);
912 if (item != vk_format_table.end()) {
913 return item->second.channel_count;
914 }
915 return 0;
916}
917
918// Perform a zero-tolerant modulo operation
Dave Houlton1d2022c2017-03-29 11:43:58 -0600919VK_LAYER_EXPORT VkDeviceSize SafeModulo(VkDeviceSize dividend, VkDeviceSize divisor) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600920 VkDeviceSize result = 0;
921 if (divisor != 0) {
922 result = dividend % divisor;
923 }
924 return result;
925}