blob: 2932633dc8641c79a7ae87ba5e36bb4b6b4ce75e [file] [log] [blame]
Jose-Emilio Munoz-Lopez2a017e32018-10-30 09:19:30 +00001/* Copyright (c) 2015-2019 The Khronos Group Inc.
2 * Copyright (c) 2015-2019 Valve Corporation
3 * Copyright (c) 2015-2019 LunarG, Inc.
Dave Houlton3c9fca72017-03-27 17:25:54 -06004 *
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}},
Dave Houlton0ef27492018-04-04 11:41:48 -0600192 {VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}},
Dave Houlton3c9fca72017-03-27 17:25:54 -0600193 {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}},
Dave Houlton23cdab92017-05-23 16:16:54 -0600225 {VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_2BPP_BIT}},
226 {VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_4BPP_BIT}},
227 {VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_2BPP_BIT}},
228 {VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT}},
229 {VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_2BPP_BIT}},
230 {VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_4BPP_BIT}},
231 {VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_2BPP_BIT}},
Dave Houltonc991cc92018-03-06 11:08:51 -0700232 {VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT}},
233 /* KHR_sampler_YCbCr_conversion */
234 {VK_FORMAT_G8B8G8R8_422_UNORM_KHR, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32BIT_G8B8G8R8}},
235 {VK_FORMAT_B8G8R8G8_422_UNORM_KHR, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32BIT_B8G8R8G8}},
Tony-LunarG7482ca92018-10-01 14:20:22 -0600236 {VK_FORMAT_R10X6_UNORM_PACK16_KHR, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
237 {VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
Dave Houltonc991cc92018-03-06 11:08:51 -0700238 {VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_R10G10B10A10}},
239 {VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G10B10G10R10}},
240 {VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B10G10R10G10}},
Tony-LunarG7482ca92018-10-01 14:20:22 -0600241 {VK_FORMAT_R12X4_UNORM_PACK16, {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
242 {VK_FORMAT_R12X4G12X4_UNORM_2PACK16, {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
Dave Houltonc991cc92018-03-06 11:08:51 -0700243 {VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_R12G12B12A12}},
244 {VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G12B12G12R12}},
245 {VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B12G12R12G12}},
246 {VK_FORMAT_G16B16G16R16_422_UNORM_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G16B16G16R16}},
Dave Houlton832325a2018-03-08 14:34:47 -0700247 {VK_FORMAT_B16G16R16G16_422_UNORM_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B16G16R16G16}}
248#if 0 // TBD - Figure out what 'size' means for multi-planar formats
Dave Houltonc991cc92018-03-06 11:08:51 -0700249 {VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_420}},
250 {VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_2PLANE_420}},
251 {VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_422}},
252 {VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_2PLANE_422}},
253 {VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_444}},
254 {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_420}},
255 {VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_2PLANE_420}},
256 {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_422}},
257 {VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_2PLANE_422}},
258 {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_444}},
259 {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_420}},
260 {VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_2PLANE_420}},
261 {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_422}},
262 {VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_2PLANE_422}},
263 {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_444}},
264 {VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_420}},
265 {VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_2PLANE_420}},
266 {VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_422}},
267 {VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_2PLANE_422}},
268 {VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_444}}
269#endif
Dave Houlton3c9fca72017-03-27 17:25:54 -0600270};
271
272// Renable formatting
273// clang-format on
274
275// Return true if format is an ETC2 or EAC compressed texture format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600276VK_LAYER_EXPORT bool FormatIsCompressed_ETC2_EAC(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600277 bool found = false;
278
279 switch (format) {
280 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
281 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
282 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
283 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
284 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
285 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
286 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
287 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
288 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
289 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
290 found = true;
291 break;
292 default:
293 break;
294 }
295 return found;
296}
297
Dave Houlton23cdab92017-05-23 16:16:54 -0600298// Return true if format is an ASTC compressed texture format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600299VK_LAYER_EXPORT bool FormatIsCompressed_ASTC_LDR(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600300 bool found = false;
301
302 switch (format) {
303 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
304 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
305 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
306 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
307 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
308 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
309 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
310 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
311 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
312 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
313 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
314 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
315 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
316 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
317 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
318 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
319 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
320 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
321 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
322 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
323 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
324 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
325 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
326 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
327 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
328 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
329 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
330 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
331 found = true;
332 break;
333 default:
334 break;
335 }
336 return found;
337}
338
339// Return true if format is a BC compressed texture format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600340VK_LAYER_EXPORT bool FormatIsCompressed_BC(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600341 bool found = false;
342
343 switch (format) {
344 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
345 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
346 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
347 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
348 case VK_FORMAT_BC2_UNORM_BLOCK:
349 case VK_FORMAT_BC2_SRGB_BLOCK:
350 case VK_FORMAT_BC3_UNORM_BLOCK:
351 case VK_FORMAT_BC3_SRGB_BLOCK:
352 case VK_FORMAT_BC4_UNORM_BLOCK:
353 case VK_FORMAT_BC4_SNORM_BLOCK:
354 case VK_FORMAT_BC5_UNORM_BLOCK:
355 case VK_FORMAT_BC5_SNORM_BLOCK:
356 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
357 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
358 case VK_FORMAT_BC7_UNORM_BLOCK:
359 case VK_FORMAT_BC7_SRGB_BLOCK:
360 found = true;
361 break;
362 default:
363 break;
364 }
365 return found;
366}
367
Dave Houlton23cdab92017-05-23 16:16:54 -0600368// Return true if format is a PVRTC compressed texture format
369VK_LAYER_EXPORT bool FormatIsCompressed_PVRTC(VkFormat format) {
370 bool found = false;
371
372 switch (format) {
373 case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
374 case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
375 case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
376 case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
377 case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
378 case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
379 case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
380 case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
381 found = true;
382 break;
383 default:
384 break;
385 }
386 return found;
387}
388
Dave Houltonc991cc92018-03-06 11:08:51 -0700389// Single-plane "_422" formats are treated as 2x1 compressed (for copies)
390VK_LAYER_EXPORT bool FormatIsSinglePlane_422(VkFormat format) {
391 bool found = false;
392
393 switch (format) {
394 case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
395 case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
396 case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
397 case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
398 case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
399 case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
400 case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
401 case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
402 found = true;
403 break;
404 default:
405 break;
406 }
407 return found;
408}
409
Dave Houlton23cdab92017-05-23 16:16:54 -0600410// Return true if format is compressed
411VK_LAYER_EXPORT bool FormatIsCompressed(VkFormat format) {
Dave Houltona9df0ce2018-02-07 10:51:23 -0700412 return (FormatIsCompressed_ASTC_LDR(format) || FormatIsCompressed_BC(format) || FormatIsCompressed_ETC2_EAC(format) ||
Dave Houlton23cdab92017-05-23 16:16:54 -0600413 FormatIsCompressed_PVRTC(format));
414}
Peter Kohautaef965c2018-07-12 09:19:33 +0200415// Return true if format is packed
416VK_LAYER_EXPORT bool FormatIsPacked(VkFormat format) {
417 bool found = false;
418
419 switch (format) {
420 case VK_FORMAT_R4G4_UNORM_PACK8:
421 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
422 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
423 case VK_FORMAT_R5G6B5_UNORM_PACK16:
424 case VK_FORMAT_B5G6R5_UNORM_PACK16:
425 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
426 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
427 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
428 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
429 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
430 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
431 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
432 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
433 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
434 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
435 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
436 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
437 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
438 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
439 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
440 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
441 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
442 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
443 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
444 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
445 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
446 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
447 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
448 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
449 case VK_FORMAT_X8_D24_UNORM_PACK32:
Peter Kohautaef965c2018-07-12 09:19:33 +0200450 found = true;
451 break;
452 default:
453 break;
454 }
455 return found;
456}
Dave Houlton23cdab92017-05-23 16:16:54 -0600457
Dave Houlton3c9fca72017-03-27 17:25:54 -0600458// Return true if format is a depth or stencil format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600459VK_LAYER_EXPORT bool FormatIsDepthOrStencil(VkFormat format) {
460 return (FormatIsDepthAndStencil(format) || FormatIsDepthOnly(format) || FormatIsStencilOnly(format));
Dave Houlton3c9fca72017-03-27 17:25:54 -0600461}
462
463// Return true if format contains depth and stencil information
Dave Houlton1d2022c2017-03-29 11:43:58 -0600464VK_LAYER_EXPORT bool FormatIsDepthAndStencil(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600465 bool is_ds = false;
466
467 switch (format) {
468 case VK_FORMAT_D16_UNORM_S8_UINT:
469 case VK_FORMAT_D24_UNORM_S8_UINT:
470 case VK_FORMAT_D32_SFLOAT_S8_UINT:
471 is_ds = true;
472 break;
473 default:
474 break;
475 }
476 return is_ds;
477}
478
479// Return true if format is a stencil-only format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600480VK_LAYER_EXPORT bool FormatIsStencilOnly(VkFormat format) { return (format == VK_FORMAT_S8_UINT); }
Dave Houlton3c9fca72017-03-27 17:25:54 -0600481
482// Return true if format is a depth-only format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600483VK_LAYER_EXPORT bool FormatIsDepthOnly(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600484 bool is_depth = false;
485
486 switch (format) {
487 case VK_FORMAT_D16_UNORM:
488 case VK_FORMAT_X8_D24_UNORM_PACK32:
489 case VK_FORMAT_D32_SFLOAT:
490 is_depth = true;
491 break;
492 default:
493 break;
494 }
495
496 return is_depth;
497}
498
499// Return true if format is of type NORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600500VK_LAYER_EXPORT bool FormatIsNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600501 bool is_norm = false;
502
503 switch (format) {
504 case VK_FORMAT_R4G4_UNORM_PACK8:
505 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
506 case VK_FORMAT_R5G6B5_UNORM_PACK16:
507 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
508 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
509 case VK_FORMAT_R8_UNORM:
510 case VK_FORMAT_R8_SNORM:
511 case VK_FORMAT_R8G8_UNORM:
512 case VK_FORMAT_R8G8_SNORM:
513 case VK_FORMAT_R8G8B8_UNORM:
514 case VK_FORMAT_R8G8B8_SNORM:
515 case VK_FORMAT_R8G8B8A8_UNORM:
516 case VK_FORMAT_R8G8B8A8_SNORM:
517 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
518 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
519 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
520 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
521 case VK_FORMAT_R16_UNORM:
522 case VK_FORMAT_R16_SNORM:
523 case VK_FORMAT_R16G16_UNORM:
524 case VK_FORMAT_R16G16_SNORM:
525 case VK_FORMAT_R16G16B16_UNORM:
526 case VK_FORMAT_R16G16B16_SNORM:
527 case VK_FORMAT_R16G16B16A16_UNORM:
528 case VK_FORMAT_R16G16B16A16_SNORM:
529 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
530 case VK_FORMAT_BC2_UNORM_BLOCK:
531 case VK_FORMAT_BC3_UNORM_BLOCK:
532 case VK_FORMAT_BC4_UNORM_BLOCK:
533 case VK_FORMAT_BC4_SNORM_BLOCK:
534 case VK_FORMAT_BC5_UNORM_BLOCK:
535 case VK_FORMAT_BC5_SNORM_BLOCK:
536 case VK_FORMAT_BC7_UNORM_BLOCK:
537 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
538 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
539 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
540 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
541 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
542 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
543 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
544 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
545 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
546 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
547 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
548 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
549 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
550 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
551 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
552 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
553 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
554 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
555 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
556 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
557 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
558 case VK_FORMAT_B5G6R5_UNORM_PACK16:
559 case VK_FORMAT_B8G8R8_UNORM:
560 case VK_FORMAT_B8G8R8_SNORM:
561 case VK_FORMAT_B8G8R8A8_UNORM:
562 case VK_FORMAT_B8G8R8A8_SNORM:
563 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
564 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
565 is_norm = true;
566 break;
567 default:
568 break;
569 }
570
571 return is_norm;
Petr Kraus13c98a62017-12-09 00:22:39 +0100572}
Dave Houlton3c9fca72017-03-27 17:25:54 -0600573
574// Return true if format is of type UNORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600575VK_LAYER_EXPORT bool FormatIsUNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600576 bool is_unorm = false;
577
578 switch (format) {
579 case VK_FORMAT_R4G4_UNORM_PACK8:
580 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
581 case VK_FORMAT_R5G6B5_UNORM_PACK16:
582 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
583 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
584 case VK_FORMAT_R8_UNORM:
585 case VK_FORMAT_R8G8_UNORM:
586 case VK_FORMAT_R8G8B8_UNORM:
587 case VK_FORMAT_R8G8B8A8_UNORM:
588 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
589 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
590 case VK_FORMAT_R16_UNORM:
591 case VK_FORMAT_R16G16_UNORM:
592 case VK_FORMAT_R16G16B16_UNORM:
593 case VK_FORMAT_R16G16B16A16_UNORM:
594 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
595 case VK_FORMAT_BC2_UNORM_BLOCK:
596 case VK_FORMAT_BC3_UNORM_BLOCK:
597 case VK_FORMAT_BC4_UNORM_BLOCK:
598 case VK_FORMAT_BC5_UNORM_BLOCK:
599 case VK_FORMAT_BC7_UNORM_BLOCK:
600 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
601 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
602 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
603 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
604 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
605 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
606 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
607 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
608 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
609 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
610 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
611 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
612 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
613 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
614 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
615 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
616 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
617 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
618 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
619 case VK_FORMAT_B5G6R5_UNORM_PACK16:
620 case VK_FORMAT_B8G8R8_UNORM:
621 case VK_FORMAT_B8G8R8A8_UNORM:
622 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
623 is_unorm = true;
624 break;
625 default:
626 break;
627 }
628
629 return is_unorm;
Petr Kraus13c98a62017-12-09 00:22:39 +0100630}
Dave Houlton3c9fca72017-03-27 17:25:54 -0600631
632// Return true if format is of type SNORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600633VK_LAYER_EXPORT bool FormatIsSNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600634 bool is_snorm = false;
635
636 switch (format) {
637 case VK_FORMAT_R8_SNORM:
638 case VK_FORMAT_R8G8_SNORM:
639 case VK_FORMAT_R8G8B8_SNORM:
640 case VK_FORMAT_R8G8B8A8_SNORM:
641 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
642 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
643 case VK_FORMAT_R16_SNORM:
644 case VK_FORMAT_R16G16_SNORM:
645 case VK_FORMAT_R16G16B16_SNORM:
646 case VK_FORMAT_R16G16B16A16_SNORM:
647 case VK_FORMAT_BC4_SNORM_BLOCK:
648 case VK_FORMAT_BC5_SNORM_BLOCK:
649 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
650 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
651 case VK_FORMAT_B8G8R8_SNORM:
652 case VK_FORMAT_B8G8R8A8_SNORM:
653 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
654 is_snorm = true;
655 break;
656 default:
657 break;
658 }
659
660 return is_snorm;
Petr Kraus13c98a62017-12-09 00:22:39 +0100661}
Dave Houlton3c9fca72017-03-27 17:25:54 -0600662
663// Return true if format is an integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600664VK_LAYER_EXPORT bool FormatIsInt(VkFormat format) { return (FormatIsSInt(format) || FormatIsUInt(format)); }
Dave Houlton3c9fca72017-03-27 17:25:54 -0600665
666// Return true if format is an unsigned integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600667VK_LAYER_EXPORT bool FormatIsUInt(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600668 bool is_uint = false;
669
670 switch (format) {
671 case VK_FORMAT_R8_UINT:
Dave Houltona2dcecd2017-05-22 13:52:20 -0600672 case VK_FORMAT_S8_UINT:
Dave Houlton3c9fca72017-03-27 17:25:54 -0600673 case VK_FORMAT_R8G8_UINT:
674 case VK_FORMAT_R8G8B8_UINT:
675 case VK_FORMAT_R8G8B8A8_UINT:
676 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
677 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
678 case VK_FORMAT_R16_UINT:
679 case VK_FORMAT_R16G16_UINT:
680 case VK_FORMAT_R16G16B16_UINT:
681 case VK_FORMAT_R16G16B16A16_UINT:
682 case VK_FORMAT_R32_UINT:
683 case VK_FORMAT_R32G32_UINT:
684 case VK_FORMAT_R32G32B32_UINT:
685 case VK_FORMAT_R32G32B32A32_UINT:
686 case VK_FORMAT_R64_UINT:
687 case VK_FORMAT_R64G64_UINT:
688 case VK_FORMAT_R64G64B64_UINT:
689 case VK_FORMAT_R64G64B64A64_UINT:
690 case VK_FORMAT_B8G8R8_UINT:
691 case VK_FORMAT_B8G8R8A8_UINT:
692 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
693 is_uint = true;
694 break;
695 default:
696 break;
697 }
698
699 return is_uint;
700}
701
702// Return true if format is a signed integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600703VK_LAYER_EXPORT bool FormatIsSInt(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600704 bool is_sint = false;
705
706 switch (format) {
707 case VK_FORMAT_R8_SINT:
708 case VK_FORMAT_R8G8_SINT:
709 case VK_FORMAT_R8G8B8_SINT:
710 case VK_FORMAT_R8G8B8A8_SINT:
711 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
712 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
713 case VK_FORMAT_R16_SINT:
714 case VK_FORMAT_R16G16_SINT:
715 case VK_FORMAT_R16G16B16_SINT:
716 case VK_FORMAT_R16G16B16A16_SINT:
717 case VK_FORMAT_R32_SINT:
718 case VK_FORMAT_R32G32_SINT:
719 case VK_FORMAT_R32G32B32_SINT:
720 case VK_FORMAT_R32G32B32A32_SINT:
721 case VK_FORMAT_R64_SINT:
722 case VK_FORMAT_R64G64_SINT:
723 case VK_FORMAT_R64G64B64_SINT:
724 case VK_FORMAT_R64G64B64A64_SINT:
725 case VK_FORMAT_B8G8R8_SINT:
726 case VK_FORMAT_B8G8R8A8_SINT:
727 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
728 is_sint = true;
729 break;
730 default:
731 break;
732 }
733
734 return is_sint;
735}
736
737// Return true if format is a floating-point format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600738VK_LAYER_EXPORT bool FormatIsFloat(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600739 bool is_float = false;
740
741 switch (format) {
742 case VK_FORMAT_R16_SFLOAT:
743 case VK_FORMAT_R16G16_SFLOAT:
744 case VK_FORMAT_R16G16B16_SFLOAT:
745 case VK_FORMAT_R16G16B16A16_SFLOAT:
746 case VK_FORMAT_R32_SFLOAT:
747 case VK_FORMAT_R32G32_SFLOAT:
748 case VK_FORMAT_R32G32B32_SFLOAT:
749 case VK_FORMAT_R32G32B32A32_SFLOAT:
750 case VK_FORMAT_R64_SFLOAT:
751 case VK_FORMAT_R64G64_SFLOAT:
752 case VK_FORMAT_R64G64B64_SFLOAT:
753 case VK_FORMAT_R64G64B64A64_SFLOAT:
754 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
755 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
756 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
757 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
758 is_float = true;
759 break;
760 default:
761 break;
762 }
763
764 return is_float;
765}
766
767// Return true if format is in the SRGB colorspace
Dave Houlton1d2022c2017-03-29 11:43:58 -0600768VK_LAYER_EXPORT bool FormatIsSRGB(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600769 bool is_srgb = false;
770
771 switch (format) {
772 case VK_FORMAT_R8_SRGB:
773 case VK_FORMAT_R8G8_SRGB:
774 case VK_FORMAT_R8G8B8_SRGB:
775 case VK_FORMAT_R8G8B8A8_SRGB:
776 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
777 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
778 case VK_FORMAT_BC2_SRGB_BLOCK:
779 case VK_FORMAT_BC3_SRGB_BLOCK:
780 case VK_FORMAT_BC7_SRGB_BLOCK:
781 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
782 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
783 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
784 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
785 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
786 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
787 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
788 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
789 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
790 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
791 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
792 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
793 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
794 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
795 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
796 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
797 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
798 case VK_FORMAT_B8G8R8_SRGB:
799 case VK_FORMAT_B8G8R8A8_SRGB:
800 is_srgb = true;
801 break;
802 default:
803 break;
804 }
805
806 return is_srgb;
807}
808
Chris Forbes568cd692017-04-24 18:41:23 -0700809// Return true if format is a USCALED format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600810VK_LAYER_EXPORT bool FormatIsUScaled(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600811 bool is_uscaled = false;
812
813 switch (format) {
814 case VK_FORMAT_R8_USCALED:
815 case VK_FORMAT_R8G8_USCALED:
816 case VK_FORMAT_R8G8B8_USCALED:
817 case VK_FORMAT_B8G8R8_USCALED:
818 case VK_FORMAT_R8G8B8A8_USCALED:
819 case VK_FORMAT_B8G8R8A8_USCALED:
820 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
821 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
822 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
823 case VK_FORMAT_R16_USCALED:
824 case VK_FORMAT_R16G16_USCALED:
825 case VK_FORMAT_R16G16B16_USCALED:
826 case VK_FORMAT_R16G16B16A16_USCALED:
827 is_uscaled = true;
828 break;
829 default:
830 break;
831 }
832
833 return is_uscaled;
834}
835
Chris Forbes568cd692017-04-24 18:41:23 -0700836// Return true if format is a SSCALED format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600837VK_LAYER_EXPORT bool FormatIsSScaled(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600838 bool is_sscaled = false;
839
840 switch (format) {
841 case VK_FORMAT_R8_SSCALED:
842 case VK_FORMAT_R8G8_SSCALED:
843 case VK_FORMAT_R8G8B8_SSCALED:
844 case VK_FORMAT_B8G8R8_SSCALED:
845 case VK_FORMAT_R8G8B8A8_SSCALED:
846 case VK_FORMAT_B8G8R8A8_SSCALED:
847 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
848 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
849 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
850 case VK_FORMAT_R16_SSCALED:
851 case VK_FORMAT_R16G16_SSCALED:
852 case VK_FORMAT_R16G16B16_SSCALED:
853 case VK_FORMAT_R16G16B16A16_SSCALED:
854 is_sscaled = true;
855 break;
856 default:
857 break;
858 }
859
860 return is_sscaled;
861}
862
Dave Houlton3c9fca72017-03-27 17:25:54 -0600863// Return compressed texel block sizes for block compressed formats
Dave Houlton1d2022c2017-03-29 11:43:58 -0600864VK_LAYER_EXPORT VkExtent3D FormatCompressedTexelBlockExtent(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600865 VkExtent3D block_size = {1, 1, 1};
866 switch (format) {
867 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
868 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
869 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
870 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
871 case VK_FORMAT_BC2_UNORM_BLOCK:
872 case VK_FORMAT_BC2_SRGB_BLOCK:
873 case VK_FORMAT_BC3_UNORM_BLOCK:
874 case VK_FORMAT_BC3_SRGB_BLOCK:
875 case VK_FORMAT_BC4_UNORM_BLOCK:
876 case VK_FORMAT_BC4_SNORM_BLOCK:
877 case VK_FORMAT_BC5_UNORM_BLOCK:
878 case VK_FORMAT_BC5_SNORM_BLOCK:
879 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
880 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
881 case VK_FORMAT_BC7_UNORM_BLOCK:
882 case VK_FORMAT_BC7_SRGB_BLOCK:
883 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
884 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
885 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
886 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
887 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
888 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
889 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
890 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
891 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
892 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
893 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
894 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
895 block_size = {4, 4, 1};
896 break;
897 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
898 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
899 block_size = {5, 4, 1};
900 break;
901 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
902 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
903 block_size = {5, 5, 1};
904 break;
905 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
906 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
907 block_size = {6, 5, 1};
908 break;
909 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
910 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
911 block_size = {6, 6, 1};
912 break;
913 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
914 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
915 block_size = {8, 5, 1};
916 break;
917 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
918 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
919 block_size = {8, 6, 1};
920 break;
921 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
922 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
923 block_size = {8, 8, 1};
924 break;
925 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
926 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
927 block_size = {10, 5, 1};
928 break;
929 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
930 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
931 block_size = {10, 6, 1};
932 break;
933 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
934 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
935 block_size = {10, 8, 1};
936 break;
937 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
938 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
939 block_size = {10, 10, 1};
940 break;
941 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
942 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
943 block_size = {12, 10, 1};
944 break;
945 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
946 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
947 block_size = {12, 12, 1};
948 break;
Dave Houlton23cdab92017-05-23 16:16:54 -0600949 case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
950 case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
951 case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
952 case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
953 block_size = {8, 4, 1};
954 break;
955 case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
956 case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
957 case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
958 case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
959 block_size = {4, 4, 1};
960 break;
Dave Houltonc991cc92018-03-06 11:08:51 -0700961 // With KHR_sampler_ycbcr_conversion, these formats are treated as 2x1 compressed (for copies)
962 case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
963 case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
964 case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
965 case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
966 case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
967 case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
968 case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
969 case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
970 block_size = {2, 1, 1};
971 break;
972
Dave Houlton3c9fca72017-03-27 17:25:54 -0600973 default:
974 break;
975 }
976 return block_size;
977}
978
Jose-Emilio Munoz-Lopez2a017e32018-10-30 09:19:30 +0000979VK_LAYER_EXPORT uint32_t FormatDepthSize(VkFormat format) {
980 uint32_t depth_size = 0;
981 switch (format) {
982 case VK_FORMAT_D16_UNORM:
983 case VK_FORMAT_D16_UNORM_S8_UINT:
984 depth_size = 16;
985 break;
986 case VK_FORMAT_X8_D24_UNORM_PACK32:
987 case VK_FORMAT_D24_UNORM_S8_UINT:
988 depth_size = 24;
989 break;
990 case VK_FORMAT_D32_SFLOAT:
991 case VK_FORMAT_D32_SFLOAT_S8_UINT:
992 depth_size = 32;
993 break;
994
995 default:
996 break;
997 }
998 return depth_size;
999}
1000
1001VK_LAYER_EXPORT VkFormatNumericalType FormatDepthNumericalType(VkFormat format) {
1002 VkFormatNumericalType numerical_type = VK_FORMAT_NUMERICAL_TYPE_NONE;
1003 switch (format) {
1004 case VK_FORMAT_D16_UNORM:
1005 case VK_FORMAT_D16_UNORM_S8_UINT:
1006 case VK_FORMAT_X8_D24_UNORM_PACK32:
1007 case VK_FORMAT_D24_UNORM_S8_UINT:
1008 numerical_type = VK_FORMAT_NUMERICAL_TYPE_UNORM;
1009 break;
1010 case VK_FORMAT_D32_SFLOAT:
1011 case VK_FORMAT_D32_SFLOAT_S8_UINT:
1012 numerical_type = VK_FORMAT_NUMERICAL_TYPE_SFLOAT;
1013 break;
1014
1015 default:
1016 break;
1017 }
1018 return numerical_type;
1019}
1020
1021VK_LAYER_EXPORT uint32_t FormatStencilSize(VkFormat format) {
1022 uint32_t stencil_size = 0;
1023 switch (format) {
1024 case VK_FORMAT_S8_UINT:
1025 case VK_FORMAT_D16_UNORM_S8_UINT:
1026 case VK_FORMAT_D24_UNORM_S8_UINT:
1027 case VK_FORMAT_D32_SFLOAT_S8_UINT:
1028 stencil_size = 8;
1029 break;
1030
1031 default:
1032 break;
1033 }
1034 return stencil_size;
1035}
1036
1037VK_LAYER_EXPORT VkFormatNumericalType FormatStencilNumericalType(VkFormat format) {
1038 VkFormatNumericalType numerical_type = VK_FORMAT_NUMERICAL_TYPE_NONE;
1039 switch (format) {
1040 case VK_FORMAT_S8_UINT:
1041 case VK_FORMAT_D16_UNORM_S8_UINT:
1042 case VK_FORMAT_D24_UNORM_S8_UINT:
1043 case VK_FORMAT_D32_SFLOAT_S8_UINT:
1044 numerical_type = VK_FORMAT_NUMERICAL_TYPE_UINT;
1045 break;
1046
1047 default:
1048 break;
1049 }
1050 return numerical_type;
1051}
1052
Dave Houlton1d960ff2018-01-19 12:17:05 -07001053VK_LAYER_EXPORT uint32_t FormatPlaneCount(VkFormat format) {
1054 switch (format) {
1055 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
1056 case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:
1057 case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR:
1058 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:
1059 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:
1060 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR:
1061 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:
1062 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:
1063 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR:
1064 case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:
1065 case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:
1066 case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR:
Dave Houltonc991cc92018-03-06 11:08:51 -07001067 return 3;
Dave Houlton1d960ff2018-01-19 12:17:05 -07001068 break;
1069 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
1070 case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
1071 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:
1072 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:
1073 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:
1074 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:
1075 case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:
1076 case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:
Dave Houltonc991cc92018-03-06 11:08:51 -07001077 return 2;
Dave Houlton1d960ff2018-01-19 12:17:05 -07001078 break;
1079 default:
Dave Houltonc991cc92018-03-06 11:08:51 -07001080 return 1;
Dave Houlton1d960ff2018-01-19 12:17:05 -07001081 break;
1082 }
1083}
1084
Dave Houlton3c9fca72017-03-27 17:25:54 -06001085// Return format class of the specified format
Dave Houlton1d2022c2017-03-29 11:43:58 -06001086VK_LAYER_EXPORT VkFormatCompatibilityClass FormatCompatibilityClass(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -06001087 auto item = vk_format_table.find(format);
1088 if (item != vk_format_table.end()) {
1089 return item->second.format_class;
1090 }
1091 return VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT;
1092}
1093
1094// Return size, in bytes, of a pixel of the specified format
Dave Houlton1d2022c2017-03-29 11:43:58 -06001095VK_LAYER_EXPORT size_t FormatSize(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -06001096 auto item = vk_format_table.find(format);
1097 if (item != vk_format_table.end()) {
1098 return item->second.size;
1099 }
1100 return 0;
1101}
1102
1103// Return the number of channels for a given format
Dave Houlton1d960ff2018-01-19 12:17:05 -07001104uint32_t FormatChannelCount(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -06001105 auto item = vk_format_table.find(format);
1106 if (item != vk_format_table.end()) {
1107 return item->second.channel_count;
1108 }
1109 return 0;
1110}
1111
1112// Perform a zero-tolerant modulo operation
Dave Houlton1d2022c2017-03-29 11:43:58 -06001113VK_LAYER_EXPORT VkDeviceSize SafeModulo(VkDeviceSize dividend, VkDeviceSize divisor) {
Dave Houlton3c9fca72017-03-27 17:25:54 -06001114 VkDeviceSize result = 0;
1115 if (divisor != 0) {
1116 result = dividend % divisor;
1117 }
1118 return result;
1119}
Dave Houltonc991cc92018-03-06 11:08:51 -07001120
1121struct VULKAN_PER_PLANE_COMPATIBILITY {
1122 uint32_t width_divisor;
1123 uint32_t height_divisor;
1124 VkFormat compatible_format;
1125};
1126
1127struct VULKAN_MULTIPLANE_COMPATIBILITY {
1128 VULKAN_PER_PLANE_COMPATIBILITY per_plane[VK_MULTIPLANE_FORMAT_MAX_PLANES];
1129};
1130
1131// Source: Vulkan spec Table 45. Plane Format Compatibility Table
1132// clang-format off
1133const std::map<VkFormat, VULKAN_MULTIPLANE_COMPATIBILITY> vk_multiplane_compatibility_map {
1134 { VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM },
1135 { 2, 2, VK_FORMAT_R8_UNORM },
1136 { 2, 2, VK_FORMAT_R8_UNORM } } } },
1137 { VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM },
1138 { 2, 2, VK_FORMAT_R8G8_UNORM },
1139 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1140 { VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM },
1141 { 2, 1, VK_FORMAT_R8_UNORM },
1142 { 2, 1, VK_FORMAT_R8_UNORM } } } },
1143 { VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM },
1144 { 2, 1, VK_FORMAT_R8G8_UNORM },
1145 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1146 { VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM },
1147 { 1, 1, VK_FORMAT_R8_UNORM },
1148 { 1, 1, VK_FORMAT_R8_UNORM } } } },
1149 { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1150 { 2, 2, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1151 { 2, 2, VK_FORMAT_R10X6_UNORM_PACK16_KHR } } } },
1152 { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1153 { 2, 2, VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR },
1154 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1155 { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1156 { 2, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1157 { 2, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR } } } },
1158 { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1159 { 2, 1, VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR },
1160 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1161 { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1162 { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
1163 { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR } } } },
1164 { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1165 { 2, 2, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1166 { 2, 2, VK_FORMAT_R12X4_UNORM_PACK16_KHR } } } },
1167 { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1168 { 2, 2, VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR },
1169 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1170 { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1171 { 2, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1172 { 2, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR } } } },
1173 { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1174 { 2, 1, VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR },
1175 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1176 { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1177 { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
1178 { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR } } } },
1179 { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM },
1180 { 2, 2, VK_FORMAT_R16_UNORM },
1181 { 2, 2, VK_FORMAT_R16_UNORM } } } },
1182 { VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM },
1183 { 2, 2, VK_FORMAT_R16G16_UNORM },
1184 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1185 { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM },
1186 { 2, 1, VK_FORMAT_R16_UNORM },
1187 { 2, 1, VK_FORMAT_R16_UNORM } } } },
1188 { VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM },
1189 { 2, 1, VK_FORMAT_R16G16_UNORM },
1190 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1191 { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM },
1192 { 1, 1, VK_FORMAT_R16_UNORM },
1193 { 1, 1, VK_FORMAT_R16_UNORM } } } }
1194};
1195// clang-format on
1196
Peter Kohautaef965c2018-07-12 09:19:33 +02001197// Return alignment, in bytes, of a data for the specified format
1198VK_LAYER_EXPORT size_t FormatAlignment(VkFormat format) {
1199 if (FormatIsPacked(format)) {
1200 return FormatSize(format);
1201 } else {
1202 return FormatSize(format) / FormatChannelCount(format);
1203 }
Tony-LunarG7482ca92018-10-01 14:20:22 -06001204}
1205
Dave Houltone48cd112019-01-03 17:01:18 -07001206uint32_t GetPlaneIndex(VkImageAspectFlags aspect) {
Tony-LunarG7482ca92018-10-01 14:20:22 -06001207 switch (aspect) {
1208 case VK_IMAGE_ASPECT_PLANE_0_BIT:
1209 return 0;
1210 break;
1211 case VK_IMAGE_ASPECT_PLANE_1_BIT:
1212 return 1;
1213 break;
1214 case VK_IMAGE_ASPECT_PLANE_2_BIT:
1215 return 2;
1216 break;
1217 default:
1218 return 0;
1219 break;
1220 }
1221}
1222
Dave Houltone48cd112019-01-03 17:01:18 -07001223VK_LAYER_EXPORT VkFormat FindMultiplaneCompatibleFormat(VkFormat mp_fmt, VkImageAspectFlags plane_aspect) {
1224 uint32_t plane_idx = GetPlaneIndex(plane_aspect);
1225 auto it = vk_multiplane_compatibility_map.find(mp_fmt);
1226 if ((it == vk_multiplane_compatibility_map.end()) || (plane_idx >= VK_MULTIPLANE_FORMAT_MAX_PLANES)) {
1227 return VK_FORMAT_UNDEFINED;
1228 }
1229
1230 return it->second.per_plane[plane_idx].compatible_format;
1231}
1232
1233VK_LAYER_EXPORT VkExtent2D FindMultiplaneExtentDivisors(VkFormat mp_fmt, VkImageAspectFlags plane_aspect) {
1234 VkExtent2D divisors = {1, 1};
1235 uint32_t plane_idx = GetPlaneIndex(plane_aspect);
1236 auto it = vk_multiplane_compatibility_map.find(mp_fmt);
1237 if ((it == vk_multiplane_compatibility_map.end()) || (plane_idx >= VK_MULTIPLANE_FORMAT_MAX_PLANES)) {
1238 return divisors;
1239 }
1240
1241 divisors.width = it->second.per_plane[plane_idx].width_divisor;
1242 divisors.height = it->second.per_plane[plane_idx].height_divisor;
1243 return divisors;
1244}
1245
Tony-LunarG7482ca92018-10-01 14:20:22 -06001246VK_LAYER_EXPORT bool FormatSizesAreEqual(VkFormat srcFormat, VkFormat dstFormat, uint32_t region_count,
1247 const VkImageCopy *regions) {
1248 size_t srcSize = 0, dstSize = 0;
1249
1250 if (FormatIsMultiplane(srcFormat) || FormatIsMultiplane(dstFormat)) {
1251 for (uint32_t i = 0; i < region_count; i++) {
1252 if (FormatIsMultiplane(srcFormat)) {
Dave Houltone48cd112019-01-03 17:01:18 -07001253 VkFormat planeFormat = FindMultiplaneCompatibleFormat(srcFormat, regions[i].srcSubresource.aspectMask);
Tony-LunarG7482ca92018-10-01 14:20:22 -06001254 srcSize = FormatSize(planeFormat);
1255 } else {
1256 srcSize = FormatSize(srcFormat);
1257 }
1258 if (FormatIsMultiplane(dstFormat)) {
Dave Houltone48cd112019-01-03 17:01:18 -07001259 VkFormat planeFormat = FindMultiplaneCompatibleFormat(dstFormat, regions[i].dstSubresource.aspectMask);
Tony-LunarG7482ca92018-10-01 14:20:22 -06001260 dstSize = FormatSize(planeFormat);
1261 } else {
1262 dstSize = FormatSize(dstFormat);
1263 }
1264 if (dstSize != srcSize) return false;
1265 }
1266 return true;
1267 } else {
1268 srcSize = FormatSize(srcFormat);
1269 dstSize = FormatSize(dstFormat);
1270 return (dstSize == srcSize);
1271 }
1272}