blob: 83029fe7f62c8047a7df1d2acd5b260339049b1b [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}},
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}},
232 {VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT}}
Dave Houlton3c9fca72017-03-27 17:25:54 -0600233};
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
Dave Houlton23cdab92017-05-23 16:16:54 -0600261// Return true if format is an ASTC 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
Dave Houlton23cdab92017-05-23 16:16:54 -0600331// Return true if format is a PVRTC compressed texture format
332VK_LAYER_EXPORT bool FormatIsCompressed_PVRTC(VkFormat format) {
333 bool found = false;
334
335 switch (format) {
336 case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
337 case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
338 case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
339 case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
340 case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
341 case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
342 case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
343 case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
344 found = true;
345 break;
346 default:
347 break;
348 }
349 return found;
350}
351
352// Return true if format is compressed
353VK_LAYER_EXPORT bool FormatIsCompressed(VkFormat format) {
Dave Houltona9df0ce2018-02-07 10:51:23 -0700354 return (FormatIsCompressed_ASTC_LDR(format) || FormatIsCompressed_BC(format) || FormatIsCompressed_ETC2_EAC(format) ||
Dave Houlton23cdab92017-05-23 16:16:54 -0600355 FormatIsCompressed_PVRTC(format));
356}
357
Dave Houlton3c9fca72017-03-27 17:25:54 -0600358// Return true if format is a depth or stencil format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600359VK_LAYER_EXPORT bool FormatIsDepthOrStencil(VkFormat format) {
360 return (FormatIsDepthAndStencil(format) || FormatIsDepthOnly(format) || FormatIsStencilOnly(format));
Dave Houlton3c9fca72017-03-27 17:25:54 -0600361}
362
363// Return true if format contains depth and stencil information
Dave Houlton1d2022c2017-03-29 11:43:58 -0600364VK_LAYER_EXPORT bool FormatIsDepthAndStencil(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600365 bool is_ds = false;
366
367 switch (format) {
368 case VK_FORMAT_D16_UNORM_S8_UINT:
369 case VK_FORMAT_D24_UNORM_S8_UINT:
370 case VK_FORMAT_D32_SFLOAT_S8_UINT:
371 is_ds = true;
372 break;
373 default:
374 break;
375 }
376 return is_ds;
377}
378
379// Return true if format is a stencil-only format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600380VK_LAYER_EXPORT bool FormatIsStencilOnly(VkFormat format) { return (format == VK_FORMAT_S8_UINT); }
Dave Houlton3c9fca72017-03-27 17:25:54 -0600381
382// Return true if format is a depth-only format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600383VK_LAYER_EXPORT bool FormatIsDepthOnly(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600384 bool is_depth = false;
385
386 switch (format) {
387 case VK_FORMAT_D16_UNORM:
388 case VK_FORMAT_X8_D24_UNORM_PACK32:
389 case VK_FORMAT_D32_SFLOAT:
390 is_depth = true;
391 break;
392 default:
393 break;
394 }
395
396 return is_depth;
397}
398
399// Return true if format is of type NORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600400VK_LAYER_EXPORT bool FormatIsNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600401 bool is_norm = false;
402
403 switch (format) {
404 case VK_FORMAT_R4G4_UNORM_PACK8:
405 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
406 case VK_FORMAT_R5G6B5_UNORM_PACK16:
407 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
408 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
409 case VK_FORMAT_R8_UNORM:
410 case VK_FORMAT_R8_SNORM:
411 case VK_FORMAT_R8G8_UNORM:
412 case VK_FORMAT_R8G8_SNORM:
413 case VK_FORMAT_R8G8B8_UNORM:
414 case VK_FORMAT_R8G8B8_SNORM:
415 case VK_FORMAT_R8G8B8A8_UNORM:
416 case VK_FORMAT_R8G8B8A8_SNORM:
417 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
418 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
419 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
420 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
421 case VK_FORMAT_R16_UNORM:
422 case VK_FORMAT_R16_SNORM:
423 case VK_FORMAT_R16G16_UNORM:
424 case VK_FORMAT_R16G16_SNORM:
425 case VK_FORMAT_R16G16B16_UNORM:
426 case VK_FORMAT_R16G16B16_SNORM:
427 case VK_FORMAT_R16G16B16A16_UNORM:
428 case VK_FORMAT_R16G16B16A16_SNORM:
429 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
430 case VK_FORMAT_BC2_UNORM_BLOCK:
431 case VK_FORMAT_BC3_UNORM_BLOCK:
432 case VK_FORMAT_BC4_UNORM_BLOCK:
433 case VK_FORMAT_BC4_SNORM_BLOCK:
434 case VK_FORMAT_BC5_UNORM_BLOCK:
435 case VK_FORMAT_BC5_SNORM_BLOCK:
436 case VK_FORMAT_BC7_UNORM_BLOCK:
437 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
438 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
439 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
440 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
441 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
442 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
443 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
444 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
445 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
446 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
447 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
448 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
449 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
450 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
451 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
452 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
453 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
454 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
455 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
456 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
457 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
458 case VK_FORMAT_B5G6R5_UNORM_PACK16:
459 case VK_FORMAT_B8G8R8_UNORM:
460 case VK_FORMAT_B8G8R8_SNORM:
461 case VK_FORMAT_B8G8R8A8_UNORM:
462 case VK_FORMAT_B8G8R8A8_SNORM:
463 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
464 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
465 is_norm = true;
466 break;
467 default:
468 break;
469 }
470
471 return is_norm;
Petr Kraus13c98a62017-12-09 00:22:39 +0100472}
Dave Houlton3c9fca72017-03-27 17:25:54 -0600473
474// Return true if format is of type UNORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600475VK_LAYER_EXPORT bool FormatIsUNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600476 bool is_unorm = false;
477
478 switch (format) {
479 case VK_FORMAT_R4G4_UNORM_PACK8:
480 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
481 case VK_FORMAT_R5G6B5_UNORM_PACK16:
482 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
483 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
484 case VK_FORMAT_R8_UNORM:
485 case VK_FORMAT_R8G8_UNORM:
486 case VK_FORMAT_R8G8B8_UNORM:
487 case VK_FORMAT_R8G8B8A8_UNORM:
488 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
489 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
490 case VK_FORMAT_R16_UNORM:
491 case VK_FORMAT_R16G16_UNORM:
492 case VK_FORMAT_R16G16B16_UNORM:
493 case VK_FORMAT_R16G16B16A16_UNORM:
494 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
495 case VK_FORMAT_BC2_UNORM_BLOCK:
496 case VK_FORMAT_BC3_UNORM_BLOCK:
497 case VK_FORMAT_BC4_UNORM_BLOCK:
498 case VK_FORMAT_BC5_UNORM_BLOCK:
499 case VK_FORMAT_BC7_UNORM_BLOCK:
500 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
501 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
502 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
503 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
504 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
505 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
506 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
507 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
508 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
509 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
510 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
511 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
512 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
513 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
514 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
515 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
516 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
517 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
518 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
519 case VK_FORMAT_B5G6R5_UNORM_PACK16:
520 case VK_FORMAT_B8G8R8_UNORM:
521 case VK_FORMAT_B8G8R8A8_UNORM:
522 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
523 is_unorm = true;
524 break;
525 default:
526 break;
527 }
528
529 return is_unorm;
Petr Kraus13c98a62017-12-09 00:22:39 +0100530}
Dave Houlton3c9fca72017-03-27 17:25:54 -0600531
532// Return true if format is of type SNORM
Dave Houlton1d2022c2017-03-29 11:43:58 -0600533VK_LAYER_EXPORT bool FormatIsSNorm(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600534 bool is_snorm = false;
535
536 switch (format) {
537 case VK_FORMAT_R8_SNORM:
538 case VK_FORMAT_R8G8_SNORM:
539 case VK_FORMAT_R8G8B8_SNORM:
540 case VK_FORMAT_R8G8B8A8_SNORM:
541 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
542 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
543 case VK_FORMAT_R16_SNORM:
544 case VK_FORMAT_R16G16_SNORM:
545 case VK_FORMAT_R16G16B16_SNORM:
546 case VK_FORMAT_R16G16B16A16_SNORM:
547 case VK_FORMAT_BC4_SNORM_BLOCK:
548 case VK_FORMAT_BC5_SNORM_BLOCK:
549 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
550 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
551 case VK_FORMAT_B8G8R8_SNORM:
552 case VK_FORMAT_B8G8R8A8_SNORM:
553 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
554 is_snorm = true;
555 break;
556 default:
557 break;
558 }
559
560 return is_snorm;
Petr Kraus13c98a62017-12-09 00:22:39 +0100561}
Dave Houlton3c9fca72017-03-27 17:25:54 -0600562
563// Return true if format is an integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600564VK_LAYER_EXPORT bool FormatIsInt(VkFormat format) { return (FormatIsSInt(format) || FormatIsUInt(format)); }
Dave Houlton3c9fca72017-03-27 17:25:54 -0600565
566// Return true if format is an unsigned integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600567VK_LAYER_EXPORT bool FormatIsUInt(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600568 bool is_uint = false;
569
570 switch (format) {
571 case VK_FORMAT_R8_UINT:
Dave Houltona2dcecd2017-05-22 13:52:20 -0600572 case VK_FORMAT_S8_UINT:
Dave Houlton3c9fca72017-03-27 17:25:54 -0600573 case VK_FORMAT_R8G8_UINT:
574 case VK_FORMAT_R8G8B8_UINT:
575 case VK_FORMAT_R8G8B8A8_UINT:
576 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
577 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
578 case VK_FORMAT_R16_UINT:
579 case VK_FORMAT_R16G16_UINT:
580 case VK_FORMAT_R16G16B16_UINT:
581 case VK_FORMAT_R16G16B16A16_UINT:
582 case VK_FORMAT_R32_UINT:
583 case VK_FORMAT_R32G32_UINT:
584 case VK_FORMAT_R32G32B32_UINT:
585 case VK_FORMAT_R32G32B32A32_UINT:
586 case VK_FORMAT_R64_UINT:
587 case VK_FORMAT_R64G64_UINT:
588 case VK_FORMAT_R64G64B64_UINT:
589 case VK_FORMAT_R64G64B64A64_UINT:
590 case VK_FORMAT_B8G8R8_UINT:
591 case VK_FORMAT_B8G8R8A8_UINT:
592 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
593 is_uint = true;
594 break;
595 default:
596 break;
597 }
598
599 return is_uint;
600}
601
602// Return true if format is a signed integer format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600603VK_LAYER_EXPORT bool FormatIsSInt(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600604 bool is_sint = false;
605
606 switch (format) {
607 case VK_FORMAT_R8_SINT:
608 case VK_FORMAT_R8G8_SINT:
609 case VK_FORMAT_R8G8B8_SINT:
610 case VK_FORMAT_R8G8B8A8_SINT:
611 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
612 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
613 case VK_FORMAT_R16_SINT:
614 case VK_FORMAT_R16G16_SINT:
615 case VK_FORMAT_R16G16B16_SINT:
616 case VK_FORMAT_R16G16B16A16_SINT:
617 case VK_FORMAT_R32_SINT:
618 case VK_FORMAT_R32G32_SINT:
619 case VK_FORMAT_R32G32B32_SINT:
620 case VK_FORMAT_R32G32B32A32_SINT:
621 case VK_FORMAT_R64_SINT:
622 case VK_FORMAT_R64G64_SINT:
623 case VK_FORMAT_R64G64B64_SINT:
624 case VK_FORMAT_R64G64B64A64_SINT:
625 case VK_FORMAT_B8G8R8_SINT:
626 case VK_FORMAT_B8G8R8A8_SINT:
627 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
628 is_sint = true;
629 break;
630 default:
631 break;
632 }
633
634 return is_sint;
635}
636
637// Return true if format is a floating-point format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600638VK_LAYER_EXPORT bool FormatIsFloat(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600639 bool is_float = false;
640
641 switch (format) {
642 case VK_FORMAT_R16_SFLOAT:
643 case VK_FORMAT_R16G16_SFLOAT:
644 case VK_FORMAT_R16G16B16_SFLOAT:
645 case VK_FORMAT_R16G16B16A16_SFLOAT:
646 case VK_FORMAT_R32_SFLOAT:
647 case VK_FORMAT_R32G32_SFLOAT:
648 case VK_FORMAT_R32G32B32_SFLOAT:
649 case VK_FORMAT_R32G32B32A32_SFLOAT:
650 case VK_FORMAT_R64_SFLOAT:
651 case VK_FORMAT_R64G64_SFLOAT:
652 case VK_FORMAT_R64G64B64_SFLOAT:
653 case VK_FORMAT_R64G64B64A64_SFLOAT:
654 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
655 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
656 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
657 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
658 is_float = true;
659 break;
660 default:
661 break;
662 }
663
664 return is_float;
665}
666
667// Return true if format is in the SRGB colorspace
Dave Houlton1d2022c2017-03-29 11:43:58 -0600668VK_LAYER_EXPORT bool FormatIsSRGB(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600669 bool is_srgb = false;
670
671 switch (format) {
672 case VK_FORMAT_R8_SRGB:
673 case VK_FORMAT_R8G8_SRGB:
674 case VK_FORMAT_R8G8B8_SRGB:
675 case VK_FORMAT_R8G8B8A8_SRGB:
676 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
677 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
678 case VK_FORMAT_BC2_SRGB_BLOCK:
679 case VK_FORMAT_BC3_SRGB_BLOCK:
680 case VK_FORMAT_BC7_SRGB_BLOCK:
681 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
682 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
683 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
684 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
685 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
686 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
687 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
688 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
689 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
690 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
691 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
692 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
693 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
694 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
695 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
696 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
697 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
698 case VK_FORMAT_B8G8R8_SRGB:
699 case VK_FORMAT_B8G8R8A8_SRGB:
700 is_srgb = true;
701 break;
702 default:
703 break;
704 }
705
706 return is_srgb;
707}
708
Chris Forbes568cd692017-04-24 18:41:23 -0700709// Return true if format is a USCALED format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600710VK_LAYER_EXPORT bool FormatIsUScaled(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600711 bool is_uscaled = false;
712
713 switch (format) {
714 case VK_FORMAT_R8_USCALED:
715 case VK_FORMAT_R8G8_USCALED:
716 case VK_FORMAT_R8G8B8_USCALED:
717 case VK_FORMAT_B8G8R8_USCALED:
718 case VK_FORMAT_R8G8B8A8_USCALED:
719 case VK_FORMAT_B8G8R8A8_USCALED:
720 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
721 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
722 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
723 case VK_FORMAT_R16_USCALED:
724 case VK_FORMAT_R16G16_USCALED:
725 case VK_FORMAT_R16G16B16_USCALED:
726 case VK_FORMAT_R16G16B16A16_USCALED:
727 is_uscaled = true;
728 break;
729 default:
730 break;
731 }
732
733 return is_uscaled;
734}
735
Chris Forbes568cd692017-04-24 18:41:23 -0700736// Return true if format is a SSCALED format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600737VK_LAYER_EXPORT bool FormatIsSScaled(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600738 bool is_sscaled = false;
739
740 switch (format) {
741 case VK_FORMAT_R8_SSCALED:
742 case VK_FORMAT_R8G8_SSCALED:
743 case VK_FORMAT_R8G8B8_SSCALED:
744 case VK_FORMAT_B8G8R8_SSCALED:
745 case VK_FORMAT_R8G8B8A8_SSCALED:
746 case VK_FORMAT_B8G8R8A8_SSCALED:
747 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
748 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
749 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
750 case VK_FORMAT_R16_SSCALED:
751 case VK_FORMAT_R16G16_SSCALED:
752 case VK_FORMAT_R16G16B16_SSCALED:
753 case VK_FORMAT_R16G16B16A16_SSCALED:
754 is_sscaled = true;
755 break;
756 default:
757 break;
758 }
759
760 return is_sscaled;
761}
762
Dave Houlton3c9fca72017-03-27 17:25:54 -0600763// Return compressed texel block sizes for block compressed formats
Dave Houlton1d2022c2017-03-29 11:43:58 -0600764VK_LAYER_EXPORT VkExtent3D FormatCompressedTexelBlockExtent(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600765 VkExtent3D block_size = {1, 1, 1};
766 switch (format) {
767 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
768 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
769 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
770 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
771 case VK_FORMAT_BC2_UNORM_BLOCK:
772 case VK_FORMAT_BC2_SRGB_BLOCK:
773 case VK_FORMAT_BC3_UNORM_BLOCK:
774 case VK_FORMAT_BC3_SRGB_BLOCK:
775 case VK_FORMAT_BC4_UNORM_BLOCK:
776 case VK_FORMAT_BC4_SNORM_BLOCK:
777 case VK_FORMAT_BC5_UNORM_BLOCK:
778 case VK_FORMAT_BC5_SNORM_BLOCK:
779 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
780 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
781 case VK_FORMAT_BC7_UNORM_BLOCK:
782 case VK_FORMAT_BC7_SRGB_BLOCK:
783 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
784 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
785 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
786 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
787 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
788 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
789 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
790 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
791 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
792 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
793 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
794 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
795 block_size = {4, 4, 1};
796 break;
797 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
798 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
799 block_size = {5, 4, 1};
800 break;
801 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
802 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
803 block_size = {5, 5, 1};
804 break;
805 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
806 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
807 block_size = {6, 5, 1};
808 break;
809 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
810 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
811 block_size = {6, 6, 1};
812 break;
813 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
814 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
815 block_size = {8, 5, 1};
816 break;
817 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
818 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
819 block_size = {8, 6, 1};
820 break;
821 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
822 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
823 block_size = {8, 8, 1};
824 break;
825 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
826 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
827 block_size = {10, 5, 1};
828 break;
829 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
830 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
831 block_size = {10, 6, 1};
832 break;
833 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
834 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
835 block_size = {10, 8, 1};
836 break;
837 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
838 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
839 block_size = {10, 10, 1};
840 break;
841 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
842 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
843 block_size = {12, 10, 1};
844 break;
845 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
846 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
847 block_size = {12, 12, 1};
848 break;
Dave Houlton23cdab92017-05-23 16:16:54 -0600849 case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
850 case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
851 case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
852 case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
853 block_size = {8, 4, 1};
854 break;
855 case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
856 case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
857 case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
858 case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
859 block_size = {4, 4, 1};
860 break;
Dave Houlton3c9fca72017-03-27 17:25:54 -0600861 default:
862 break;
863 }
864 return block_size;
865}
866
Dave Houlton1d960ff2018-01-19 12:17:05 -0700867VK_LAYER_EXPORT uint32_t FormatPlaneCount(VkFormat format) {
868 switch (format) {
869 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
870 case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:
871 case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR:
872 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:
873 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:
874 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR:
875 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:
876 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:
877 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR:
878 case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:
879 case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:
880 case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR:
881 return 3u;
882 break;
883 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
884 case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
885 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:
886 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:
887 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:
888 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:
889 case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:
890 case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:
891 return 2u;
892 break;
893 default:
894 return 1u;
895 break;
896 }
897}
898
Dave Houlton3c9fca72017-03-27 17:25:54 -0600899// Return format class of the specified format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600900VK_LAYER_EXPORT VkFormatCompatibilityClass FormatCompatibilityClass(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600901 auto item = vk_format_table.find(format);
902 if (item != vk_format_table.end()) {
903 return item->second.format_class;
904 }
905 return VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT;
906}
907
908// Return size, in bytes, of a pixel of the specified format
Dave Houlton1d2022c2017-03-29 11:43:58 -0600909VK_LAYER_EXPORT size_t FormatSize(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600910 auto item = vk_format_table.find(format);
911 if (item != vk_format_table.end()) {
912 return item->second.size;
913 }
914 return 0;
915}
916
917// Return the number of channels for a given format
Dave Houlton1d960ff2018-01-19 12:17:05 -0700918uint32_t FormatChannelCount(VkFormat format) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600919 auto item = vk_format_table.find(format);
920 if (item != vk_format_table.end()) {
921 return item->second.channel_count;
922 }
923 return 0;
924}
925
926// Perform a zero-tolerant modulo operation
Dave Houlton1d2022c2017-03-29 11:43:58 -0600927VK_LAYER_EXPORT VkDeviceSize SafeModulo(VkDeviceSize dividend, VkDeviceSize divisor) {
Dave Houlton3c9fca72017-03-27 17:25:54 -0600928 VkDeviceSize result = 0;
929 if (divisor != 0) {
930 result = dividend % divisor;
931 }
932 return result;
933}