blob: 22fb52fef88784d9118d60d217ad395342318306 [file] [log] [blame]
Mark Lobodzinski288e4f72016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -06004 *
Mark Lobodzinski288e4f72016-02-02 15:55:36 -07005 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and/or associated documentation files (the "Materials"), to
7 * deal in the Materials without restriction, including without limitation the
8 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9 * sell copies of the Materials, and to permit persons to whom the Materials
10 * are furnished to do so, subject to the following conditions:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -060011 *
Mark Lobodzinski288e4f72016-02-02 15:55:36 -070012 * The above copyright notice(s) and this permission notice shall be included
13 * in all copies or substantial portions of the Materials.
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -060014 *
Mark Lobodzinski288e4f72016-02-02 15:55:36 -070015 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -060016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Mark Lobodzinski288e4f72016-02-02 15:55:36 -070017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 *
19 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
22 * USE OR OTHER DEALINGS IN THE MATERIALS
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -060023 *
Courtney Goeltzenleuchter96cd7952015-10-30 11:14:30 -060024 * Author: Mark Lobodzinski <mark@lunarg.com>
25 *
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -060026 */
27
28#include <string.h>
Mark Lobodzinskid4585f32016-01-05 11:32:53 -070029#include <string>
David Pinedo329ca9e2015-11-06 12:54:48 -070030#include "vulkan/vulkan.h"
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -060031#include "vk_layer_utils.h"
32
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070033
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -060034typedef struct _VULKAN_FORMAT_INFO {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070035 size_t size;
36 uint32_t channel_count;
37 VkFormatCompatibilityClass format_class;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -060038} VULKAN_FORMAT_INFO;
39
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070040
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -060041// Set up data structure with number of bytes and number of channels
42// for each Vulkan format.
Chia-I Wu1f851912015-10-27 18:04:07 +080043static const VULKAN_FORMAT_INFO vk_format_table[VK_FORMAT_RANGE_SIZE] = {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070044 { 0, 0, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }, // [VK_FORMAT_UNDEFINED]
45 { 1, 2, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT }, // [VK_FORMAT_R4G4_UNORM_PACK8]
46 { 2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R4G4B4A4_UNORM_PACK16]
47 { 2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_B4G4R4A4_UNORM_PACK16]
48 { 2, 3, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R5G6B5_UNORM_PACK16]
49 { 2, 3, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_B5G6R5_UNORM_PACK16]
50 { 2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R5G5B5A1_UNORM_PACK16]
51 { 2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_B5G5R5A1_UNORM_PACK16]
52 { 2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_A1R5G5B5_UNORM_PACK16]
53 { 1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT }, // [VK_FORMAT_R8_UNORM]
54 { 1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT }, // [VK_FORMAT_R8_SNORM]
55 { 1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT }, // [VK_FORMAT_R8_USCALED]
56 { 1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT }, // [VK_FORMAT_R8_SSCALED]
57 { 1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT }, // [VK_FORMAT_R8_UINT]
58 { 1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT }, // [VK_FORMAT_R8_SINT]
59 { 1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT }, // [VK_FORMAT_R8_SRGB]
60 { 2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R8G8_UNORM]
61 { 2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R8G8_SNORM]
62 { 2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R8G8_USCALED]
63 { 2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R8G8_SSCALED]
64 { 2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R8G8_UINT]
65 { 2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R8G8_SINT]
66 { 2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R8G8_SRGB]
67 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_R8G8B8_UNORM]
68 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_R8G8B8_SNORM]
69 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_R8G8B8_USCALED]
70 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_R8G8B8_SSCALED]
71 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_R8G8B8_UINT]
72 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_R8G8B8_SINT]
73 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_R8G8B8_SRGB]
74 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_B8G8R8_UNORM]
75 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_B8G8R8_SNORM]
76 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_B8G8R8_USCALED]
77 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_B8G8R8_SSCALED]
78 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_B8G8R8_UINT]
79 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_B8G8R8_SINT]
80 { 3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT }, // [VK_FORMAT_B8G8R8_SRGB]
81 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R8G8B8A8_UNORM]
82 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R8G8B8A8_SNORM]
83 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R8G8B8A8_USCALED]
84 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R8G8B8A8_SSCALED]
85 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R8G8B8A8_UINT]
86 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R8G8B8A8_SINT]
87 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R8G8B8A8_SRGB]
88 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_B8G8R8A8_UNORM]
89 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_B8G8R8A8_SNORM]
90 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_B8G8R8A8_USCALED]
91 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_B8G8R8A8_SSCALED]
92 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_B8G8R8A8_UINT]
93 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_B8G8R8A8_SINT]
94 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_B8G8R8A8_SRGB]
95 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A8B8G8R8_UNORM_PACK32]
96 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A8B8G8R8_SNORM_PACK32]
97 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A8B8G8R8_USCALED_PACK32]
98 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A8B8G8R8_SSCALED_PACK32]
99 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A8B8G8R8_UINT_PACK32]
100 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A8B8G8R8_SINT_PACK32]
101 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_B8G8R8A8_SRGB_PACK32]
102 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2R10G10B10_UNORM_PACK32]
103 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2R10G10B10_SNORM_PACK32]
104 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2R10G10B10_USCALED_PACK32]
105 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2R10G10B10_SSCALED_PACK32]
106 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2R10G10B10_UINT_PACK32]
107 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2R10G10B10_SINT_PACK32]
108 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2B10G10R10_UNORM_PACK32]
109 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2B10G10R10_SNORM_PACK32]
110 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2B10G10R10_USCALED_PACK32]
111 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2B10G10R10_SSCALED_PACK32]
112 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2B10G10R10_UINT_PACK32]
113 { 4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_A2B10G10R10_SINT_PACK32]
114 { 2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R16_UNORM]
115 { 2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R16_SNORM]
116 { 2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R16_USCALED]
117 { 2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R16_SSCALED]
118 { 2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R16_UINT]
119 { 2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R16_SINT]
120 { 2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT }, // [VK_FORMAT_R16_SFLOAT]
121 { 4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R16G16_UNORM]
122 { 4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R16G16_SNORM]
123 { 4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R16G16_USCALED]
124 { 4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R16G16_SSCALED]
125 { 4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R16G16_UINT]
126 { 4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R16G16_SINT]
127 { 4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R16G16_SFLOAT]
128 { 6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT }, // [VK_FORMAT_R16G16B16_UNORM]
129 { 6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT }, // [VK_FORMAT_R16G16B16_SNORM]
130 { 6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT }, // [VK_FORMAT_R16G16B16_USCALED]
131 { 6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT }, // [VK_FORMAT_R16G16B16_SSCALED]
132 { 6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT }, // [VK_FORMAT_R16G16B16_UINT]
133 { 6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT }, // [VK_FORMAT_R16G16B16_SINT]
134 { 6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT }, // [VK_FORMAT_R16G16B16_SFLOAT]
135 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R16G16B16A16_UNORM]
136 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R16G16B16A16_SNORM]
137 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R16G16B16A16_USCALED]
138 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R16G16B16A16_SSCALED]
139 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R16G16B16A16_UINT]
140 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R16G16B16A16_SINT]
141 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R16G16B16A16_SFLOAT]
142 { 4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R32_UINT]
143 { 4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R32_SINT]
144 { 4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_R32_SFLOAT]
145 { 8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R32G32_UINT]
146 { 8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R32G32_SINT]
147 { 8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R32G32_SFLOAT]
148 { 12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT }, // [VK_FORMAT_R32G32B32_UINT]
149 { 12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT }, // [VK_FORMAT_R32G32B32_SINT]
150 { 12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT }, // [VK_FORMAT_R32G32B32_SFLOAT]
151 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT }, // [VK_FORMAT_R32G32B32A32_UINT]
152 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT }, // [VK_FORMAT_R32G32B32A32_SINT]
153 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT }, // [VK_FORMAT_R32G32B32A32_SFLOAT]
154 { 8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R64_UINT]
155 { 8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R64_SINT]
156 { 8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT }, // [VK_FORMAT_R64_SFLOAT]
157 { 16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT }, // [VK_FORMAT_R64G64_UINT]
158 { 16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT }, // [VK_FORMAT_R64G64_SINT]
159 { 16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT }, // [VK_FORMAT_R64G64_SFLOAT]
160 { 24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT }, // [VK_FORMAT_R64G64B64_UINT]
161 { 24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT }, // [VK_FORMAT_R64G64B64_SINT]
162 { 24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT }, // [VK_FORMAT_R64G64B64_SFLOAT]
163 { 32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT }, // [VK_FORMAT_R64G64B64A64_UINT]
164 { 32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT }, // [VK_FORMAT_R64G64B64A64_SINT]
165 { 32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT }, // [VK_FORMAT_R64G64B64A64_SFLOAT]
166 { 4, 3, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_B10G11R11_UFLOAT_PACK32]
167 { 4, 3, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT }, // [VK_FORMAT_E5B9G9R9_UFLOAT_PACK32]
168 { 2, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }, // [VK_FORMAT_D16_UNORM]
169 { 3, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }, // [VK_FORMAT_X8_D24_UNORM_PACK32]
170 { 4, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }, // [VK_FORMAT_D32_SFLOAT]
171 { 1, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }, // [VK_FORMAT_S8_UINT]
172 { 3, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }, // [VK_FORMAT_D16_UNORM_S8_UINT]
173 { 4, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }, // [VK_FORMAT_D24_UNORM_S8_UINT]
174 { 4, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }, // [VK_FORMAT_D32_SFLOAT_S8_UINT]
175 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT }, // [VK_FORMAT_BC1_RGB_UNORM_BLOCK]
176 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT }, // [VK_FORMAT_BC1_RGB_SRGB_BLOCK]
177 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT }, // [VK_FORMAT_BC1_RGBA_UNORM_BLOCK]
178 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT }, // [VK_FORMAT_BC1_RGBA_SRGB_BLOCK]
179 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT }, // [VK_FORMAT_BC2_UNORM_BLOCK]
180 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT }, // [VK_FORMAT_BC2_SRGB_BLOCK]
181 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT }, // [VK_FORMAT_BC3_UNORM_BLOCK]
182 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT }, // [VK_FORMAT_BC3_SRGB_BLOCK]
183 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT }, // [VK_FORMAT_BC4_UNORM_BLOCK]
184 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT }, // [VK_FORMAT_BC4_SNORM_BLOCK]
185 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT }, // [VK_FORMAT_BC5_UNORM_BLOCK]
186 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT }, // [VK_FORMAT_BC5_SNORM_BLOCK]
187 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT }, // [VK_FORMAT_BC6H_UFLOAT_BLOCK]
188 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT }, // [VK_FORMAT_BC6H_SFLOAT_BLOCK]
189 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT }, // [VK_FORMAT_BC7_UNORM_BLOCK]
190 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT }, // [VK_FORMAT_BC7_SRGB_BLOCK]
191 { 8, 3, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT }, // [VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK]
192 { 8, 3, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT }, // [VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK]
193 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT }, // [VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK]
194 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT }, // [VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK]
195 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT }, // [VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK]
196 { 8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT }, // [VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK]
197 { 8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT }, // [VK_FORMAT_EAC_R11_UNORM_BLOCK]
198 { 8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT }, // [VK_FORMAT_EAC_R11_SNORM_BLOCK]
199 { 16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT }, // [VK_FORMAT_EAC_R11G11_UNORM_BLOCK]
200 { 16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT }, // [VK_FORMAT_EAC_R11G11_SNORM_BLOCK]
201 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT }, // [VK_FORMAT_ASTC_4x4_UNORM_BLOCK]
202 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT }, // [VK_FORMAT_ASTC_4x4_SRGB_BLOCK]
203 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT }, // [VK_FORMAT_ASTC_5x4_UNORM_BLOCK]
204 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT }, // [VK_FORMAT_ASTC_5x4_SRGB_BLOCK]
205 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT }, // [VK_FORMAT_ASTC_5x5_UNORM_BLOCK]
206 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT }, // [VK_FORMAT_ASTC_5x5_SRGB_BLOCK]
207 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT }, // [VK_FORMAT_ASTC_6x5_UNORM_BLOCK]
208 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT }, // [VK_FORMAT_ASTC_6x5_SRGB_BLOCK]
209 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT }, // [VK_FORMAT_ASTC_6x6_UNORM_BLOCK]
210 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT }, // [VK_FORMAT_ASTC_6x6_SRGB_BLOCK]
211 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT }, // [VK_FORMAT_ASTC_8x5_UNORM_BLOCK]
212 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT }, // [VK_FORMAT_ASTC_8x5_SRGB_BLOCK]
213 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT }, // [VK_FORMAT_ASTC_8x6_UNORM_BLOCK]
214 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT }, // [VK_FORMAT_ASTC_8x6_SRGB_BLOCK]
215 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT }, // [VK_FORMAT_ASTC_8x8_UNORM_BLOCK]
216 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT }, // [VK_FORMAT_ASTC_8x8_SRGB_BLOCK]
217 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT }, // [VK_FORMAT_ASTC_10x5_UNORM_BLOCK]
218 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT }, // [VK_FORMAT_ASTC_10x5_SRGB_BLOCK]
219 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT }, // [VK_FORMAT_ASTC_10x6_UNORM_BLOCK]
220 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT }, // [VK_FORMAT_ASTC_10x6_SRGB_BLOCK]
221 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT }, // [VK_FORMAT_ASTC_10x8_UNORM_BLOCK]
222 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT }, // [VK_FORMAT_ASTC_10x8_SRGB_BLOCK]
223 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT }, // [VK_FORMAT_ASTC_10x10_UNORM_BLOCK]
224 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT }, // [VK_FORMAT_ASTC_10x10_SRGB_BLOCK]
225 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT }, // [VK_FORMAT_ASTC_12x10_UNORM_BLOCK]
226 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT }, // [VK_FORMAT_ASTC_12x10_SRGB_BLOCK]
227 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT }, // [VK_FORMAT_ASTC_12x12_UNORM_BLOCK]
228 { 16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT }, // [VK_FORMAT_ASTC_12x12_SRGB_BLOCK]
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600229};
230
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600231// Return true if format is a depth or stencil format
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700232bool vk_format_is_depth_or_stencil(VkFormat format)
233{
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600234 return (vk_format_is_depth_and_stencil(format) ||
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700235 vk_format_is_depth_only(format) ||
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600236 vk_format_is_stencil_only(format));
237}
238
239// Return true if format contains depth and stencil information
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700240bool vk_format_is_depth_and_stencil(VkFormat format)
241{
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600242 bool is_ds = false;
243
244 switch (format) {
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600245 case VK_FORMAT_D16_UNORM_S8_UINT:
246 case VK_FORMAT_D24_UNORM_S8_UINT:
247 case VK_FORMAT_D32_SFLOAT_S8_UINT:
248 is_ds = true;
249 break;
250 default:
251 break;
252 }
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600253 return is_ds;
254}
255
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600256// Return true if format is a stencil-only format
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700257bool vk_format_is_stencil_only(VkFormat format)
258{
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600259 return (format == VK_FORMAT_S8_UINT);
260}
261
262// Return true if format is a depth-only format
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700263bool vk_format_is_depth_only(VkFormat format)
264{
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600265 bool is_depth = false;
266
267 switch (format) {
268 case VK_FORMAT_D16_UNORM:
Chia-I Wu9eabb8f2015-11-10 17:01:22 +0800269 case VK_FORMAT_X8_D24_UNORM_PACK32:
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600270 case VK_FORMAT_D32_SFLOAT:
271 is_depth = true;
272 break;
273 default:
274 break;
275 }
276
277 return is_depth;
278}
279
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600280// Return true if format is of time UNORM
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700281bool vk_format_is_norm(VkFormat format)
282{
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600283 bool is_norm = false;
284
285 switch (format) {
Chia-I Wu69c479e2015-11-10 17:01:22 +0800286 case VK_FORMAT_R4G4_UNORM_PACK8:
287 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
288 case VK_FORMAT_R5G6B5_UNORM_PACK16:
289 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
Chia-I Wu8c859742015-11-10 17:01:22 +0800290 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600291 case VK_FORMAT_R8_UNORM:
292 case VK_FORMAT_R8_SNORM:
293 case VK_FORMAT_R8G8_UNORM:
294 case VK_FORMAT_R8G8_SNORM:
295 case VK_FORMAT_R8G8B8_UNORM:
296 case VK_FORMAT_R8G8B8_SNORM:
297 case VK_FORMAT_R8G8B8A8_UNORM:
298 case VK_FORMAT_R8G8B8A8_SNORM:
Chia-I Wu8c859742015-11-10 17:01:22 +0800299 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
300 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
Chia-I Wu9eabb8f2015-11-10 17:01:22 +0800301 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
302 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600303 case VK_FORMAT_R16_UNORM:
304 case VK_FORMAT_R16_SNORM:
305 case VK_FORMAT_R16G16_UNORM:
306 case VK_FORMAT_R16G16_SNORM:
307 case VK_FORMAT_R16G16B16_UNORM:
308 case VK_FORMAT_R16G16B16_SNORM:
309 case VK_FORMAT_R16G16B16A16_UNORM:
310 case VK_FORMAT_R16G16B16A16_SNORM:
Chia-I Wu1fb46182015-11-10 16:44:23 +0800311 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
312 case VK_FORMAT_BC2_UNORM_BLOCK:
313 case VK_FORMAT_BC3_UNORM_BLOCK:
314 case VK_FORMAT_BC4_UNORM_BLOCK:
315 case VK_FORMAT_BC4_SNORM_BLOCK:
316 case VK_FORMAT_BC5_UNORM_BLOCK:
317 case VK_FORMAT_BC5_SNORM_BLOCK:
318 case VK_FORMAT_BC7_UNORM_BLOCK:
319 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
320 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
321 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
322 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
323 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
324 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
325 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
326 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
327 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
328 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
329 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
330 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
331 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
332 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
333 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
334 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
335 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
336 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
337 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
338 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
339 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
Chia-I Wu69c479e2015-11-10 17:01:22 +0800340 case VK_FORMAT_B5G6R5_UNORM_PACK16:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600341 case VK_FORMAT_B8G8R8_UNORM:
342 case VK_FORMAT_B8G8R8_SNORM:
343 case VK_FORMAT_B8G8R8A8_UNORM:
344 case VK_FORMAT_B8G8R8A8_SNORM:
Chia-I Wu9eabb8f2015-11-10 17:01:22 +0800345 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
346 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600347 is_norm = true;
348 break;
349 default:
350 break;
351 }
352
353 return is_norm;
354};
355
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700356
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600357// Return true if format is an integer format
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700358bool vk_format_is_int(VkFormat format)
359{
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600360 return (vk_format_is_sint(format) || vk_format_is_uint(format));
361}
362
363// Return true if format is an unsigned integer format
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700364bool vk_format_is_uint(VkFormat format)
365{
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600366 bool is_uint = false;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600367
368 switch (format) {
369 case VK_FORMAT_R8_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600370 case VK_FORMAT_R8G8_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600371 case VK_FORMAT_R8G8B8_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600372 case VK_FORMAT_R8G8B8A8_UINT:
Chia-I Wu8c859742015-11-10 17:01:22 +0800373 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
Chia-I Wu9eabb8f2015-11-10 17:01:22 +0800374 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600375 case VK_FORMAT_R16_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600376 case VK_FORMAT_R16G16_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600377 case VK_FORMAT_R16G16B16_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600378 case VK_FORMAT_R16G16B16A16_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600379 case VK_FORMAT_R32_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600380 case VK_FORMAT_R32G32_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600381 case VK_FORMAT_R32G32B32_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600382 case VK_FORMAT_R32G32B32A32_UINT:
Chia-I Wu8c859742015-11-10 17:01:22 +0800383 case VK_FORMAT_R64_UINT:
384 case VK_FORMAT_R64G64_UINT:
385 case VK_FORMAT_R64G64B64_UINT:
386 case VK_FORMAT_R64G64B64A64_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600387 case VK_FORMAT_B8G8R8_UINT:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600388 case VK_FORMAT_B8G8R8A8_UINT:
Chia-I Wu9eabb8f2015-11-10 17:01:22 +0800389 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600390 is_uint = true;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600391 break;
392 default:
393 break;
394 }
395
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600396 return is_uint;
397}
398
399// Return true if format is a signed integer format
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700400bool vk_format_is_sint(VkFormat format)
401{
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600402 bool is_sint = false;
403
404 switch (format) {
405 case VK_FORMAT_R8_SINT:
406 case VK_FORMAT_R8G8_SINT:
407 case VK_FORMAT_R8G8B8_SINT:
408 case VK_FORMAT_R8G8B8A8_SINT:
Chia-I Wu8c859742015-11-10 17:01:22 +0800409 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
Chia-I Wu9eabb8f2015-11-10 17:01:22 +0800410 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600411 case VK_FORMAT_R16_SINT:
412 case VK_FORMAT_R16G16_SINT:
413 case VK_FORMAT_R16G16B16_SINT:
414 case VK_FORMAT_R16G16B16A16_SINT:
415 case VK_FORMAT_R32_SINT:
416 case VK_FORMAT_R32G32_SINT:
417 case VK_FORMAT_R32G32B32_SINT:
418 case VK_FORMAT_R32G32B32A32_SINT:
Chia-I Wu8c859742015-11-10 17:01:22 +0800419 case VK_FORMAT_R64_SINT:
420 case VK_FORMAT_R64G64_SINT:
421 case VK_FORMAT_R64G64B64_SINT:
422 case VK_FORMAT_R64G64B64A64_SINT:
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600423 case VK_FORMAT_B8G8R8_SINT:
424 case VK_FORMAT_B8G8R8A8_SINT:
Chia-I Wu9eabb8f2015-11-10 17:01:22 +0800425 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
Mark Lobodzinskib4092de2015-10-23 14:20:31 -0600426 is_sint = true;
427 break;
428 default:
429 break;
430 }
431
432 return is_sint;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600433}
434
435// Return true if format is a floating-point format
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700436bool vk_format_is_float(VkFormat format)
437{
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600438 bool is_float = false;
439
440 switch (format) {
441 case VK_FORMAT_R16_SFLOAT:
442 case VK_FORMAT_R16G16_SFLOAT:
443 case VK_FORMAT_R16G16B16_SFLOAT:
444 case VK_FORMAT_R16G16B16A16_SFLOAT:
445 case VK_FORMAT_R32_SFLOAT:
446 case VK_FORMAT_R32G32_SFLOAT:
447 case VK_FORMAT_R32G32B32_SFLOAT:
448 case VK_FORMAT_R32G32B32A32_SFLOAT:
449 case VK_FORMAT_R64_SFLOAT:
450 case VK_FORMAT_R64G64_SFLOAT:
451 case VK_FORMAT_R64G64B64_SFLOAT:
452 case VK_FORMAT_R64G64B64A64_SFLOAT:
Chia-I Wu9eabb8f2015-11-10 17:01:22 +0800453 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
454 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
Chia-I Wu1fb46182015-11-10 16:44:23 +0800455 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
456 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600457 is_float = true;
458 break;
459 default:
460 break;
461 }
462
463 return is_float;
464}
465
466// Return true if format is in the SRGB colorspace
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700467bool vk_format_is_srgb(VkFormat format)
468{
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600469 bool is_srgb = false;
470
471 switch (format) {
472 case VK_FORMAT_R8_SRGB:
473 case VK_FORMAT_R8G8_SRGB:
474 case VK_FORMAT_R8G8B8_SRGB:
475 case VK_FORMAT_R8G8B8A8_SRGB:
Chia-I Wu8c859742015-11-10 17:01:22 +0800476 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
Chia-I Wu1fb46182015-11-10 16:44:23 +0800477 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
478 case VK_FORMAT_BC2_SRGB_BLOCK:
479 case VK_FORMAT_BC3_SRGB_BLOCK:
480 case VK_FORMAT_BC7_SRGB_BLOCK:
481 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
482 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
483 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
484 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
485 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
486 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
487 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
488 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
489 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
490 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
491 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
492 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
493 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
494 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
495 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
496 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
497 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600498 case VK_FORMAT_B8G8R8_SRGB:
499 case VK_FORMAT_B8G8R8A8_SRGB:
500 is_srgb = true;
501 break;
502 default:
503 break;
504 }
505
506 return is_srgb;
507}
508
509// Return true if format is compressed
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700510bool vk_format_is_compressed(VkFormat format)
511{
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600512 switch (format) {
Chia-I Wu1fb46182015-11-10 16:44:23 +0800513 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
514 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
515 case VK_FORMAT_BC2_UNORM_BLOCK:
516 case VK_FORMAT_BC2_SRGB_BLOCK:
517 case VK_FORMAT_BC3_UNORM_BLOCK:
518 case VK_FORMAT_BC3_SRGB_BLOCK:
519 case VK_FORMAT_BC4_UNORM_BLOCK:
520 case VK_FORMAT_BC4_SNORM_BLOCK:
521 case VK_FORMAT_BC5_UNORM_BLOCK:
522 case VK_FORMAT_BC5_SNORM_BLOCK:
523 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
524 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
525 case VK_FORMAT_BC7_UNORM_BLOCK:
526 case VK_FORMAT_BC7_SRGB_BLOCK:
527 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
528 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
529 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
530 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
531 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
532 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
533 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
534 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
535 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
536 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
537 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
538 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
539 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
540 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
541 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
542 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
543 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
544 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
545 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
546 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
547 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
548 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
549 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
550 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
551 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
552 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
553 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
554 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
555 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
556 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
557 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
558 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
559 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
560 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
561 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
562 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
563 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
564 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600565 return true;
566 default:
567 return false;
568 }
569}
570
Mark Lobodzinskifdd29d92016-01-08 11:07:56 -0700571// Return format class of the specified format
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700572VkFormatCompatibilityClass vk_format_get_compatibility_class(VkFormat format)
573{
Mark Lobodzinskifdd29d92016-01-08 11:07:56 -0700574 return vk_format_table[format].format_class;
575}
576
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600577// Return size, in bytes, of a pixel of the specified format
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700578size_t vk_format_get_size(VkFormat format)
579{
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600580 return vk_format_table[format].size;
581}
582
583// Return the number of channels for a given format
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700584unsigned int vk_format_get_channel_count(VkFormat format)
585{
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600586 return vk_format_table[format].channel_count;
587}
Mark Lobodzinski0fe21732016-01-13 10:23:15 -0700588
589// Perform a zero-tolerant modulo operation
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700590VkDeviceSize vk_safe_modulo(VkDeviceSize dividend, VkDeviceSize divisor)
591{
Mark Lobodzinski0fe21732016-01-13 10:23:15 -0700592 VkDeviceSize result = 0;
593 if (divisor != 0) {
594 result = dividend % divisor;
595 }
596 return result;
597}
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700598
599
Mark Lobodzinskibc9a9d82016-01-11 14:17:05 -0700600static const char UTF8_ONE_BYTE_CODE = 0xC0;
601static const char UTF8_ONE_BYTE_MASK = 0xE0;
602static const char UTF8_TWO_BYTE_CODE = 0xE0;
603static const char UTF8_TWO_BYTE_MASK = 0xF0;
604static const char UTF8_THREE_BYTE_CODE = 0xF0;
605static const char UTF8_THREE_BYTE_MASK = 0xF8;
606static const char UTF8_DATA_BYTE_CODE = 0x80;
607static const char UTF8_DATA_BYTE_MASK = 0xC0;
608
Mark Lobodzinskib2c8e082016-01-12 11:52:05 -0700609VkStringErrorFlags vk_string_validate(const int max_length, const char *utf8)
Mark Lobodzinskibc9a9d82016-01-11 14:17:05 -0700610{
Mark Lobodzinskib2c8e082016-01-12 11:52:05 -0700611 VkStringErrorFlags result = VK_STRING_ERROR_NONE;
Mark Lobodzinskib2c8e082016-01-12 11:52:05 -0700612 int num_char_bytes;
613 int i,j;
Mark Lobodzinskibc9a9d82016-01-11 14:17:05 -0700614
615 for (i = 0; i < max_length; i++)
616 {
617 if (utf8[i] == 0) {
618 break;
Mark Lobodzinski48706352016-02-12 11:30:14 -0700619 } else if ((utf8[i] >= 0x20) && (utf8[i] < 0x7f)) {
Mark Lobodzinskibc9a9d82016-01-11 14:17:05 -0700620 num_char_bytes = 0;
621 } else if ((utf8[i] & UTF8_ONE_BYTE_MASK) == UTF8_ONE_BYTE_CODE) {
622 num_char_bytes = 1;
623 } else if ((utf8[i] & UTF8_TWO_BYTE_MASK) == UTF8_TWO_BYTE_CODE) {
624 num_char_bytes = 2;
625 } else if ((utf8[i] & UTF8_THREE_BYTE_MASK) == UTF8_THREE_BYTE_CODE) {
626 num_char_bytes = 3;
627 } else {
628 result = VK_STRING_ERROR_BAD_DATA;
629 }
630
631 // Validate the following num_char_bytes of data
632 for (j = 0; (j < num_char_bytes) && (i < max_length); j++) {
633 if (++i == max_length) {
634 result |= VK_STRING_ERROR_LENGTH;
635 break;
636 }
637 if ((utf8[i] & UTF8_DATA_BYTE_MASK) != UTF8_DATA_BYTE_CODE) {
638 result |= VK_STRING_ERROR_BAD_DATA;
639 }
640 }
641 }
642 return result;
643}