blob: 1cdeec20fe7f82ee074045c0442d2c3e8afc1e11 [file] [log] [blame]
Mark Lobodzinski6eda00a2016-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.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07006 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and/or associated documentation files (the "Materials"), to
8 * deal in the Materials without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Materials, and to permit persons to whom the Materials
11 * are furnished to do so, subject to the following conditions:
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060012 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070013 * The above copyright notice(s) and this permission notice shall be included
14 * in all copies or substantial portions of the Materials.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060015 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070016 * The Materials are Confidential Information as defined by the Khronos
17 * Membership Agreement until designated non-confidential by Khronos, at which
18 * point this condition clause shall be removed.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060019 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070020 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060021 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070022 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 *
24 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
25 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
26 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
27 * USE OR OTHER DEALINGS IN THE MATERIALS
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060028 *
29 * Author: Jeremy Hayes <jeremy@lunarg.com>
30 * Author: Tony Barbour <tony@LunarG.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060031 */
32
33#include <stdio.h>
34#include <stdlib.h>
35#include <string.h>
36
37#include <iostream>
38#include <string>
39#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050040#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060041#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060042#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060043
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060044#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070045#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060046#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060047#include "vk_enum_validate_helper.h"
48#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060049
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060050#include "vk_layer_table.h"
51#include "vk_layer_data.h"
52#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060053#include "vk_layer_extension_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060054
Cody Northrop55443ef2015-09-28 15:09:32 -060055struct layer_data {
Jeremy Hayes99a96322015-06-26 12:48:09 -060056 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070057 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060058
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -070059 // TODO: Split instance/device structs
60 // Device Data
61 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060062 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
63
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -070064 layer_data() : report_data(nullptr){};
Cody Northrop55443ef2015-09-28 15:09:32 -060065};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050066
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -070067static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060068static device_table_map pc_device_table_map;
69static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060070
Jeremy Hayes99a96322015-06-26 12:48:09 -060071// "my instance data"
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -070072debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060073 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060074 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060075#if DISPATCH_MAP_DEBUG
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -070076 fprintf(stderr, "MID: map: %p, object: %p, key: %p, data: %p\n",
77 &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060078#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060079 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060080
81 return data->report_data;
82}
83
84// "my device data"
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -070085debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060086 dispatch_key key = get_dispatch_key(object);
87 layer_data *data = get_my_data_ptr(key, layer_data_map);
88#if DISPATCH_MAP_DEBUG
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -070089 fprintf(stderr, "MDD: map: %p, object: %p, key: %p, data: %p\n",
90 &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060091#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060092 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060093 return data->report_data;
94}
95
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -070096static void InitParamChecker(layer_data *data,
97 const VkAllocationCallbacks *pAllocator) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070098 VkDebugReportCallbackEXT callback;
Jeremy Hayes99a96322015-06-26 12:48:09 -060099 uint32_t report_flags = getLayerOptionFlags("ParamCheckerReportFlags", 0);
100
101 uint32_t debug_action = 0;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700102 getLayerOptionEnum("ParamCheckerDebugAction", (uint32_t *)&debug_action);
103 if (debug_action & VK_DBG_LAYER_ACTION_LOG_MSG) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600104 FILE *log_output = NULL;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700105 const char *option_str = getLayerOption("ParamCheckerLogFilename");
Tobin Ehlisb1df55e2015-09-15 09:55:54 -0600106 log_output = getLayerLogOutput(option_str, "ParamChecker");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700107 VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700108 memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700109 dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700110 dbgCreateInfo.flags = report_flags;
111 dbgCreateInfo.pfnCallback = log_callback;
112 dbgCreateInfo.pUserData = log_output;
113
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700114 layer_create_msg_callback(data->report_data, &dbgCreateInfo, pAllocator,
115 &callback);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -0600116 data->logging_callback.push_back(callback);
117 }
118
119 if (debug_action & VK_DBG_LAYER_ACTION_DEBUG_OUTPUT) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700120 VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700121 memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700122 dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700123 dbgCreateInfo.flags = report_flags;
124 dbgCreateInfo.pfnCallback = win32_debug_output_msg;
125 dbgCreateInfo.pUserData = NULL;
126
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700127 layer_create_msg_callback(data->report_data, &dbgCreateInfo, pAllocator,
128 &callback);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -0600129 data->logging_callback.push_back(callback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600130 }
131}
132
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700133VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700134 VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700135 const VkAllocationCallbacks *pAllocator,
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700136 VkDebugReportCallbackEXT *pMsgCallback) {
137 VkLayerInstanceDispatchTable *pTable =
138 get_dispatch_table(pc_instance_table_map, instance);
139 VkResult result = pTable->CreateDebugReportCallbackEXT(
140 instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600141
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700142 if (result == VK_SUCCESS) {
143 layer_data *data =
144 get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
145 result = layer_create_msg_callback(data->report_data, pCreateInfo,
146 pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600147 }
148
149 return result;
150}
151
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700152VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
153 vkDestroyDebugReportCallbackEXT(VkInstance instance,
154 VkDebugReportCallbackEXT msgCallback,
155 const VkAllocationCallbacks *pAllocator) {
156 VkLayerInstanceDispatchTable *pTable =
157 get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700158 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600159
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700160 layer_data *data =
161 get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700162 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600163}
164
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700165VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
166 vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
167 VkDebugReportObjectTypeEXT objType, uint64_t object,
168 size_t location, int32_t msgCode,
169 const char *pLayerPrefix, const char *pMsg) {
170 VkLayerInstanceDispatchTable *pTable =
171 get_dispatch_table(pc_instance_table_map, instance);
172 pTable->DebugReportMessageEXT(instance, flags, objType, object, location,
173 msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700174}
175
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700176static const VkExtensionProperties instance_extensions[] = {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700177 {VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600178
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700179VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
180 vkEnumerateInstanceExtensionProperties(const char *pLayerName,
181 uint32_t *pCount,
182 VkExtensionProperties *pProperties) {
183 return util_GetExtensionProperties(1, instance_extensions, pCount,
184 pProperties);
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600185}
186
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700187static const VkLayerProperties pc_global_layers[] = {{
188 "VK_LAYER_LUNARG_param_checker", VK_API_VERSION, VK_MAKE_VERSION(0, 1, 0),
189 "Validation layer: param_checker",
190}};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700191
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700192VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
193 vkEnumerateInstanceLayerProperties(uint32_t *pCount,
194 VkLayerProperties *pProperties) {
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600195 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers),
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700196 pc_global_layers, pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600197}
198
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700199VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
200 vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
201 const char *pLayerName,
202 uint32_t *pCount,
203 VkExtensionProperties *pProperties) {
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600204 /* ParamChecker does not have any physical device extensions */
Jon Ashburn751c4842015-11-02 17:37:20 -0700205 if (pLayerName == NULL) {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700206 return get_dispatch_table(pc_instance_table_map, physicalDevice)
207 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount,
208 pProperties);
Jon Ashburn751c4842015-11-02 17:37:20 -0700209 } else {
210 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
211 }
Jeremy Hayesad367152015-04-17 10:36:53 -0600212}
213
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700214VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
215 vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice,
216 uint32_t *pCount,
217 VkLayerProperties *pProperties) {
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600218 /* ParamChecker's physical device layers are the same as global */
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700219 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers),
220 pc_global_layers, pCount, pProperties);
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600221}
Jeremy Hayes99a96322015-06-26 12:48:09 -0600222
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600223// Version: 0.138.2
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600224
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700225static std::string EnumeratorString(VkResult const &enumerator) {
226 switch (enumerator) {
227 case VK_RESULT_MAX_ENUM: {
228 return "VK_RESULT_MAX_ENUM";
229 break;
230 }
231 case VK_ERROR_LAYER_NOT_PRESENT: {
232 return "VK_ERROR_LAYER_NOT_PRESENT";
233 break;
234 }
235 case VK_ERROR_INCOMPATIBLE_DRIVER: {
236 return "VK_ERROR_INCOMPATIBLE_DRIVER";
237 break;
238 }
239 case VK_ERROR_MEMORY_MAP_FAILED: {
240 return "VK_ERROR_MEMORY_MAP_FAILED";
241 break;
242 }
243 case VK_INCOMPLETE: {
244 return "VK_INCOMPLETE";
245 break;
246 }
247 case VK_ERROR_OUT_OF_HOST_MEMORY: {
248 return "VK_ERROR_OUT_OF_HOST_MEMORY";
249 break;
250 }
251 case VK_ERROR_INITIALIZATION_FAILED: {
252 return "VK_ERROR_INITIALIZATION_FAILED";
253 break;
254 }
255 case VK_NOT_READY: {
256 return "VK_NOT_READY";
257 break;
258 }
259 case VK_ERROR_OUT_OF_DEVICE_MEMORY: {
260 return "VK_ERROR_OUT_OF_DEVICE_MEMORY";
261 break;
262 }
263 case VK_EVENT_SET: {
264 return "VK_EVENT_SET";
265 break;
266 }
267 case VK_TIMEOUT: {
268 return "VK_TIMEOUT";
269 break;
270 }
271 case VK_EVENT_RESET: {
272 return "VK_EVENT_RESET";
273 break;
274 }
275 case VK_SUCCESS: {
276 return "VK_SUCCESS";
277 break;
278 }
279 case VK_ERROR_EXTENSION_NOT_PRESENT: {
280 return "VK_ERROR_EXTENSION_NOT_PRESENT";
281 break;
282 }
283 case VK_ERROR_DEVICE_LOST: {
284 return "VK_ERROR_DEVICE_LOST";
285 break;
286 }
287 default: {
288 return "unrecognized enumerator";
289 break;
290 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600291 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600292}
293
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700294static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600295 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600296 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT |
297 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
298 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT |
299 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
300 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
301 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT |
302 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
303 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT |
304 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
Cody Northrop61d6dd62015-08-18 14:58:29 -0600305 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT |
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700306 VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT |
Jon Ashburn766866a2016-01-22 15:39:20 -0700307 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700308 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600309 return false;
310 }
311
312 return true;
313}
314
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700315static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
316 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600317 return "unrecognized enumerator";
318 }
319
320 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700321 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600322 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
323 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700324 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600325 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
326 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700327 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600328 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
329 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700330 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600331 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
332 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700333 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600334 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
335 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700336 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600337 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
338 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700339 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600340 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
341 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700342 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600343 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
344 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700345 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600346 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
347 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700348 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600349 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
350 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700351 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800352 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600353 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700354 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800355 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600356 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700357 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700358 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
359 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600360
361 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700362 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600363 enumeratorString += string;
364
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700365 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600366 enumeratorString += '|';
367 }
368 }
369
370 return enumeratorString;
371}
372
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700373static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
374 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
375 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600376 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700377 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_STORAGE_BIT |
378 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600379 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800380 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700381 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600382 return false;
383 }
384
385 return true;
386}
387
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700388static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
389 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600390 return "unrecognized enumerator";
391 }
392
393 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700394 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600395 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
396 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700397 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600398 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600399 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700400 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600401 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
402 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700403 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600404 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
405 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700406 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600407 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
408 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700409 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800410 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600411 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700412 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600413 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
414 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700415 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800416 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600417 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600418
419 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700420 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600421 enumeratorString += string;
422
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700423 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600424 enumeratorString += '|';
425 }
426 }
427
428 return enumeratorString;
429}
430
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700431static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
432 VkQueueFlagBits allFlags =
433 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT |
434 VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
435 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600436 return false;
437 }
438
439 return true;
440}
441
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700442static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
443 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600444 return "unrecognized enumerator";
445 }
446
447 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700448 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800449 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600450 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700451 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600452 strings.push_back("VK_QUEUE_COMPUTE_BIT");
453 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700454 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800455 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600456 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700457 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600458 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
459 }
460
461 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700462 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600463 enumeratorString += string;
464
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700465 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600466 enumeratorString += '|';
467 }
468 }
469
470 return enumeratorString;
471}
472
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700473static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
474 VkMemoryPropertyFlagBits allFlags =
475 (VkMemoryPropertyFlagBits)(VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT |
476 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
477 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
478 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
479 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
480 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600481 return false;
482 }
483
484 return true;
485}
486
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700487static std::string
488EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
489 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600490 return "unrecognized enumerator";
491 }
492
493 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700494 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600495 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
496 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700497 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800498 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600499 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700500 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600501 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
502 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700503 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800504 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600505 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700506 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800507 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600508 }
509
510 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700511 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600512 enumeratorString += string;
513
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700514 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600515 enumeratorString += '|';
516 }
517 }
518
519 return enumeratorString;
520}
521
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700522static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
523 VkMemoryHeapFlagBits allFlags =
524 (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
525 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600526 return false;
527 }
528
529 return true;
530}
531
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700532static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
533 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600534 return "unrecognized enumerator";
535 }
536
537 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700538 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800539 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600540 }
541
542 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700543 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600544 enumeratorString += string;
545
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700546 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600547 enumeratorString += '|';
548 }
549 }
550
551 return enumeratorString;
552}
553
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700554static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
555 VkSparseImageFormatFlagBits allFlags = (VkSparseImageFormatFlagBits)(
556 VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800557 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT |
558 VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700559 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600560 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600561 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600562
563 return true;
564}
565
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700566static std::string
567EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
568 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600569 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600570 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600571
572 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700573 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800574 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600575 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700576 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800577 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600578 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700579 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800580 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600581 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600582
583 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700584 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600585 enumeratorString += string;
586
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700587 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600588 enumeratorString += '|';
589 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600590 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600591
592 return enumeratorString;
593}
594
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700595static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
596 VkFenceCreateFlagBits allFlags =
597 (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
598 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600599 return false;
600 }
601
602 return true;
603}
604
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700605static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
606 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600607 return "unrecognized enumerator";
608 }
609
610 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700611 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600612 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
613 }
614
615 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700616 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600617 enumeratorString += string;
618
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700619 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600620 enumeratorString += '|';
621 }
622 }
623
624 return enumeratorString;
625}
626
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700627static bool
628ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
629 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
630 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600631 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
632 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT |
633 VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
634 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT |
635 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
636 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT |
637 VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
638 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
639 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
640 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700641 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600642 return false;
643 }
644
645 return true;
646}
647
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700648static std::string
649EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
650 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600651 return "unrecognized enumerator";
652 }
653
654 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700655 if (enumerator &
656 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
657 strings.push_back(
658 "VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600659 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700660 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
661 strings.push_back(
662 "VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600663 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700664 if (enumerator &
665 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
666 strings.push_back(
667 "VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600668 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700669 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
670 strings.push_back(
671 "VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600672 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700673 if (enumerator &
674 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
675 strings.push_back(
676 "VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600677 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700678 if (enumerator &
679 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
680 strings.push_back(
681 "VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600682 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700683 if (enumerator &
684 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
685 strings.push_back(
686 "VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600687 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700688 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
689 strings.push_back(
690 "VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600691 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700692 if (enumerator &
693 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
694 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_"
695 "SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600696 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700697 if (enumerator &
698 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
699 strings.push_back(
700 "VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600701 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700702 if (enumerator &
703 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
704 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_"
705 "SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600706 }
707
708 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700709 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600710 enumeratorString += string;
711
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700712 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600713 enumeratorString += '|';
714 }
715 }
716
717 return enumeratorString;
718}
719
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700720static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
721 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(
722 VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
723 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
724 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600725 return false;
726 }
727
728 return true;
729}
730
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700731static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
732 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600733 return "unrecognized enumerator";
734 }
735
736 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700737 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600738 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
739 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700740 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600741 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
742 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700743 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600744 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
745 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700746 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600747 strings.push_back("VK_QUERY_RESULT_64_BIT");
748 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600749
750 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700751 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600752 enumeratorString += string;
753
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700754 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600755 enumeratorString += '|';
756 }
757 }
758
759 return enumeratorString;
760}
761
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700762static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
763 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
764 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
Jeremy Hayes99a96322015-06-26 12:48:09 -0600765 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
766 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT |
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700767 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
Jeremy Hayes99a96322015-06-26 12:48:09 -0600768 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700769 VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
770 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600771 return false;
772 }
773
774 return true;
775}
776
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700777static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
778 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600779 return "unrecognized enumerator";
780 }
781
782 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700783 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600784 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
785 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700786 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600787 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
788 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700789 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600790 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
791 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700792 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600793 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
794 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700795 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600796 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
797 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700798 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800799 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600800 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700801 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600802 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
803 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700804 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800805 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600806 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700807 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600808 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
809 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600810
811 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700812 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600813 enumeratorString += string;
814
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700815 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600816 enumeratorString += '|';
817 }
818 }
819
820 return enumeratorString;
821}
822
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700823static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
824 VkBufferCreateFlagBits allFlags =
825 (VkBufferCreateFlagBits)(VK_BUFFER_CREATE_SPARSE_ALIASED_BIT |
826 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT |
827 VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
828 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600829 return false;
830 }
831
832 return true;
833}
834
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700835static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
836 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600837 return "unrecognized enumerator";
838 }
839
840 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700841 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600842 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
843 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700844 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600845 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
846 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700847 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600848 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600849 }
850
851 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700852 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600853 enumeratorString += string;
854
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700855 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600856 enumeratorString += '|';
857 }
858 }
859
860 return enumeratorString;
861}
862
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700863static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
864 VkImageCreateFlagBits allFlags =
865 (VkImageCreateFlagBits)(VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT |
866 VK_IMAGE_CREATE_SPARSE_ALIASED_BIT |
867 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
868 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT |
869 VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
870 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600871 return false;
872 }
873
874 return true;
875}
876
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700877static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
878 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600879 return "unrecognized enumerator";
880 }
881
882 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700883 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600884 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
885 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700886 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600887 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
888 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700889 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600890 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
891 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700892 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600893 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
894 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700895 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600896 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600897 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600898
899 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700900 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600901 enumeratorString += string;
902
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700903 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600904 enumeratorString += '|';
905 }
906 }
907
908 return enumeratorString;
909}
910
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700911static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
912 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(
913 VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
914 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
915 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600916 return false;
917 }
918
919 return true;
920}
921
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700922static std::string
923EnumeratorString(VkColorComponentFlagBits const &enumerator) {
924 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600925 return "unrecognized enumerator";
926 }
927
928 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700929 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800930 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600931 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700932 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800933 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600934 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700935 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800936 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600937 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700938 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800939 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600940 }
941
942 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700943 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600944 enumeratorString += string;
945
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700946 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600947 enumeratorString += '|';
948 }
949 }
950
951 return enumeratorString;
952}
953
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700954static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
955 VkPipelineCreateFlagBits allFlags =
956 (VkPipelineCreateFlagBits)(VK_PIPELINE_CREATE_DERIVATIVE_BIT |
957 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT |
958 VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
959 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600960 return false;
961 }
962
963 return true;
964}
965
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700966static std::string
967EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
968 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600969 return "unrecognized enumerator";
970 }
971
972 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700973 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600974 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
975 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700976 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600977 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
978 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700979 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600980 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600981 }
982
983 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700984 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600985 enumeratorString += string;
986
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700987 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600988 enumeratorString += '|';
989 }
990 }
991
992 return enumeratorString;
993}
994
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -0700995static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
996 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
997 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT |
998 VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600999 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT |
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001000 VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
1001 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001002 return false;
1003 }
1004
1005 return true;
1006}
1007
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001008static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
1009 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001010 return "unrecognized enumerator";
1011 }
1012
1013 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001014 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001015 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001016 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001017 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001018 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001019 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001020 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001021 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
1022 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001023 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001024 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
1025 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001026 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001027 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001028 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001029 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001030 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001031 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001032 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001033 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001034 }
1035
1036 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001037 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001038 enumeratorString += string;
1039
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001040 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001041 enumeratorString += '|';
1042 }
1043 }
1044
1045 return enumeratorString;
1046}
1047
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001048static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +08001049 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Chia-I Wu89d0f942015-10-31 00:31:16 +08001050 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT |
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001051 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
1052 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001053 VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001054 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001055 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001056 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
1057 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
1058 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
1059 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
1060 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
1061 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
1062 VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
1063 VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
1064 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001065 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001066 return false;
1067 }
1068
1069 return true;
1070}
1071
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001072static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
1073 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001074 return "unrecognized enumerator";
1075 }
1076
1077 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001078 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +08001079 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
1080 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001081 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +08001082 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001083 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001084 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001085 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001086 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001087 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001088 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001089 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001090 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001091 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001092 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001093 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001094 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001095 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001096 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001097 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001098 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001099 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001100 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001101 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001102 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001103 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001104 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001105 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001106 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001107 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001108 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001109 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
1110 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001111 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001112 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
1113 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001114 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
1115 strings.push_back(
1116 "VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001117 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001118 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001119 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
1120 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001121 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001122 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
1123 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001124 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001125 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
1126 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001127 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001128 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001129 }
1130
1131 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001132 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001133 enumeratorString += string;
1134
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001135 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001136 enumeratorString += '|';
1137 }
1138 }
1139
1140 return enumeratorString;
1141}
1142
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001143static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +08001144 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001145 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT |
1146 VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_UNIFORM_READ_BIT |
1147 VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
1148 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
1149 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
1150 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
1151 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
1152 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
1153 VK_ACCESS_HOST_READ_BIT | VK_ACCESS_HOST_WRITE_BIT |
1154 VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT);
Chia-I Wua4594202015-10-27 19:54:37 +08001155
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001156 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001157 return false;
1158 }
1159
1160 return true;
1161}
1162
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001163static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
1164 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001165 return "unrecognized enumerator";
1166 }
1167
1168 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001169 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001170 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001171 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001172 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001173 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001174 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001175 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001176 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001177 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001178 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001179 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001180 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001181 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001182 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001183 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001184 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001185 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001186 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001187 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001188 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001189 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001190 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001191 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001192 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001193 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001194 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001195 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001196 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001197 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001198 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001199 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001200 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001201 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001202 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001203 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001204 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001205 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001206 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001207 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001208 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001209 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001210 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001211 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001212 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001213 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001214 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001215 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001216 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001217 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001218 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001219 }
1220
1221 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001222 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001223 enumeratorString += string;
1224
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001225 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001226 enumeratorString += '|';
1227 }
1228 }
1229
1230 return enumeratorString;
1231}
1232
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001233static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1234 VkCommandPoolCreateFlagBits allFlags = (VkCommandPoolCreateFlagBits)(
1235 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001236 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001237 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001238 return false;
1239 }
1240
1241 return true;
1242}
1243
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001244static std::string
1245EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1246 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001247 return "unrecognized enumerator";
1248 }
1249
1250 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001251 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001252 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001253 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001254 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001255 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001256 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001257
1258 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001259 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001260 enumeratorString += string;
1261
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001262 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001263 enumeratorString += '|';
1264 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001265 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001266
1267 return enumeratorString;
1268}
1269
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001270static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
1271 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(
1272 VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
1273 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001274 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001275 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001276
1277 return true;
1278}
1279
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001280static std::string
1281EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1282 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001283 return "unrecognized enumerator";
1284 }
1285
1286 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001287 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001288 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001289 }
1290
1291 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001292 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001293 enumeratorString += string;
1294
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001295 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001296 enumeratorString += '|';
1297 }
1298 }
1299
1300 return enumeratorString;
1301}
1302
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001303static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1304 VkCommandBufferUsageFlags allFlags = (VkCommandBufferUsageFlags)(
1305 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001306 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1307 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001308 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001309 return false;
1310 }
1311
1312 return true;
1313}
1314
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001315static std::string
1316EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1317 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001318 return "unrecognized enumerator";
1319 }
1320
1321 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001322 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001323 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001324 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001325 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001326 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001327 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001328 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001329 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001330 }
1331
1332 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001333 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001334 enumeratorString += string;
1335
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001336 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001337 enumeratorString += '|';
1338 }
1339 }
1340
1341 return enumeratorString;
1342}
1343
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001344static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
1345 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(
1346 VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
1347 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001348 return false;
1349 }
1350
1351 return true;
1352}
1353
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001354static std::string
1355EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1356 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001357 return "unrecognized enumerator";
1358 }
1359
1360 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001361 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001362 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001363 }
1364
1365 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001366 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001367 enumeratorString += string;
1368
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001369 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001370 enumeratorString += '|';
1371 }
1372 }
1373
1374 return enumeratorString;
1375}
1376
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001377static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1378 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(
1379 VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1380 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1381 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001382 return false;
1383 }
1384
1385 return true;
1386}
1387
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001388static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1389 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001390 return "unrecognized enumerator";
1391 }
1392
1393 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001394 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001395 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1396 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001397 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001398 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1399 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001400 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001401 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1402 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001403 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001404 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1405 }
1406
1407 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001408 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001409 enumeratorString += string;
1410
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001411 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001412 enumeratorString += '|';
1413 }
1414 }
1415
1416 return enumeratorString;
1417}
1418
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001419static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
1420 VkQueryControlFlagBits allFlags =
1421 (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
1422 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001423 return false;
1424 }
1425
1426 return true;
1427}
1428
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001429static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1430 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001431 return "unrecognized enumerator";
1432 }
1433
1434 std::vector<std::string> strings;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001435 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001436 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001437 }
1438
1439 std::string enumeratorString;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001440 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001441 enumeratorString += string;
1442
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001443 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001444 enumeratorString += '|';
1445 }
1446 }
1447
1448 return enumeratorString;
1449}
1450
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001451VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1452 vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
1453 const VkAllocationCallbacks *pAllocator,
1454 VkInstance *pInstance) {
1455 VkLayerInstanceCreateInfo *chain_info =
1456 get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001457
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001458 assert(chain_info->u.pLayerInfo);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001459 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr =
1460 chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1461 PFN_vkCreateInstance fpCreateInstance =
1462 (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001463 if (fpCreateInstance == NULL) {
1464 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001465 }
1466
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001467 // Advance the link info for the next element on the chain
1468 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1469
1470 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
1471 if (result != VK_SUCCESS)
Jeremy Hayes99a96322015-06-26 12:48:09 -06001472 return result;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001473
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001474 layer_data *my_data =
1475 get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1476 VkLayerInstanceDispatchTable *pTable = initInstanceTable(
1477 *pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001478
1479 my_data->report_data = debug_report_create_instance(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001480 pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1481 pCreateInfo->ppEnabledExtensionNames);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001482
1483 InitParamChecker(my_data, pAllocator);
1484
1485 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001486}
1487
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001488VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1489 vkDestroyInstance(VkInstance instance,
1490 const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001491 // Grab the key before the instance is destroyed.
1492 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001493 VkLayerInstanceDispatchTable *pTable =
1494 get_dispatch_table(pc_instance_table_map, instance);
Chia-I Wuf7458c52015-10-26 21:10:41 +08001495 pTable->DestroyInstance(instance, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001496
1497 // Clean up logging callback, if any
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001498 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1499 while (my_data->logging_callback.size() > 0) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001500 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -07001501 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001502 my_data->logging_callback.pop_back();
Jeremy Hayes99a96322015-06-26 12:48:09 -06001503 }
1504
1505 layer_debug_report_destroy_instance(mid(instance));
1506 layer_data_map.erase(pTable);
1507
1508 pc_instance_table_map.erase(key);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001509}
1510
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001511bool PostEnumeratePhysicalDevices(VkInstance instance,
1512 uint32_t *pPhysicalDeviceCount,
1513 VkPhysicalDevice *pPhysicalDevices,
1514 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001515
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001516 if (pPhysicalDeviceCount != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001517 }
1518
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001519 if (pPhysicalDevices != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001520 }
1521
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001522 if (result < VK_SUCCESS) {
1523 std::string reason =
1524 "vkEnumeratePhysicalDevices parameter, VkResult result, is " +
1525 EnumeratorString(result);
1526 log_msg(mid(instance), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1527 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1528 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001529 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001530 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001531
1532 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001533}
1534
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001535VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1536 vkEnumeratePhysicalDevices(VkInstance instance,
1537 uint32_t *pPhysicalDeviceCount,
1538 VkPhysicalDevice *pPhysicalDevices) {
1539 VkResult result = get_dispatch_table(pc_instance_table_map, instance)
1540 ->EnumeratePhysicalDevices(
1541 instance, pPhysicalDeviceCount, pPhysicalDevices);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001542
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001543 PostEnumeratePhysicalDevices(instance, pPhysicalDeviceCount,
1544 pPhysicalDevices, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001545
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001546 return result;
1547}
1548
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001549bool PostGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice,
1550 VkPhysicalDeviceFeatures *pFeatures) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001551
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001552 if (pFeatures != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001553 }
1554
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001555 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001556}
1557
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001558VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1559 vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice,
1560 VkPhysicalDeviceFeatures *pFeatures) {
1561 get_dispatch_table(pc_instance_table_map, physicalDevice)
1562 ->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001563
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06001564 PostGetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001565}
1566
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001567bool
1568PostGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice,
1569 VkFormat format,
1570 VkFormatProperties *pFormatProperties) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001571
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001572 if (format < VK_FORMAT_BEGIN_RANGE || format > VK_FORMAT_END_RANGE) {
1573 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1574 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1575 "vkGetPhysicalDeviceFormatProperties parameter, VkFormat "
1576 "format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001577 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001578 }
1579
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001580 if (pFormatProperties != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001581 }
1582
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001583 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001584}
1585
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001586VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1587 vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice,
1588 VkFormat format,
1589 VkFormatProperties *pFormatProperties) {
1590 get_dispatch_table(pc_instance_table_map, physicalDevice)
1591 ->GetPhysicalDeviceFormatProperties(physicalDevice, format,
1592 pFormatProperties);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001593
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001594 PostGetPhysicalDeviceFormatProperties(physicalDevice, format,
1595 pFormatProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001596}
1597
1598bool PostGetPhysicalDeviceImageFormatProperties(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001599 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1600 VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags,
1601 VkImageFormatProperties *pImageFormatProperties, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001602
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001603 if (format < VK_FORMAT_BEGIN_RANGE || format > VK_FORMAT_END_RANGE) {
1604 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1605 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1606 "vkGetPhysicalDeviceImageFormatProperties parameter, VkFormat "
1607 "format, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001608 return false;
1609 }
1610
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001611 if (type < VK_IMAGE_TYPE_BEGIN_RANGE || type > VK_IMAGE_TYPE_END_RANGE) {
1612 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1613 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1614 "vkGetPhysicalDeviceImageFormatProperties parameter, "
1615 "VkImageType type, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001616 return false;
1617 }
1618
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001619 if (tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
1620 tiling > VK_IMAGE_TILING_END_RANGE) {
1621 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1622 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1623 "vkGetPhysicalDeviceImageFormatProperties parameter, "
1624 "VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001625 return false;
1626 }
1627
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001628 if (pImageFormatProperties != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001629 }
1630
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001631 if (result < VK_SUCCESS) {
1632 std::string reason = "vkGetPhysicalDeviceImageFormatProperties "
1633 "parameter, VkResult result, is " +
1634 EnumeratorString(result);
1635 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1636 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1637 "%s", reason.c_str());
Chia-I Wu17241042015-10-31 00:31:16 +08001638 return false;
1639 }
1640
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001641 return true;
1642}
1643
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001644VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1645 vkGetPhysicalDeviceImageFormatProperties(
1646 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1647 VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags,
1648 VkImageFormatProperties *pImageFormatProperties) {
1649 VkResult result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1650 ->GetPhysicalDeviceImageFormatProperties(
1651 physicalDevice, format, type, tiling, usage,
1652 flags, pImageFormatProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001653
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001654 PostGetPhysicalDeviceImageFormatProperties(physicalDevice, format, type,
1655 tiling, usage, flags,
1656 pImageFormatProperties, result);
Chia-I Wu17241042015-10-31 00:31:16 +08001657
1658 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001659}
1660
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001661bool PostGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,
1662 VkPhysicalDeviceProperties *pProperties) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001663
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001664 if (pProperties != nullptr) {
1665 if (pProperties->deviceType < VK_PHYSICAL_DEVICE_TYPE_BEGIN_RANGE ||
1666 pProperties->deviceType > VK_PHYSICAL_DEVICE_TYPE_END_RANGE) {
1667 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1668 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1669 "vkGetPhysicalDeviceProperties parameter, "
1670 "VkPhysicalDeviceType pProperties->deviceType, is an "
1671 "unrecognized enumerator");
1672 return false;
1673 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001674 }
1675
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001676 return true;
1677}
1678
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001679VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1680 vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,
1681 VkPhysicalDeviceProperties *pProperties) {
1682 get_dispatch_table(pc_instance_table_map, physicalDevice)
1683 ->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001684
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06001685 PostGetPhysicalDeviceProperties(physicalDevice, pProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001686}
1687
Cody Northropd0802882015-08-03 17:04:53 -06001688bool PostGetPhysicalDeviceQueueFamilyProperties(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001689 VkPhysicalDevice physicalDevice, uint32_t *pCount,
1690 VkQueueFamilyProperties *pQueueProperties) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001691
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001692 if (pQueueProperties == nullptr && pCount != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001693 }
1694
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001695 if (pQueueProperties != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001696 }
1697
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001698 return true;
1699}
1700
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001701VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1702 vkGetPhysicalDeviceQueueFamilyProperties(
1703 VkPhysicalDevice physicalDevice, uint32_t *pCount,
1704 VkQueueFamilyProperties *pQueueProperties) {
1705 get_dispatch_table(pc_instance_table_map, physicalDevice)
1706 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pCount,
1707 pQueueProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001708
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001709 PostGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pCount,
1710 pQueueProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001711}
1712
1713bool PostGetPhysicalDeviceMemoryProperties(
1714 VkPhysicalDevice physicalDevice,
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001715 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001716
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001717 if (pMemoryProperties != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001718 }
1719
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001720 return true;
1721}
1722
Chia-I Wu9ab61502015-11-06 06:42:02 +08001723VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties(
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001724 VkPhysicalDevice physicalDevice,
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001725 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1726 get_dispatch_table(pc_instance_table_map, physicalDevice)
1727 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001728
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06001729 PostGetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001730}
1731
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001732void validateDeviceCreateInfo(
1733 VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1734 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001735 std::unordered_set<uint32_t> set;
1736 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1737 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001738 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1739 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1740 "VkDeviceCreateInfo parameter, uint32_t "
1741 "pQueueCreateInfos[%d]->queueFamilyIndex, is not unique "
1742 "within this structure.",
1743 i);
Michael Lentine157a2ec2016-01-27 11:25:05 -06001744 } else {
1745 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
1746 }
Michael Lentine26244832016-01-27 11:40:27 -06001747 if (pCreateInfo->pQueueCreateInfos[i].queueCount == 0) {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001748 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1749 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1750 "VkDeviceCreateInfo parameter, uint32_t "
1751 "pQueueCreateInfos[%d]->queueCount, cannot be zero.",
1752 i);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001753 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001754 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount;
1755 ++j) {
1756 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f ||
1757 pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f) {
1758 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1759 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1760 "PARAMCHECK", "VkDeviceCreateInfo parameter, uint32_t "
1761 "pQueueCreateInfos[%d]->pQueuePriorities["
1762 "%d], must be between 0 and 1. Actual "
1763 "value is %f",
1764 i, j,
1765 pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001766 }
Michael Lentine26244832016-01-27 11:40:27 -06001767 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001768 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >=
1769 properties.size()) {
1770 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1771 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1772 "VkDeviceCreateInfo parameter, uint32_t "
1773 "pQueueCreateInfos[%d]->queueFamilyIndex cannot be more "
1774 "than the number of queue families.",
1775 i);
1776 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1777 properties[pCreateInfo->pQueueCreateInfos[i]
1778 .queueFamilyIndex].queueCount) {
1779 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1780 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1781 "VkDeviceCreateInfo parameter, uint32_t "
1782 "pQueueCreateInfos[%d]->queueCount cannot be more than the "
1783 "number of queues for the given family index.",
1784 i);
Michael Lentine774704f2016-01-27 13:36:46 -06001785 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001786 }
1787}
1788
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001789void storeCreateDeviceData(VkDevice device,
1790 const VkDeviceCreateInfo *pCreateInfo) {
1791 layer_data *my_device_data =
1792 get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001793 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1794 my_device_data->queueFamilyIndexMap.insert(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001795 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex,
1796 pCreateInfo->pQueueCreateInfos[i].queueCount));
Michael Lentinebdf744f2016-01-27 15:43:43 -06001797 }
1798}
1799
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001800VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1801 vkCreateDevice(VkPhysicalDevice physicalDevice,
1802 const VkDeviceCreateInfo *pCreateInfo,
1803 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001804 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001805 * NOTE: We do not validate physicalDevice or any dispatchable
1806 * object as the first parameter. We couldn't get here if it was wrong!
1807 */
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001808 VkLayerDeviceCreateInfo *chain_info =
1809 get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001810
1811 assert(chain_info->u.pLayerInfo);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001812 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr =
1813 chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1814 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr =
1815 chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
1816 PFN_vkCreateDevice fpCreateDevice =
1817 (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001818 if (fpCreateDevice == NULL) {
1819 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001820 }
1821
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001822 // Advance the link info for the next element on the chain
1823 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1824
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001825 VkResult result =
1826 fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001827 if (result != VK_SUCCESS) {
1828 return result;
1829 }
1830
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001831 layer_data *my_instance_data =
1832 get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1833 layer_data *my_device_data =
1834 get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1835 my_device_data->report_data = layer_debug_report_create_device(
1836 my_instance_data->report_data, *pDevice);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001837 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1838
Michael Lentine774704f2016-01-27 13:36:46 -06001839 uint32_t count;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001840 get_dispatch_table(pc_instance_table_map, physicalDevice)
1841 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count,
1842 nullptr);
Michael Lentine774704f2016-01-27 13:36:46 -06001843 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001844 get_dispatch_table(pc_instance_table_map, physicalDevice)
1845 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count,
1846 &properties[0]);
Michael Lentine774704f2016-01-27 13:36:46 -06001847
1848 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001849 storeCreateDeviceData(*pDevice, pCreateInfo);
Michael Lentine157a2ec2016-01-27 11:25:05 -06001850
Jeremy Hayes99a96322015-06-26 12:48:09 -06001851 return result;
1852}
1853
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001854VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1855 vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001856 layer_debug_report_destroy_device(device);
1857
1858 dispatch_key key = get_dispatch_key(device);
1859#if DISPATCH_MAP_DEBUG
1860 fprintf(stderr, "Device: %p, key: %p\n", device, key);
1861#endif
1862
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001863 get_dispatch_table(pc_device_table_map, device)
1864 ->DestroyDevice(device, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001865 pc_device_table_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001866}
1867
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001868bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex,
1869 uint32_t queueIndex) {
1870 layer_data *my_device_data =
1871 get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1872 auto queue_data =
1873 my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001874 if (queue_data == my_device_data->queueFamilyIndexMap.end()) {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001875 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1876 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1877 "VkGetDeviceQueue parameter, uint32_t queueFamilyIndex %d, "
1878 "must have been given when the device was created.",
1879 queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001880 return false;
1881 }
1882 if (queue_data->second <= queueIndex) {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001883 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1884 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1885 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be "
1886 "less than the number of queues given when the device was "
1887 "created.",
1888 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001889 return false;
1890 }
1891 return true;
1892}
1893
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001894bool PostGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex,
1895 uint32_t queueIndex, VkQueue *pQueue) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001896
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001897 if (pQueue != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001898 }
1899
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001900 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001901}
1902
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001903VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1904 vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex,
1905 uint32_t queueIndex, VkQueue *pQueue) {
Michael Lentinebdf744f2016-01-27 15:43:43 -06001906 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1907
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001908 get_dispatch_table(pc_device_table_map, device)
1909 ->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001910
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06001911 PostGetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001912}
1913
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001914bool PreQueueSubmit(VkQueue queue, const VkSubmitInfo *submit) {
1915 if (submit->sType != VK_STRUCTURE_TYPE_SUBMIT_INFO) {
1916 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1917 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1918 "vkQueueSubmit parameter, VkStructureType pSubmits->sType, is "
1919 "an invalid enumerator");
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001920 return false;
1921 }
1922
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001923 if (submit->pCommandBuffers != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001924 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001925
1926 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001927}
1928
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001929bool PostQueueSubmit(VkQueue queue, uint32_t commandBufferCount, VkFence fence,
1930 VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001931
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001932 if (result < VK_SUCCESS) {
1933 std::string reason = "vkQueueSubmit parameter, VkResult result, is " +
1934 EnumeratorString(result);
1935 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1936 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1937 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001938 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001939 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001940
1941 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001942}
1943
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001944VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1945 vkQueueSubmit(VkQueue queue, uint32_t submitCount,
1946 const VkSubmitInfo *pSubmits, VkFence fence) {
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001947 for (uint32_t i = 0; i < submitCount; i++) {
Chia-I Wu40cf0ae2015-10-26 17:20:32 +08001948 PreQueueSubmit(queue, &pSubmits[i]);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001949 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001950
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001951 VkResult result = get_dispatch_table(pc_device_table_map, queue)
1952 ->QueueSubmit(queue, submitCount, pSubmits, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001953
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001954 PostQueueSubmit(queue, submitCount, fence, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001955
1956 return result;
1957}
1958
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001959bool PostQueueWaitIdle(VkQueue queue, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001960
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001961 if (result < VK_SUCCESS) {
1962 std::string reason = "vkQueueWaitIdle parameter, VkResult result, is " +
1963 EnumeratorString(result);
1964 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1965 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1966 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001967 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001968 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001969
1970 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001971}
1972
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001973VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) {
1974 VkResult result =
1975 get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001976
1977 PostQueueWaitIdle(queue, result);
1978
1979 return result;
1980}
1981
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001982bool PostDeviceWaitIdle(VkDevice device, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001983
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001984 if (result < VK_SUCCESS) {
1985 std::string reason =
1986 "vkDeviceWaitIdle parameter, VkResult result, is " +
1987 EnumeratorString(result);
1988 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
1989 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1990 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001991 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001992 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001993
1994 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001995}
1996
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07001997VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1998 vkDeviceWaitIdle(VkDevice device) {
1999 VkResult result =
2000 get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002001
2002 PostDeviceWaitIdle(device, result);
2003
2004 return result;
2005}
2006
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002007bool PreAllocateMemory(VkDevice device,
2008 const VkMemoryAllocateInfo *pAllocateInfo) {
2009 if (pAllocateInfo != nullptr) {
2010 if (pAllocateInfo->sType != VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO) {
2011 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2012 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2013 "vkAllocateMemory parameter, VkStructureType "
2014 "pAllocateInfo->sType, is an invalid enumerator");
2015 return false;
2016 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002017 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002018
2019 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002020}
2021
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002022bool PostAllocateMemory(VkDevice device, VkDeviceMemory *pMemory,
2023 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002024
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002025 if (pMemory != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002026 }
2027
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002028 if (result < VK_SUCCESS) {
2029 std::string reason =
2030 "vkAllocateMemory parameter, VkResult result, is " +
2031 EnumeratorString(result);
2032 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2033 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2034 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002035 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002036 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002037
2038 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002039}
2040
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002041VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2042 vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
2043 const VkAllocationCallbacks *pAllocator,
2044 VkDeviceMemory *pMemory) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002045 PreAllocateMemory(device, pAllocateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002046
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002047 VkResult result =
2048 get_dispatch_table(pc_device_table_map, device)
2049 ->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002050
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002051 PostAllocateMemory(device, pMemory, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002052
2053 return result;
2054}
2055
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002056bool PostMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset,
2057 VkDeviceSize size, VkMemoryMapFlags flags, void **ppData,
2058 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002059
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002060 if (ppData != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002061 }
2062
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002063 if (result < VK_SUCCESS) {
2064 std::string reason = "vkMapMemory parameter, VkResult result, is " +
2065 EnumeratorString(result);
2066 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2067 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2068 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002069 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002070 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002071
2072 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002073}
2074
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002075VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2076 vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset,
2077 VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
2078 VkResult result = get_dispatch_table(pc_device_table_map, device)
2079 ->MapMemory(device, mem, offset, size, flags, ppData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002080
2081 PostMapMemory(device, mem, offset, size, flags, ppData, result);
2082
2083 return result;
2084}
2085
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002086bool PreFlushMappedMemoryRanges(VkDevice device,
2087 const VkMappedMemoryRange *pMemoryRanges) {
2088 if (pMemoryRanges != nullptr) {
2089 if (pMemoryRanges->sType != VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE) {
2090 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2091 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2092 "vkFlushMappedMemoryRanges parameter, VkStructureType "
2093 "pMemoryRanges->sType, is an invalid enumerator");
2094 return false;
2095 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002096 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002097
2098 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002099}
2100
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002101bool PostFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
2102 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002103
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002104 if (result < VK_SUCCESS) {
2105 std::string reason =
2106 "vkFlushMappedMemoryRanges parameter, VkResult result, is " +
2107 EnumeratorString(result);
2108 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2109 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2110 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002111 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002112 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002113
2114 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002115}
2116
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002117VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2118 vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
2119 const VkMappedMemoryRange *pMemoryRanges) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002120 PreFlushMappedMemoryRanges(device, pMemoryRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002121
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002122 VkResult result =
2123 get_dispatch_table(pc_device_table_map, device)
2124 ->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06002125
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002126 PostFlushMappedMemoryRanges(device, memoryRangeCount, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002127
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06002128 return result;
2129}
2130
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002131bool PreInvalidateMappedMemoryRanges(VkDevice device,
2132 const VkMappedMemoryRange *pMemoryRanges) {
2133 if (pMemoryRanges != nullptr) {
2134 if (pMemoryRanges->sType != VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE) {
2135 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2136 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2137 "vkInvalidateMappedMemoryRanges parameter, VkStructureType "
2138 "pMemoryRanges->sType, is an invalid enumerator");
2139 return false;
2140 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002141 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002142
2143 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002144}
2145
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002146bool PostInvalidateMappedMemoryRanges(VkDevice device,
2147 uint32_t memoryRangeCount,
2148 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002149
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002150 if (result < VK_SUCCESS) {
2151 std::string reason =
2152 "vkInvalidateMappedMemoryRanges parameter, VkResult result, is " +
2153 EnumeratorString(result);
2154 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2155 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2156 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002157 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002158 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002159
2160 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002161}
2162
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002163VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2164 vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
2165 const VkMappedMemoryRange *pMemoryRanges) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002166 PreInvalidateMappedMemoryRanges(device, pMemoryRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002167
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002168 VkResult result = get_dispatch_table(pc_device_table_map, device)
2169 ->InvalidateMappedMemoryRanges(
2170 device, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06002171
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002172 PostInvalidateMappedMemoryRanges(device, memoryRangeCount, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002173
Tony Barbourb1250542015-04-16 19:23:13 -06002174 return result;
2175}
2176
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002177bool PostGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
2178 VkDeviceSize *pCommittedMemoryInBytes) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002179
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002180 if (pCommittedMemoryInBytes != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002181 }
2182
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002183 return true;
2184}
2185
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002186VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2187 vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
2188 VkDeviceSize *pCommittedMemoryInBytes) {
2189 get_dispatch_table(pc_device_table_map, device)
2190 ->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06002191
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002192 PostGetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06002193}
2194
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002195bool PostBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
2196 VkDeviceSize memoryOffset, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002197
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002198 if (result < VK_SUCCESS) {
2199 std::string reason =
2200 "vkBindBufferMemory parameter, VkResult result, is " +
2201 EnumeratorString(result);
2202 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2203 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2204 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002205 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002206 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002207
2208 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002209}
2210
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002211VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2212 vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
2213 VkDeviceSize memoryOffset) {
2214 VkResult result = get_dispatch_table(pc_device_table_map, device)
2215 ->BindBufferMemory(device, buffer, mem, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002216
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002217 PostBindBufferMemory(device, buffer, mem, memoryOffset, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002218
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002219 return result;
2220}
2221
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002222bool PostBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
2223 VkDeviceSize memoryOffset, VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002224
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002225 if (result < VK_SUCCESS) {
2226 std::string reason =
2227 "vkBindImageMemory parameter, VkResult result, is " +
2228 EnumeratorString(result);
2229 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2230 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2231 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002232 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002233 }
2234
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002235 return true;
2236}
2237
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002238VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2239 vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
2240 VkDeviceSize memoryOffset) {
2241 VkResult result = get_dispatch_table(pc_device_table_map, device)
2242 ->BindImageMemory(device, image, mem, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002243
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002244 PostBindImageMemory(device, image, mem, memoryOffset, result);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002245
2246 return result;
2247}
2248
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002249bool
2250PostGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
2251 VkMemoryRequirements *pMemoryRequirements) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002252
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002253 if (pMemoryRequirements != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002254 }
2255
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002256 return true;
2257}
2258
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002259VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2260 vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
2261 VkMemoryRequirements *pMemoryRequirements) {
2262 get_dispatch_table(pc_device_table_map, device)
2263 ->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002264
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002265 PostGetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002266}
2267
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002268bool PostGetImageMemoryRequirements(VkDevice device, VkImage image,
2269 VkMemoryRequirements *pMemoryRequirements) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002270
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002271 if (pMemoryRequirements != nullptr) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002272 }
2273
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002274 return true;
2275}
2276
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002277VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2278 vkGetImageMemoryRequirements(VkDevice device, VkImage image,
2279 VkMemoryRequirements *pMemoryRequirements) {
2280 get_dispatch_table(pc_device_table_map, device)
2281 ->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002282
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002283 PostGetImageMemoryRequirements(device, image, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002284}
2285
2286bool PostGetImageSparseMemoryRequirements(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002287 VkDevice device, VkImage image, uint32_t *pNumRequirements,
2288 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002289
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002290 if (pNumRequirements != nullptr) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002291 }
2292
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002293 if (pSparseMemoryRequirements != nullptr) {
2294 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
2295 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
2296 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) ==
2297 0) {
2298 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2299 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2300 "vkGetImageSparseMemoryRequirements parameter, "
2301 "VkImageAspect "
2302 "pSparseMemoryRequirements->formatProperties.aspectMask, "
2303 "is an unrecognized enumerator");
2304 return false;
2305 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002306 }
2307
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002308 return true;
2309}
2310
Chia-I Wu9ab61502015-11-06 06:42:02 +08002311VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002312 VkDevice device, VkImage image, uint32_t *pNumRequirements,
2313 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2314 get_dispatch_table(pc_device_table_map, device)
2315 ->GetImageSparseMemoryRequirements(device, image, pNumRequirements,
2316 pSparseMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002317
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002318 PostGetImageSparseMemoryRequirements(device, image, pNumRequirements,
2319 pSparseMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002320}
2321
2322bool PostGetPhysicalDeviceSparseImageFormatProperties(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002323 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2324 VkSampleCountFlagBits samples, VkImageUsageFlags usage,
2325 VkImageTiling tiling, uint32_t *pNumProperties,
2326 VkSparseImageFormatProperties *pProperties) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002327
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002328 if (format < VK_FORMAT_BEGIN_RANGE || format > VK_FORMAT_END_RANGE) {
2329 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2330 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2331 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, "
2332 "VkFormat format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002333 return false;
2334 }
2335
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002336 if (type < VK_IMAGE_TYPE_BEGIN_RANGE || type > VK_IMAGE_TYPE_END_RANGE) {
2337 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2338 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2339 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, "
2340 "VkImageType type, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002341 return false;
2342 }
2343
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002344 if (tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
2345 tiling > VK_IMAGE_TILING_END_RANGE) {
2346 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2347 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2348 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, "
2349 "VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002350 return false;
2351 }
2352
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002353 if (pNumProperties != nullptr) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002354 }
2355
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002356 if (pProperties != nullptr) {
2357 if ((pProperties->aspectMask &
2358 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
2359 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) ==
2360 0) {
2361 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2362 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2363 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, "
2364 "VkImageAspect pProperties->aspectMask, is an unrecognized "
2365 "enumerator");
2366 return false;
2367 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002368 }
2369
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002370 return true;
2371}
2372
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002373VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2374 vkGetPhysicalDeviceSparseImageFormatProperties(
2375 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2376 VkSampleCountFlagBits samples, VkImageUsageFlags usage,
2377 VkImageTiling tiling, uint32_t *pNumProperties,
2378 VkSparseImageFormatProperties *pProperties) {
2379 get_dispatch_table(pc_instance_table_map, physicalDevice)
2380 ->GetPhysicalDeviceSparseImageFormatProperties(
2381 physicalDevice, format, type, samples, usage, tiling,
2382 pNumProperties, pProperties);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002383
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002384 PostGetPhysicalDeviceSparseImageFormatProperties(
2385 physicalDevice, format, type, samples, usage, tiling, pNumProperties,
2386 pProperties);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002387}
2388
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002389bool PreQueueBindSparse(VkQueue queue, uint32_t bindInfoCount,
2390 const VkBindSparseInfo *pBindInfo) {
2391 if (pBindInfo != nullptr) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002392 }
2393
2394 return true;
2395}
2396
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002397bool PostQueueBindSparse(VkQueue queue, uint32_t bindInfoCount,
2398 const VkBindSparseInfo *pBindInfo, VkFence fence,
2399 VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002400
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002401 if (result < VK_SUCCESS) {
2402 std::string reason =
2403 "vkQueueBindSparse parameter, VkResult result, is " +
2404 EnumeratorString(result);
2405 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2406 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2407 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002408 return false;
2409 }
2410
2411 return true;
2412}
2413
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002414VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2415 vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount,
2416 const VkBindSparseInfo *pBindInfo, VkFence fence) {
Chia-I Wu1ff4c3d2015-10-26 16:55:27 +08002417 PreQueueBindSparse(queue, bindInfoCount, pBindInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002418
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002419 VkResult result =
2420 get_dispatch_table(pc_device_table_map, queue)
2421 ->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002422
Chia-I Wu1ff4c3d2015-10-26 16:55:27 +08002423 PostQueueBindSparse(queue, bindInfoCount, pBindInfo, fence, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002424
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002425 return result;
2426}
2427
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002428bool PreCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo) {
2429 if (pCreateInfo != nullptr) {
2430 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_FENCE_CREATE_INFO) {
2431 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2432 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2433 "vkCreateFence parameter, VkStructureType "
2434 "pCreateInfo->sType, is an invalid enumerator");
2435 return false;
2436 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002437 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002438
2439 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002440}
2441
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002442bool PostCreateFence(VkDevice device, VkFence *pFence, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002443
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002444 if (pFence != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002445 }
2446
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002447 if (result < VK_SUCCESS) {
2448 std::string reason = "vkCreateFence parameter, VkResult result, is " +
2449 EnumeratorString(result);
2450 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2451 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2452 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002453 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002454 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002455
2456 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002457}
2458
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002459VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2460 vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2461 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002462 PreCreateFence(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002463
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002464 VkResult result =
2465 get_dispatch_table(pc_device_table_map, device)
2466 ->CreateFence(device, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002467
2468 PostCreateFence(device, pFence, result);
2469
2470 return result;
2471}
2472
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002473bool PreResetFences(VkDevice device, const VkFence *pFences) {
2474 if (pFences != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002475 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002476
2477 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002478}
2479
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002480bool PostResetFences(VkDevice device, uint32_t fenceCount, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002481
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002482 if (result < VK_SUCCESS) {
2483 std::string reason = "vkResetFences parameter, VkResult result, is " +
2484 EnumeratorString(result);
2485 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2486 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2487 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002488 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002489 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002490
2491 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002492}
2493
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002494VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2495 vkResetFences(VkDevice device, uint32_t fenceCount,
2496 const VkFence *pFences) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002497 PreResetFences(device, pFences);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002498
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002499 VkResult result = get_dispatch_table(pc_device_table_map, device)
2500 ->ResetFences(device, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002501
2502 PostResetFences(device, fenceCount, result);
2503
2504 return result;
2505}
2506
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002507bool PostGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002508
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002509 if (result < VK_SUCCESS) {
2510 std::string reason =
2511 "vkGetFenceStatus parameter, VkResult result, is " +
2512 EnumeratorString(result);
2513 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2514 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2515 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002516 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002517 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002518
2519 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002520}
2521
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002522VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2523 vkGetFenceStatus(VkDevice device, VkFence fence) {
2524 VkResult result = get_dispatch_table(pc_device_table_map, device)
2525 ->GetFenceStatus(device, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002526
2527 PostGetFenceStatus(device, fence, result);
2528
2529 return result;
2530}
2531
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002532bool PreWaitForFences(VkDevice device, const VkFence *pFences) {
2533 if (pFences != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002534 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002535
2536 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002537}
2538
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002539bool PostWaitForFences(VkDevice device, uint32_t fenceCount, VkBool32 waitAll,
2540 uint64_t timeout, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002541
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002542 if (result < VK_SUCCESS) {
2543 std::string reason = "vkWaitForFences parameter, VkResult result, is " +
2544 EnumeratorString(result);
2545 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2546 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2547 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002548 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002549 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002550
2551 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002552}
2553
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002554VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2555 vkWaitForFences(VkDevice device, uint32_t fenceCount,
2556 const VkFence *pFences, VkBool32 waitAll,
2557 uint64_t timeout) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002558 PreWaitForFences(device, pFences);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002559
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002560 VkResult result =
2561 get_dispatch_table(pc_device_table_map, device)
2562 ->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002563
2564 PostWaitForFences(device, fenceCount, waitAll, timeout, result);
2565
2566 return result;
2567}
2568
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002569bool PreCreateSemaphore(VkDevice device,
2570 const VkSemaphoreCreateInfo *pCreateInfo) {
2571 if (pCreateInfo != nullptr) {
2572 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO) {
2573 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2574 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2575 "vkCreateSemaphore parameter, VkStructureType "
2576 "pCreateInfo->sType, is an invalid enumerator");
2577 return false;
2578 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002579 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002580
2581 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002582}
2583
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002584bool PostCreateSemaphore(VkDevice device, VkSemaphore *pSemaphore,
2585 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002586
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002587 if (pSemaphore != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002588 }
2589
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002590 if (result < VK_SUCCESS) {
2591 std::string reason =
2592 "vkCreateSemaphore parameter, VkResult result, is " +
2593 EnumeratorString(result);
2594 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2595 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2596 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002597 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002598 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002599
2600 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002601}
2602
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002603VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2604 vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
2605 const VkAllocationCallbacks *pAllocator,
2606 VkSemaphore *pSemaphore) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002607 PreCreateSemaphore(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002608
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002609 VkResult result =
2610 get_dispatch_table(pc_device_table_map, device)
2611 ->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002612
2613 PostCreateSemaphore(device, pSemaphore, result);
2614
2615 return result;
2616}
2617
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002618bool PreCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo) {
2619 if (pCreateInfo != nullptr) {
2620 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_EVENT_CREATE_INFO) {
2621 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2622 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2623 "vkCreateEvent parameter, VkStructureType "
2624 "pCreateInfo->sType, is an invalid enumerator");
2625 return false;
2626 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002627 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002628
2629 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002630}
2631
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002632bool PostCreateEvent(VkDevice device, VkEvent *pEvent, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002633
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002634 if (pEvent != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002635 }
2636
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002637 if (result < VK_SUCCESS) {
2638 std::string reason = "vkCreateEvent parameter, VkResult result, is " +
2639 EnumeratorString(result);
2640 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2641 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2642 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002643 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002644 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002645
2646 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002647}
2648
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002649VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2650 vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2651 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002652 PreCreateEvent(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002653
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002654 VkResult result =
2655 get_dispatch_table(pc_device_table_map, device)
2656 ->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002657
2658 PostCreateEvent(device, pEvent, result);
2659
2660 return result;
2661}
2662
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002663bool PostGetEventStatus(VkDevice device, VkEvent event, VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002664
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002665 if (result < VK_SUCCESS) {
2666 std::string reason =
2667 "vkGetEventStatus parameter, VkResult result, is " +
2668 EnumeratorString(result);
2669 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2670 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2671 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002672 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002673 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002674
2675 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002676}
2677
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002678VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2679 vkGetEventStatus(VkDevice device, VkEvent event) {
2680 VkResult result = get_dispatch_table(pc_device_table_map, device)
2681 ->GetEventStatus(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002682
2683 PostGetEventStatus(device, event, result);
2684
2685 return result;
2686}
2687
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002688bool PostSetEvent(VkDevice device, VkEvent event, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002689
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002690 if (result < VK_SUCCESS) {
2691 std::string reason = "vkSetEvent parameter, VkResult result, is " +
2692 EnumeratorString(result);
2693 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2694 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2695 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002696 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002697 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002698
2699 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002700}
2701
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002702VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2703 vkSetEvent(VkDevice device, VkEvent event) {
2704 VkResult result = get_dispatch_table(pc_device_table_map, device)
2705 ->SetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002706
2707 PostSetEvent(device, event, result);
2708
2709 return result;
2710}
2711
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002712bool PostResetEvent(VkDevice device, VkEvent event, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002713
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002714 if (result < VK_SUCCESS) {
2715 std::string reason = "vkResetEvent parameter, VkResult result, is " +
2716 EnumeratorString(result);
2717 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2718 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2719 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002720 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002721 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002722
2723 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002724}
2725
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002726VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2727 vkResetEvent(VkDevice device, VkEvent event) {
2728 VkResult result = get_dispatch_table(pc_device_table_map, device)
2729 ->ResetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002730
2731 PostResetEvent(device, event, result);
2732
2733 return result;
2734}
2735
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002736bool PreCreateQueryPool(VkDevice device,
2737 const VkQueryPoolCreateInfo *pCreateInfo) {
2738 if (pCreateInfo != nullptr) {
2739 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO) {
2740 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2741 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2742 "vkCreateQueryPool parameter, VkStructureType "
2743 "pCreateInfo->sType, is an invalid enumerator");
2744 return false;
2745 }
2746 if (pCreateInfo->queryType < VK_QUERY_TYPE_BEGIN_RANGE ||
2747 pCreateInfo->queryType > VK_QUERY_TYPE_END_RANGE) {
2748 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2749 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2750 "vkCreateQueryPool parameter, VkQueryType "
2751 "pCreateInfo->queryType, is an unrecognized enumerator");
2752 return false;
2753 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002754 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002755
2756 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002757}
2758
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002759bool PostCreateQueryPool(VkDevice device, VkQueryPool *pQueryPool,
2760 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002761
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002762 if (pQueryPool != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002763 }
2764
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002765 if (result < VK_SUCCESS) {
2766 std::string reason =
2767 "vkCreateQueryPool parameter, VkResult result, is " +
2768 EnumeratorString(result);
2769 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2770 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2771 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002772 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002773 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002774
2775 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002776}
2777
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002778VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2779 vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2780 const VkAllocationCallbacks *pAllocator,
2781 VkQueryPool *pQueryPool) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002782 PreCreateQueryPool(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002783
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002784 VkResult result =
2785 get_dispatch_table(pc_device_table_map, device)
2786 ->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002787
2788 PostCreateQueryPool(device, pQueryPool, result);
2789
2790 return result;
2791}
2792
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002793bool PostGetQueryPoolResults(VkDevice device, VkQueryPool queryPool,
2794 uint32_t firstQuery, uint32_t queryCount,
2795 size_t dataSize, void *pData, VkDeviceSize stride,
2796 VkQueryResultFlags flags, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002797
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002798 if (pData != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002799 }
2800
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002801 if (result < VK_SUCCESS) {
2802 std::string reason =
2803 "vkGetQueryPoolResults parameter, VkResult result, is " +
2804 EnumeratorString(result);
2805 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2806 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2807 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002808 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002809 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002810
2811 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002812}
2813
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002814VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2815 vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool,
2816 uint32_t firstQuery, uint32_t queryCount,
2817 size_t dataSize, void *pData, VkDeviceSize stride,
2818 VkQueryResultFlags flags) {
2819 VkResult result =
2820 get_dispatch_table(pc_device_table_map, device)
2821 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount,
2822 dataSize, pData, stride, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002823
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002824 PostGetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize,
2825 pData, stride, flags, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002826
2827 return result;
2828}
2829
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002830bool PreCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo) {
2831 if (pCreateInfo != nullptr) {
2832 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO) {
2833 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2834 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2835 "vkCreateBuffer parameter, VkStructureType "
2836 "pCreateInfo->sType, is an invalid enumerator");
2837 return false;
2838 }
2839 if (pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE ||
2840 pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE) {
2841 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2842 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2843 "vkCreateBuffer parameter, VkSharingMode "
2844 "pCreateInfo->sharingMode, is an unrecognized enumerator");
2845 return false;
2846 }
2847 if (pCreateInfo->pQueueFamilyIndices != nullptr) {
2848 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002849 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002850
2851 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002852}
2853
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002854bool PostCreateBuffer(VkDevice device, VkBuffer *pBuffer, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002855
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002856 if (pBuffer != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002857 }
2858
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002859 if (result < VK_SUCCESS) {
2860 std::string reason = "vkCreateBuffer parameter, VkResult result, is " +
2861 EnumeratorString(result);
2862 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2863 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2864 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002865 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002866 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002867
2868 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002869}
2870
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002871VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2872 vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2873 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002874 PreCreateBuffer(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002875
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002876 VkResult result =
2877 get_dispatch_table(pc_device_table_map, device)
2878 ->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002879
2880 PostCreateBuffer(device, pBuffer, result);
2881
2882 return result;
2883}
2884
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002885bool PreCreateBufferView(VkDevice device,
2886 const VkBufferViewCreateInfo *pCreateInfo) {
2887 if (pCreateInfo != nullptr) {
2888 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO) {
2889 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2890 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2891 "vkCreateBufferView parameter, VkStructureType "
2892 "pCreateInfo->sType, is an invalid enumerator");
2893 return false;
2894 }
2895 if (pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
2896 pCreateInfo->format > VK_FORMAT_END_RANGE) {
2897 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2898 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2899 "vkCreateBufferView parameter, VkFormat "
2900 "pCreateInfo->format, is an unrecognized enumerator");
2901 return false;
2902 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002903 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002904
2905 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002906}
2907
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002908bool PostCreateBufferView(VkDevice device, VkBufferView *pView,
2909 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002910
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002911 if (pView != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002912 }
2913
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002914 if (result < VK_SUCCESS) {
2915 std::string reason =
2916 "vkCreateBufferView parameter, VkResult result, is " +
2917 EnumeratorString(result);
2918 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2919 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2920 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002921 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002922 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002923
2924 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002925}
2926
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002927VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2928 vkCreateBufferView(VkDevice device,
2929 const VkBufferViewCreateInfo *pCreateInfo,
2930 const VkAllocationCallbacks *pAllocator,
2931 VkBufferView *pView) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002932 PreCreateBufferView(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002933
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002934 VkResult result =
2935 get_dispatch_table(pc_device_table_map, device)
2936 ->CreateBufferView(device, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002937
2938 PostCreateBufferView(device, pView, result);
2939
2940 return result;
2941}
2942
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002943bool PreCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo) {
2944 if (pCreateInfo != nullptr) {
2945 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO) {
2946 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2947 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2948 "vkCreateImage parameter, VkStructureType "
2949 "pCreateInfo->sType, is an invalid enumerator");
2950 return false;
2951 }
2952 if (pCreateInfo->imageType < VK_IMAGE_TYPE_BEGIN_RANGE ||
2953 pCreateInfo->imageType > VK_IMAGE_TYPE_END_RANGE) {
2954 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2955 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2956 "vkCreateImage parameter, VkImageType "
2957 "pCreateInfo->imageType, is an unrecognized enumerator");
2958 return false;
2959 }
2960 if (pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
2961 pCreateInfo->format > VK_FORMAT_END_RANGE) {
2962 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2963 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2964 "vkCreateImage parameter, VkFormat pCreateInfo->format, is "
2965 "an unrecognized enumerator");
2966 return false;
2967 }
2968 if (pCreateInfo->tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
2969 pCreateInfo->tiling > VK_IMAGE_TILING_END_RANGE) {
2970 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2971 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2972 "vkCreateImage parameter, VkImageTiling "
2973 "pCreateInfo->tiling, is an unrecognized enumerator");
2974 return false;
2975 }
2976 if (pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE ||
2977 pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE) {
2978 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
2979 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2980 "vkCreateImage parameter, VkSharingMode "
2981 "pCreateInfo->sharingMode, is an unrecognized enumerator");
2982 return false;
2983 }
2984 if (pCreateInfo->pQueueFamilyIndices != nullptr) {
2985 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002986 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002987
2988 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002989}
2990
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002991bool PostCreateImage(VkDevice device, VkImage *pImage, VkResult result) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002992
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002993 if (pImage != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002994 }
2995
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07002996 if (result < VK_SUCCESS) {
2997 std::string reason = "vkCreateImage parameter, VkResult result, is " +
2998 EnumeratorString(result);
2999 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3000 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3001 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003002 return false;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003003 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003004
3005 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003006}
3007
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003008VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3009 vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
3010 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003011 PreCreateImage(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003012
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003013 VkResult result =
3014 get_dispatch_table(pc_device_table_map, device)
3015 ->CreateImage(device, pCreateInfo, pAllocator, pImage);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003016
3017 PostCreateImage(device, pImage, result);
3018
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003019 return result;
3020}
3021
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003022bool PreGetImageSubresourceLayout(VkDevice device,
3023 const VkImageSubresource *pSubresource) {
3024 if (pSubresource != nullptr) {
3025 if ((pSubresource->aspectMask &
3026 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3027 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) ==
3028 0) {
3029 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3030 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3031 "vkGetImageSubresourceLayout parameter, VkImageAspect "
3032 "pSubresource->aspectMask, is an unrecognized enumerator");
3033 return false;
3034 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003035 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003036
3037 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003038}
3039
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003040bool PostGetImageSubresourceLayout(VkDevice device, VkImage image,
3041 VkSubresourceLayout *pLayout) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003042
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003043 if (pLayout != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003044 }
3045
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003046 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003047}
3048
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003049VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3050 vkGetImageSubresourceLayout(VkDevice device, VkImage image,
3051 const VkImageSubresource *pSubresource,
3052 VkSubresourceLayout *pLayout) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003053 PreGetImageSubresourceLayout(device, pSubresource);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003054
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003055 get_dispatch_table(pc_device_table_map, device)
3056 ->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003057
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06003058 PostGetImageSubresourceLayout(device, image, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003059}
3060
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003061bool PreCreateImageView(VkDevice device,
3062 const VkImageViewCreateInfo *pCreateInfo) {
3063 if (pCreateInfo != nullptr) {
3064 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO) {
3065 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3066 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3067 "vkCreateImageView parameter, VkStructureType "
3068 "pCreateInfo->sType, is an invalid enumerator");
3069 return false;
3070 }
3071 if (pCreateInfo->viewType < VK_IMAGE_VIEW_TYPE_BEGIN_RANGE ||
3072 pCreateInfo->viewType > VK_IMAGE_VIEW_TYPE_END_RANGE) {
3073 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3074 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3075 "vkCreateImageView parameter, VkImageViewType "
3076 "pCreateInfo->viewType, is an unrecognized enumerator");
3077 return false;
3078 }
3079 if (pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
3080 pCreateInfo->format > VK_FORMAT_END_RANGE) {
3081 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3082 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3083 "vkCreateImageView parameter, VkFormat "
3084 "pCreateInfo->format, is an unrecognized enumerator");
3085 return false;
3086 }
3087 if (pCreateInfo->components.r < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3088 pCreateInfo->components.r > VK_COMPONENT_SWIZZLE_END_RANGE) {
3089 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3090 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3091 "vkCreateImageView parameter, VkComponentSwizzle "
3092 "pCreateInfo->components.r, is an unrecognized enumerator");
3093 return false;
3094 }
3095 if (pCreateInfo->components.g < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3096 pCreateInfo->components.g > VK_COMPONENT_SWIZZLE_END_RANGE) {
3097 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3098 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3099 "vkCreateImageView parameter, VkComponentSwizzle "
3100 "pCreateInfo->components.g, is an unrecognized enumerator");
3101 return false;
3102 }
3103 if (pCreateInfo->components.b < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3104 pCreateInfo->components.b > VK_COMPONENT_SWIZZLE_END_RANGE) {
3105 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3106 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3107 "vkCreateImageView parameter, VkComponentSwizzle "
3108 "pCreateInfo->components.b, is an unrecognized enumerator");
3109 return false;
3110 }
3111 if (pCreateInfo->components.a < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3112 pCreateInfo->components.a > VK_COMPONENT_SWIZZLE_END_RANGE) {
3113 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3114 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3115 "vkCreateImageView parameter, VkComponentSwizzle "
3116 "pCreateInfo->components.a, is an unrecognized enumerator");
3117 return false;
3118 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003119 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003120
3121 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003122}
3123
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003124bool PostCreateImageView(VkDevice device, VkImageView *pView, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003125
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003126 if (pView != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003127 }
3128
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003129 if (result < VK_SUCCESS) {
3130 std::string reason =
3131 "vkCreateImageView parameter, VkResult result, is " +
3132 EnumeratorString(result);
3133 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3134 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3135 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003136 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003137 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003138
3139 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003140}
3141
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003142VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3143 vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
3144 const VkAllocationCallbacks *pAllocator,
3145 VkImageView *pView) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003146 PreCreateImageView(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003147
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003148 VkResult result =
3149 get_dispatch_table(pc_device_table_map, device)
3150 ->CreateImageView(device, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003151
3152 PostCreateImageView(device, pView, result);
3153
3154 return result;
3155}
3156
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003157bool PreCreateShaderModule(VkDevice device,
3158 const VkShaderModuleCreateInfo *pCreateInfo) {
3159 if (pCreateInfo) {
3160 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO) {
3161 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3162 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3163 "vkCreateShaderModule parameter, VkStructureType "
3164 "pCreateInfo->sType, is an invalid enumerator");
Michael Lentine03d8e572015-09-15 14:59:14 -05003165 return false;
3166 }
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003167 if (!pCreateInfo->pCode) {
3168 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3169 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3170 "vkCreateShaderModule paramter, void* pCreateInfo->pCode, "
3171 "is null");
Michael Lentine03d8e572015-09-15 14:59:14 -05003172 return false;
3173 }
3174 } else {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003175 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3176 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3177 "vkCreateShaderModule parameter, VkShaderModuleCreateInfo "
3178 "pCreateInfo, is null");
Michael Lentine03d8e572015-09-15 14:59:14 -05003179 return false;
3180 }
3181
3182 return true;
3183}
3184
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003185bool PostCreateShaderModule(VkDevice device, VkShaderModule *pShaderModule,
3186 VkResult result) {
3187 if (result < VK_SUCCESS) {
3188 std::string reason =
3189 "vkCreateShaderModule parameter, VkResult result, is " +
3190 EnumeratorString(result);
3191 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3192 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3193 "%s", reason.c_str());
Michael Lentine03d8e572015-09-15 14:59:14 -05003194 return false;
3195 }
3196
3197 return true;
3198}
3199
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003200VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3201 vkCreateShaderModule(VkDevice device,
3202 const VkShaderModuleCreateInfo *pCreateInfo,
3203 const VkAllocationCallbacks *pAllocator,
3204 VkShaderModule *pShaderModule) {
Michael Lentine03d8e572015-09-15 14:59:14 -05003205 PreCreateShaderModule(device, pCreateInfo);
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003206 VkResult result = get_dispatch_table(pc_device_table_map, device)
3207 ->CreateShaderModule(device, pCreateInfo, pAllocator,
3208 pShaderModule);
Michael Lentine03d8e572015-09-15 14:59:14 -05003209 PostCreateShaderModule(device, pShaderModule, result);
3210 return result;
3211}
3212
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003213bool PreCreatePipelineCache(VkDevice device,
3214 const VkPipelineCacheCreateInfo *pCreateInfo) {
3215 if (pCreateInfo != nullptr) {
3216 if (pCreateInfo->sType !=
3217 VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO) {
3218 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3219 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3220 "vkCreatePipelineCache parameter, VkStructureType "
3221 "pCreateInfo->sType, is an invalid enumerator");
3222 return false;
3223 }
3224 if (pCreateInfo->pInitialData != nullptr) {
3225 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003226 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003227
3228 return true;
3229}
3230
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003231bool PostCreatePipelineCache(VkDevice device, VkPipelineCache *pPipelineCache,
3232 VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003233
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003234 if (pPipelineCache != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003235 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003236
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003237 if (result < VK_SUCCESS) {
3238 std::string reason =
3239 "vkCreatePipelineCache parameter, VkResult result, is " +
3240 EnumeratorString(result);
3241 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3242 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3243 "%s", reason.c_str());
Tony Barbourdd6e32e2015-07-10 15:29:03 -06003244 return false;
3245 }
3246
3247 return true;
3248}
3249
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003250VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3251 vkCreatePipelineCache(VkDevice device,
3252 const VkPipelineCacheCreateInfo *pCreateInfo,
3253 const VkAllocationCallbacks *pAllocator,
3254 VkPipelineCache *pPipelineCache) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003255 PreCreatePipelineCache(device, pCreateInfo);
3256
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003257 VkResult result = get_dispatch_table(pc_device_table_map, device)
3258 ->CreatePipelineCache(device, pCreateInfo, pAllocator,
3259 pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003260
3261 PostCreatePipelineCache(device, pPipelineCache, result);
3262
3263 return result;
3264}
3265
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003266bool PostGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache,
3267 size_t *pDataSize, void *pData, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003268
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003269 if (pDataSize != nullptr) {
Chia-I Wub16facd2015-10-26 19:17:06 +08003270 }
3271
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003272 if (pData != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003273 }
3274
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003275 if (result < VK_SUCCESS) {
3276 std::string reason =
3277 "vkGetPipelineCacheData parameter, VkResult result, is " +
3278 EnumeratorString(result);
3279 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3280 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3281 "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003282 return false;
3283 }
3284
3285 return true;
3286}
3287
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003288VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3289 vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache,
3290 size_t *pDataSize, void *pData) {
3291 VkResult result =
3292 get_dispatch_table(pc_device_table_map, device)
3293 ->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003294
Chia-I Wub16facd2015-10-26 19:17:06 +08003295 PostGetPipelineCacheData(device, pipelineCache, pDataSize, pData, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003296
3297 return result;
3298}
3299
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003300bool PreMergePipelineCaches(VkDevice device,
3301 const VkPipelineCache *pSrcCaches) {
3302 if (pSrcCaches != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003303 }
3304
3305 return true;
3306}
3307
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003308bool PostMergePipelineCaches(VkDevice device, VkPipelineCache dstCache,
3309 uint32_t srcCacheCount, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003310
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003311 if (result < VK_SUCCESS) {
3312 std::string reason =
3313 "vkMergePipelineCaches parameter, VkResult result, is " +
3314 EnumeratorString(result);
3315 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3316 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3317 "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003318 return false;
3319 }
3320
3321 return true;
3322}
3323
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003324VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3325 vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache,
3326 uint32_t srcCacheCount,
3327 const VkPipelineCache *pSrcCaches) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003328 PreMergePipelineCaches(device, pSrcCaches);
3329
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003330 VkResult result =
3331 get_dispatch_table(pc_device_table_map, device)
3332 ->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003333
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003334 PostMergePipelineCaches(device, dstCache, srcCacheCount, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003335
3336 return result;
3337}
3338
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003339bool
3340PreCreateGraphicsPipelines(VkDevice device,
3341 const VkGraphicsPipelineCreateInfo *pCreateInfos) {
3342 if (pCreateInfos != nullptr) {
3343 if (pCreateInfos->sType !=
3344 VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO) {
3345 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3346 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3347 "vkCreateGraphicsPipelines parameter, VkStructureType "
3348 "pCreateInfos->sType, is an invalid enumerator");
3349 return false;
3350 }
3351 if (pCreateInfos->pStages != nullptr) {
3352 if (pCreateInfos->pStages->sType !=
3353 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO) {
3354 log_msg(
3355 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3356 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3357 "vkCreateGraphicsPipelines parameter, VkStructureType "
3358 "pCreateInfos->pStages->sType, is an invalid enumerator");
3359 return false;
3360 }
3361 if (pCreateInfos->pStages->pSpecializationInfo != nullptr) {
3362 if (pCreateInfos->pStages->pSpecializationInfo->pMapEntries !=
3363 nullptr) {
3364 }
3365 if (pCreateInfos->pStages->pSpecializationInfo->pData !=
3366 nullptr) {
3367 }
3368 }
3369 }
3370 if (pCreateInfos->pVertexInputState != nullptr) {
3371 if (pCreateInfos->pVertexInputState->sType !=
3372 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO) {
3373 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3374 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3375 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3376 "VkStructureType "
3377 "pCreateInfos->pVertexInputState->sType, "
3378 "is an invalid enumerator");
3379 return false;
3380 }
3381 if (pCreateInfos->pVertexInputState->pVertexBindingDescriptions !=
3382 nullptr) {
3383 if (pCreateInfos->pVertexInputState->pVertexBindingDescriptions
3384 ->inputRate < VK_VERTEX_INPUT_RATE_BEGIN_RANGE ||
3385 pCreateInfos->pVertexInputState->pVertexBindingDescriptions
3386 ->inputRate > VK_VERTEX_INPUT_RATE_END_RANGE) {
3387 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3388 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3389 "PARAMCHECK", "vkCreateGraphicsPipelines "
3390 "parameter, VkVertexInputRate "
3391 "pCreateInfos->pVertexInputState->"
3392 "pVertexBindingDescriptions->"
3393 "inputRate, is an unrecognized "
3394 "enumerator");
3395 return false;
3396 }
3397 }
3398 if (pCreateInfos->pVertexInputState->pVertexAttributeDescriptions !=
3399 nullptr) {
3400 if (pCreateInfos->pVertexInputState
3401 ->pVertexAttributeDescriptions->format <
3402 VK_FORMAT_BEGIN_RANGE ||
3403 pCreateInfos->pVertexInputState
3404 ->pVertexAttributeDescriptions->format >
3405 VK_FORMAT_END_RANGE) {
3406 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3407 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3408 "PARAMCHECK",
3409 "vkCreateGraphicsPipelines parameter, VkFormat "
3410 "pCreateInfos->pVertexInputState->"
3411 "pVertexAttributeDescriptions->format, is an "
3412 "unrecognized enumerator");
3413 return false;
3414 }
3415 }
3416 }
3417 if (pCreateInfos->pInputAssemblyState != nullptr) {
3418 if (pCreateInfos->pInputAssemblyState->sType !=
3419 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO) {
3420 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3421 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3422 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3423 "VkStructureType "
3424 "pCreateInfos->pInputAssemblyState->"
3425 "sType, is an invalid enumerator");
3426 return false;
3427 }
3428 if (pCreateInfos->pInputAssemblyState->topology <
3429 VK_PRIMITIVE_TOPOLOGY_BEGIN_RANGE ||
3430 pCreateInfos->pInputAssemblyState->topology >
3431 VK_PRIMITIVE_TOPOLOGY_END_RANGE) {
3432 log_msg(
3433 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3434 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3435 "vkCreateGraphicsPipelines parameter, VkPrimitiveTopology "
3436 "pCreateInfos->pInputAssemblyState->topology, is an "
3437 "unrecognized enumerator");
3438 return false;
3439 }
3440 }
3441 if (pCreateInfos->pTessellationState != nullptr) {
3442 if (pCreateInfos->pTessellationState->sType !=
3443 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
3444 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3445 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3446 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3447 "VkStructureType "
3448 "pCreateInfos->pTessellationState->sType,"
3449 " is an invalid enumerator");
3450 return false;
3451 }
3452 }
3453 if (pCreateInfos->pViewportState != nullptr) {
3454 if (pCreateInfos->pViewportState->sType !=
3455 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
3456 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3457 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3458 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3459 "VkStructureType "
3460 "pCreateInfos->pViewportState->sType, is "
3461 "an invalid enumerator");
3462 return false;
3463 }
3464 }
3465 if (pCreateInfos->pRasterizationState != nullptr) {
3466 if (pCreateInfos->pRasterizationState->sType !=
3467 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO) {
3468 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3469 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3470 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3471 "VkStructureType "
3472 "pCreateInfos->pRasterizationState->"
3473 "sType, is an invalid enumerator");
3474 return false;
3475 }
3476 if (pCreateInfos->pRasterizationState->polygonMode <
3477 VK_POLYGON_MODE_BEGIN_RANGE ||
3478 pCreateInfos->pRasterizationState->polygonMode >
3479 VK_POLYGON_MODE_END_RANGE) {
3480 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3481 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3482 "PARAMCHECK",
3483 "vkCreateGraphicsPipelines parameter, VkPolygonMode "
3484 "pCreateInfos->pRasterizationState->polygonMode, is an "
3485 "unrecognized enumerator");
3486 return false;
3487 }
3488 if (pCreateInfos->pRasterizationState->cullMode &
3489 ~VK_CULL_MODE_FRONT_AND_BACK) {
3490 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3491 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3492 "PARAMCHECK",
3493 "vkCreateGraphicsPipelines parameter, VkCullMode "
3494 "pCreateInfos->pRasterizationState->cullMode, is an "
3495 "unrecognized enumerator");
3496 return false;
3497 }
3498 if (pCreateInfos->pRasterizationState->frontFace <
3499 VK_FRONT_FACE_BEGIN_RANGE ||
3500 pCreateInfos->pRasterizationState->frontFace >
3501 VK_FRONT_FACE_END_RANGE) {
3502 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3503 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3504 "PARAMCHECK",
3505 "vkCreateGraphicsPipelines parameter, VkFrontFace "
3506 "pCreateInfos->pRasterizationState->frontFace, is an "
3507 "unrecognized enumerator");
3508 return false;
3509 }
3510 }
3511 if (pCreateInfos->pMultisampleState != nullptr) {
3512 if (pCreateInfos->pMultisampleState->sType !=
3513 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3514 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3515 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3516 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3517 "VkStructureType "
3518 "pCreateInfos->pMultisampleState->sType, "
3519 "is an invalid enumerator");
3520 return false;
3521 }
3522 }
3523 if (pCreateInfos->pDepthStencilState != nullptr) {
3524 if (pCreateInfos->pDepthStencilState->sType !=
3525 VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3526 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3527 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3528 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3529 "VkStructureType "
3530 "pCreateInfos->pDepthStencilState->sType,"
3531 " is an invalid enumerator");
3532 return false;
3533 }
3534 if (pCreateInfos->pDepthStencilState->depthCompareOp <
3535 VK_COMPARE_OP_BEGIN_RANGE ||
3536 pCreateInfos->pDepthStencilState->depthCompareOp >
3537 VK_COMPARE_OP_END_RANGE) {
3538 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3539 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3540 "PARAMCHECK",
3541 "vkCreateGraphicsPipelines parameter, VkCompareOp "
3542 "pCreateInfos->pDepthStencilState->depthCompareOp, is "
3543 "an unrecognized enumerator");
3544 return false;
3545 }
3546 if (pCreateInfos->pDepthStencilState->front.failOp <
3547 VK_STENCIL_OP_BEGIN_RANGE ||
3548 pCreateInfos->pDepthStencilState->front.failOp >
3549 VK_STENCIL_OP_END_RANGE) {
3550 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3551 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3552 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3553 "VkStencilOp "
3554 "pCreateInfos->pDepthStencilState->front."
3555 "failOp, is an unrecognized enumerator");
3556 return false;
3557 }
3558 if (pCreateInfos->pDepthStencilState->front.passOp <
3559 VK_STENCIL_OP_BEGIN_RANGE ||
3560 pCreateInfos->pDepthStencilState->front.passOp >
3561 VK_STENCIL_OP_END_RANGE) {
3562 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3563 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3564 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3565 "VkStencilOp "
3566 "pCreateInfos->pDepthStencilState->front."
3567 "passOp, is an unrecognized enumerator");
3568 return false;
3569 }
3570 if (pCreateInfos->pDepthStencilState->front.depthFailOp <
3571 VK_STENCIL_OP_BEGIN_RANGE ||
3572 pCreateInfos->pDepthStencilState->front.depthFailOp >
3573 VK_STENCIL_OP_END_RANGE) {
3574 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3575 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3576 "PARAMCHECK",
3577 "vkCreateGraphicsPipelines parameter, VkStencilOp "
3578 "pCreateInfos->pDepthStencilState->front.depthFailOp, "
3579 "is an unrecognized enumerator");
3580 return false;
3581 }
3582 if (pCreateInfos->pDepthStencilState->front.compareOp <
3583 VK_COMPARE_OP_BEGIN_RANGE ||
3584 pCreateInfos->pDepthStencilState->front.compareOp >
3585 VK_COMPARE_OP_END_RANGE) {
3586 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3587 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3588 "PARAMCHECK",
3589 "vkCreateGraphicsPipelines parameter, VkCompareOp "
3590 "pCreateInfos->pDepthStencilState->front.compareOp, is "
3591 "an unrecognized enumerator");
3592 return false;
3593 }
3594 if (pCreateInfos->pDepthStencilState->back.failOp <
3595 VK_STENCIL_OP_BEGIN_RANGE ||
3596 pCreateInfos->pDepthStencilState->back.failOp >
3597 VK_STENCIL_OP_END_RANGE) {
3598 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3599 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3600 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3601 "VkStencilOp "
3602 "pCreateInfos->pDepthStencilState->back."
3603 "failOp, is an unrecognized enumerator");
3604 return false;
3605 }
3606 if (pCreateInfos->pDepthStencilState->back.passOp <
3607 VK_STENCIL_OP_BEGIN_RANGE ||
3608 pCreateInfos->pDepthStencilState->back.passOp >
3609 VK_STENCIL_OP_END_RANGE) {
3610 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3611 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3612 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3613 "VkStencilOp "
3614 "pCreateInfos->pDepthStencilState->back."
3615 "passOp, is an unrecognized enumerator");
3616 return false;
3617 }
3618 if (pCreateInfos->pDepthStencilState->back.depthFailOp <
3619 VK_STENCIL_OP_BEGIN_RANGE ||
3620 pCreateInfos->pDepthStencilState->back.depthFailOp >
3621 VK_STENCIL_OP_END_RANGE) {
3622 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3623 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3624 "PARAMCHECK",
3625 "vkCreateGraphicsPipelines parameter, VkStencilOp "
3626 "pCreateInfos->pDepthStencilState->back.depthFailOp, "
3627 "is an unrecognized enumerator");
3628 return false;
3629 }
3630 if (pCreateInfos->pDepthStencilState->back.compareOp <
3631 VK_COMPARE_OP_BEGIN_RANGE ||
3632 pCreateInfos->pDepthStencilState->back.compareOp >
3633 VK_COMPARE_OP_END_RANGE) {
3634 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3635 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3636 "PARAMCHECK",
3637 "vkCreateGraphicsPipelines parameter, VkCompareOp "
3638 "pCreateInfos->pDepthStencilState->back.compareOp, is "
3639 "an unrecognized enumerator");
3640 return false;
3641 }
3642 }
3643 if (pCreateInfos->pColorBlendState != nullptr) {
3644 if (pCreateInfos->pColorBlendState->sType !=
3645 VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3646 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3647 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3648 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3649 "VkStructureType "
3650 "pCreateInfos->pColorBlendState->sType, "
3651 "is an invalid enumerator");
3652 return false;
3653 }
3654 if (pCreateInfos->pColorBlendState->logicOpEnable == VK_TRUE &&
3655 pCreateInfos->pColorBlendState->logicOp <
3656 VK_LOGIC_OP_BEGIN_RANGE ||
3657 pCreateInfos->pColorBlendState->logicOp >
3658 VK_LOGIC_OP_END_RANGE) {
3659 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3660 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3661 "PARAMCHECK", "vkCreateGraphicsPipelines parameter, "
3662 "VkLogicOp "
3663 "pCreateInfos->pColorBlendState->logicOp,"
3664 " is an unrecognized enumerator");
3665 return false;
3666 }
3667 if (pCreateInfos->pColorBlendState->pAttachments != nullptr &&
3668 pCreateInfos->pColorBlendState->pAttachments->blendEnable ==
3669 VK_TRUE) {
3670 if (pCreateInfos->pColorBlendState->pAttachments
3671 ->srcColorBlendFactor <
3672 VK_BLEND_FACTOR_BEGIN_RANGE ||
3673 pCreateInfos->pColorBlendState->pAttachments
3674 ->srcColorBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3675 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3676 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3677 "PARAMCHECK", "vkCreateGraphicsPipelines "
3678 "parameter, VkBlendFactor "
3679 "pCreateInfos->pColorBlendState->"
3680 "pAttachments->srcColorBlendFactor, "
3681 "is an unrecognized enumerator");
3682 return false;
3683 }
3684 if (pCreateInfos->pColorBlendState->pAttachments
3685 ->dstColorBlendFactor <
3686 VK_BLEND_FACTOR_BEGIN_RANGE ||
3687 pCreateInfos->pColorBlendState->pAttachments
3688 ->dstColorBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3689 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3690 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3691 "PARAMCHECK", "vkCreateGraphicsPipelines "
3692 "parameter, VkBlendFactor "
3693 "pCreateInfos->pColorBlendState->"
3694 "pAttachments->dstColorBlendFactor, "
3695 "is an unrecognized enumerator");
3696 return false;
3697 }
3698 if (pCreateInfos->pColorBlendState->pAttachments->colorBlendOp <
3699 VK_BLEND_OP_BEGIN_RANGE ||
3700 pCreateInfos->pColorBlendState->pAttachments->colorBlendOp >
3701 VK_BLEND_OP_END_RANGE) {
3702 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3703 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3704 "PARAMCHECK",
3705 "vkCreateGraphicsPipelines parameter, VkBlendOp "
3706 "pCreateInfos->pColorBlendState->pAttachments->"
3707 "colorBlendOp, is an unrecognized enumerator");
3708 return false;
3709 }
3710 if (pCreateInfos->pColorBlendState->pAttachments
3711 ->srcAlphaBlendFactor <
3712 VK_BLEND_FACTOR_BEGIN_RANGE ||
3713 pCreateInfos->pColorBlendState->pAttachments
3714 ->srcAlphaBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3715 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3716 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3717 "PARAMCHECK", "vkCreateGraphicsPipelines "
3718 "parameter, VkBlendFactor "
3719 "pCreateInfos->pColorBlendState->"
3720 "pAttachments->srcAlphaBlendFactor, "
3721 "is an unrecognized enumerator");
3722 return false;
3723 }
3724 if (pCreateInfos->pColorBlendState->pAttachments
3725 ->dstAlphaBlendFactor <
3726 VK_BLEND_FACTOR_BEGIN_RANGE ||
3727 pCreateInfos->pColorBlendState->pAttachments
3728 ->dstAlphaBlendFactor > VK_BLEND_FACTOR_END_RANGE) {
3729 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3730 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3731 "PARAMCHECK", "vkCreateGraphicsPipelines "
3732 "parameter, VkBlendFactor "
3733 "pCreateInfos->pColorBlendState->"
3734 "pAttachments->dstAlphaBlendFactor, "
3735 "is an unrecognized enumerator");
3736 return false;
3737 }
3738 if (pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp <
3739 VK_BLEND_OP_BEGIN_RANGE ||
3740 pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp >
3741 VK_BLEND_OP_END_RANGE) {
3742 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3743 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3744 "PARAMCHECK",
3745 "vkCreateGraphicsPipelines parameter, VkBlendOp "
3746 "pCreateInfos->pColorBlendState->pAttachments->"
3747 "alphaBlendOp, is an unrecognized enumerator");
3748 return false;
3749 }
3750 }
3751 }
3752 if (pCreateInfos->renderPass == VK_NULL_HANDLE) {
3753 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3754 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3755 "vkCreateGraphicsPipelines parameter, VkRenderPass "
3756 "pCreateInfos->renderPass, is null pointer");
3757 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003758 }
3759
3760 return true;
3761}
3762
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003763bool PostCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache,
3764 uint32_t count, VkPipeline *pPipelines,
3765 VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003766
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003767 if (pPipelines != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003768 }
3769
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003770 if (result < VK_SUCCESS) {
3771 std::string reason =
3772 "vkCreateGraphicsPipelines parameter, VkResult result, is " +
3773 EnumeratorString(result);
3774 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3775 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3776 "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003777 return false;
3778 }
3779
3780 return true;
3781}
3782
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003783VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3784 vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache,
3785 uint32_t count,
3786 const VkGraphicsPipelineCreateInfo *pCreateInfos,
3787 const VkAllocationCallbacks *pAllocator,
3788 VkPipeline *pPipelines) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003789 PreCreateGraphicsPipelines(device, pCreateInfos);
3790
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003791 VkResult result =
3792 get_dispatch_table(pc_device_table_map, device)
3793 ->CreateGraphicsPipelines(device, pipelineCache, count,
3794 pCreateInfos, pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003795
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003796 PostCreateGraphicsPipelines(device, pipelineCache, count, pPipelines,
3797 result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003798
3799 return result;
3800}
3801
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003802bool
3803PreCreateComputePipelines(VkDevice device,
3804 const VkComputePipelineCreateInfo *pCreateInfos) {
3805 if (pCreateInfos != nullptr) {
3806 if (pCreateInfos->sType !=
3807 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO) {
3808 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3809 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3810 "vkCreateComputePipelines parameter, VkStructureType "
3811 "pCreateInfos->sType, is an invalid enumerator");
3812 return false;
3813 }
3814 if (pCreateInfos->stage.sType !=
3815 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO) {
3816 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3817 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3818 "vkCreateComputePipelines parameter, VkStructureType "
3819 "pCreateInfos->cs.sType, is an invalid enumerator");
3820 return false;
3821 }
3822 if (pCreateInfos->stage.pSpecializationInfo != nullptr) {
3823 if (pCreateInfos->stage.pSpecializationInfo->pMapEntries !=
3824 nullptr) {
3825 }
3826 if (pCreateInfos->stage.pSpecializationInfo->pData != nullptr) {
3827 }
3828 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003829 }
3830
3831 return true;
3832}
3833
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003834bool PostCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache,
3835 uint32_t count, VkPipeline *pPipelines,
3836 VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003837
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003838 if (pPipelines != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003839 }
3840
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003841 if (result < VK_SUCCESS) {
3842 std::string reason =
3843 "vkCreateComputePipelines parameter, VkResult result, is " +
3844 EnumeratorString(result);
3845 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3846 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3847 "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003848 return false;
3849 }
3850
3851 return true;
3852}
3853
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003854VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3855 vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache,
3856 uint32_t count,
3857 const VkComputePipelineCreateInfo *pCreateInfos,
3858 const VkAllocationCallbacks *pAllocator,
3859 VkPipeline *pPipelines) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003860 PreCreateComputePipelines(device, pCreateInfos);
3861
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003862 VkResult result =
3863 get_dispatch_table(pc_device_table_map, device)->CreateComputePipelines(
3864 device, pipelineCache, count, pCreateInfos, pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003865
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003866 PostCreateComputePipelines(device, pipelineCache, count, pPipelines,
3867 result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003868
3869 return result;
3870}
3871
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003872bool PreCreatePipelineLayout(VkDevice device,
3873 const VkPipelineLayoutCreateInfo *pCreateInfo) {
3874 if (pCreateInfo != nullptr) {
3875 if (pCreateInfo->sType !=
3876 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO) {
3877 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3878 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3879 "vkCreatePipelineLayout parameter, VkStructureType "
3880 "pCreateInfo->sType, is an invalid enumerator");
3881 return false;
3882 }
3883 if (pCreateInfo->pSetLayouts != nullptr) {
3884 }
3885 if (pCreateInfo->pPushConstantRanges != nullptr) {
3886 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003887 }
3888
3889 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003890}
3891
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003892bool PostCreatePipelineLayout(VkDevice device,
3893 VkPipelineLayout *pPipelineLayout,
3894 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003895
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003896 if (pPipelineLayout != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003897 }
3898
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003899 if (result < VK_SUCCESS) {
3900 std::string reason =
3901 "vkCreatePipelineLayout parameter, VkResult result, is " +
3902 EnumeratorString(result);
3903 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3904 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3905 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003906 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003907 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003908
3909 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003910}
3911
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003912VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3913 vkCreatePipelineLayout(VkDevice device,
3914 const VkPipelineLayoutCreateInfo *pCreateInfo,
3915 const VkAllocationCallbacks *pAllocator,
3916 VkPipelineLayout *pPipelineLayout) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003917 PreCreatePipelineLayout(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003918
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003919 VkResult result = get_dispatch_table(pc_device_table_map, device)
3920 ->CreatePipelineLayout(device, pCreateInfo,
3921 pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003922
3923 PostCreatePipelineLayout(device, pPipelineLayout, result);
3924
3925 return result;
3926}
3927
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07003928bool PreCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo) {
3929 if (pCreateInfo != nullptr) {
3930 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO) {
3931 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3932 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3933 "vkCreateSampler parameter, VkStructureType "
3934 "pCreateInfo->sType, is an invalid enumerator");
3935 return false;
3936 }
3937 if (pCreateInfo->magFilter < VK_FILTER_BEGIN_RANGE ||
3938 pCreateInfo->magFilter > VK_FILTER_END_RANGE) {
3939 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3940 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3941 "vkCreateSampler parameter, VkFilter "
3942 "pCreateInfo->magFilter, is an unrecognized enumerator");
3943 return false;
3944 }
3945 if (pCreateInfo->minFilter < VK_FILTER_BEGIN_RANGE ||
3946 pCreateInfo->minFilter > VK_FILTER_END_RANGE) {
3947 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3948 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3949 "vkCreateSampler parameter, VkFilter "
3950 "pCreateInfo->minFilter, is an unrecognized enumerator");
3951 return false;
3952 }
3953 if (pCreateInfo->mipmapMode < VK_SAMPLER_MIPMAP_MODE_BEGIN_RANGE ||
3954 pCreateInfo->mipmapMode > VK_SAMPLER_MIPMAP_MODE_END_RANGE) {
3955 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3956 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3957 "vkCreateSampler parameter, VkSamplerMipmapMode "
3958 "pCreateInfo->mipmapMode, is an unrecognized enumerator");
3959 return false;
3960 }
3961 if (pCreateInfo->addressModeU < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
3962 pCreateInfo->addressModeU > VK_SAMPLER_ADDRESS_MODE_END_RANGE) {
3963 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3964 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3965 "vkCreateSampler parameter, VkTexAddress "
3966 "pCreateInfo->addressModeU, is an unrecognized enumerator");
3967 return false;
3968 }
3969 if (pCreateInfo->addressModeV < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
3970 pCreateInfo->addressModeV > VK_SAMPLER_ADDRESS_MODE_END_RANGE) {
3971 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3972 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3973 "vkCreateSampler parameter, VkTexAddress "
3974 "pCreateInfo->addressModeV, is an unrecognized enumerator");
3975 return false;
3976 }
3977 if (pCreateInfo->addressModeW < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
3978 pCreateInfo->addressModeW > VK_SAMPLER_ADDRESS_MODE_END_RANGE) {
3979 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3980 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3981 "vkCreateSampler parameter, VkTexAddress "
3982 "pCreateInfo->addressModeW, is an unrecognized enumerator");
3983 return false;
3984 }
3985 if (pCreateInfo->compareEnable) {
3986 if (pCreateInfo->compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
3987 pCreateInfo->compareOp > VK_COMPARE_OP_END_RANGE) {
3988 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3989 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
3990 "PARAMCHECK", "vkCreateSampler parameter, VkCompareOp "
3991 "pCreateInfo->compareOp, is an "
3992 "unrecognized enumerator");
3993 return false;
3994 }
3995 }
3996 if (pCreateInfo->borderColor < VK_BORDER_COLOR_BEGIN_RANGE ||
3997 pCreateInfo->borderColor > VK_BORDER_COLOR_END_RANGE) {
3998 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
3999 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4000 "vkCreateSampler parameter, VkBorderColor "
4001 "pCreateInfo->borderColor, is an unrecognized enumerator");
Jeremy Hayes85502ea2015-11-16 17:23:59 -07004002 return false;
4003 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004004 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004005
4006 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004007}
4008
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004009bool PostCreateSampler(VkDevice device, VkSampler *pSampler, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004010
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004011 if (pSampler != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004012 }
4013
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004014 if (result < VK_SUCCESS) {
4015 std::string reason = "vkCreateSampler parameter, VkResult result, is " +
4016 EnumeratorString(result);
4017 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4018 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4019 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004020 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004021 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004022
4023 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004024}
4025
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004026VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4027 vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
4028 const VkAllocationCallbacks *pAllocator,
4029 VkSampler *pSampler) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004030 PreCreateSampler(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004031
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004032 VkResult result =
4033 get_dispatch_table(pc_device_table_map, device)
4034 ->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004035
4036 PostCreateSampler(device, pSampler, result);
4037
4038 return result;
4039}
4040
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004041bool PreCreateDescriptorSetLayout(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004042 VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo) {
4043 if (pCreateInfo != nullptr) {
4044 if (pCreateInfo->sType !=
4045 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO) {
4046 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4047 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4048 "vkCreateDescriptorSetLayout parameter, VkStructureType "
4049 "pCreateInfo->sType, is an invalid enumerator");
4050 return false;
4051 }
4052 if (pCreateInfo->pBindings != nullptr) {
4053 if (pCreateInfo->pBindings->descriptorType <
4054 VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
4055 pCreateInfo->pBindings->descriptorType >
4056 VK_DESCRIPTOR_TYPE_END_RANGE) {
4057 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4058 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4059 "PARAMCHECK", "vkCreateDescriptorSetLayout parameter, "
4060 "VkDescriptorType "
4061 "pCreateInfo->pBindings->descriptorType, "
4062 "is an unrecognized enumerator");
4063 return false;
4064 }
4065 if (pCreateInfo->pBindings->pImmutableSamplers != nullptr) {
4066 }
4067 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004068 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004069
4070 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004071}
4072
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004073bool PostCreateDescriptorSetLayout(VkDevice device,
4074 VkDescriptorSetLayout *pSetLayout,
4075 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004076
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004077 if (pSetLayout != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004078 }
4079
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004080 if (result < VK_SUCCESS) {
4081 std::string reason =
4082 "vkCreateDescriptorSetLayout parameter, VkResult result, is " +
4083 EnumeratorString(result);
4084 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4085 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4086 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004087 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004088 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004089
4090 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004091}
4092
Chia-I Wu9ab61502015-11-06 06:42:02 +08004093VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004094 VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
4095 const VkAllocationCallbacks *pAllocator,
4096 VkDescriptorSetLayout *pSetLayout) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004097 PreCreateDescriptorSetLayout(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004098
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004099 VkResult result = get_dispatch_table(pc_device_table_map, device)
4100 ->CreateDescriptorSetLayout(device, pCreateInfo,
4101 pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004102
4103 PostCreateDescriptorSetLayout(device, pSetLayout, result);
4104
4105 return result;
4106}
4107
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004108bool PreCreateDescriptorPool(VkDevice device,
4109 const VkDescriptorPoolCreateInfo *pCreateInfo) {
4110 if (pCreateInfo != nullptr) {
4111 if (pCreateInfo->sType !=
4112 VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO) {
4113 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4114 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4115 "vkCreateDescriptorPool parameter, VkStructureType "
4116 "pCreateInfo->sType, is an invalid enumerator");
4117 return false;
4118 }
4119 if (pCreateInfo->pPoolSizes != nullptr) {
4120 if (pCreateInfo->pPoolSizes->type <
4121 VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
4122 pCreateInfo->pPoolSizes->type > VK_DESCRIPTOR_TYPE_END_RANGE) {
4123 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4124 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4125 "PARAMCHECK", "vkCreateDescriptorPool parameter, "
4126 "VkDescriptorType "
4127 "pCreateInfo->pTypeCount->type, is an "
4128 "unrecognized enumerator");
4129 return false;
4130 }
4131 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004132 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004133
4134 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004135}
4136
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004137bool PostCreateDescriptorPool(VkDevice device, uint32_t maxSets,
4138 VkDescriptorPool *pDescriptorPool,
4139 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004140
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004141 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer?
4142 */
Jeremy Hayes99a96322015-06-26 12:48:09 -06004143
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004144 if (pDescriptorPool != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004145 }
4146
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004147 if (result < VK_SUCCESS) {
4148 std::string reason =
4149 "vkCreateDescriptorPool parameter, VkResult result, is " +
4150 EnumeratorString(result);
4151 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4152 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4153 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004154 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004155 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004156
4157 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004158}
4159
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004160VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4161 vkCreateDescriptorPool(VkDevice device,
4162 const VkDescriptorPoolCreateInfo *pCreateInfo,
4163 const VkAllocationCallbacks *pAllocator,
4164 VkDescriptorPool *pDescriptorPool) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004165 PreCreateDescriptorPool(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004166
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004167 VkResult result = get_dispatch_table(pc_device_table_map, device)
4168 ->CreateDescriptorPool(device, pCreateInfo,
4169 pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004170
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004171 PostCreateDescriptorPool(device, pCreateInfo->maxSets, pDescriptorPool,
4172 result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004173
4174 return result;
4175}
4176
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004177bool PostResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
4178 VkResult result) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004179
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004180 if (result < VK_SUCCESS) {
4181 std::string reason =
4182 "vkResetDescriptorPool parameter, VkResult result, is " +
4183 EnumeratorString(result);
4184 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4185 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4186 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004187 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004188 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004189
4190 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004191}
4192
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004193VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4194 vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
4195 VkDescriptorPoolResetFlags flags) {
4196 VkResult result = get_dispatch_table(pc_device_table_map, device)
4197 ->ResetDescriptorPool(device, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004198
4199 PostResetDescriptorPool(device, descriptorPool, result);
4200
4201 return result;
4202}
4203
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004204bool PreAllocateDescriptorSets(VkDevice device,
4205 const VkDescriptorSetLayout *pSetLayouts) {
4206 if (pSetLayouts != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004207 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004208
4209 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004210}
4211
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004212bool PostAllocateDescriptorSets(VkDevice device,
4213 VkDescriptorPool descriptorPool, uint32_t count,
4214 VkDescriptorSet *pDescriptorSets,
4215 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004216
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004217 if (pDescriptorSets != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004218 }
4219
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004220 if (result < VK_SUCCESS) {
4221 std::string reason =
4222 "vkAllocateDescriptorSets parameter, VkResult result, is " +
4223 EnumeratorString(result);
4224 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4226 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004227 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004228 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004229
4230 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004231}
4232
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004233VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4234 vkAllocateDescriptorSets(VkDevice device,
4235 const VkDescriptorSetAllocateInfo *pAllocateInfo,
4236 VkDescriptorSet *pDescriptorSets) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004237 PreAllocateDescriptorSets(device, pAllocateInfo->pSetLayouts);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004238
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004239 VkResult result =
4240 get_dispatch_table(pc_device_table_map, device)
4241 ->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004242
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004243 PostAllocateDescriptorSets(device, pAllocateInfo->descriptorPool,
4244 pAllocateInfo->descriptorSetCount,
4245 pDescriptorSets, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004246
4247 return result;
4248}
4249
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004250bool PreFreeDescriptorSets(VkDevice device,
4251 const VkDescriptorSet *pDescriptorSets) {
4252 if (pDescriptorSets != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004253 }
4254
4255 return true;
4256}
4257
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004258bool PostFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
4259 uint32_t count, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004260
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004261 if (result < VK_SUCCESS) {
4262 std::string reason =
4263 "vkFreeDescriptorSets parameter, VkResult result, is " +
4264 EnumeratorString(result);
4265 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4266 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4267 "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004268 return false;
4269 }
4270
4271 return true;
4272}
4273
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004274VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4275 vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
4276 uint32_t count,
4277 const VkDescriptorSet *pDescriptorSets) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004278 PreFreeDescriptorSets(device, pDescriptorSets);
4279
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004280 VkResult result = get_dispatch_table(pc_device_table_map, device)
4281 ->FreeDescriptorSets(device, descriptorPool, count,
4282 pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004283
4284 PostFreeDescriptorSets(device, descriptorPool, count, result);
4285
4286 return result;
4287}
4288
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004289bool PreUpdateDescriptorSets(VkDevice device,
4290 const VkWriteDescriptorSet *pDescriptorWrites,
4291 const VkCopyDescriptorSet *pDescriptorCopies) {
4292 if (pDescriptorWrites != nullptr) {
4293 if (pDescriptorWrites->sType !=
4294 VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET) {
4295 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4296 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4297 "vkUpdateDescriptorSets parameter, VkStructureType "
4298 "pDescriptorWrites->sType, is an invalid enumerator");
4299 return false;
4300 }
4301 if (pDescriptorWrites->descriptorType <
4302 VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
4303 pDescriptorWrites->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE) {
4304 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4305 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4306 "vkUpdateDescriptorSets parameter, VkDescriptorType "
4307 "pDescriptorWrites->descriptorType, is an unrecognized "
4308 "enumerator");
4309 return false;
4310 }
4311 /* TODO: Validate other parts of pImageInfo, pBufferInfo,
4312 * pTexelBufferView? */
4313 /* TODO: This test should probably only be done if descriptorType is
4314 * correct type of descriptor */
4315 if (pDescriptorWrites->pImageInfo != nullptr) {
4316 if (((pDescriptorWrites->pImageInfo->imageLayout <
4317 VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4318 (pDescriptorWrites->pImageInfo->imageLayout >
4319 VK_IMAGE_LAYOUT_END_RANGE)) &&
4320 (pDescriptorWrites->pImageInfo->imageLayout !=
4321 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
4322 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4323 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4324 "PARAMCHECK",
4325 "vkUpdateDescriptorSets parameter, VkImageLayout "
4326 "pDescriptorWrites->pDescriptors->imageLayout, is an "
4327 "unrecognized enumerator");
4328 return false;
4329 }
4330 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004331 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004332
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004333 if (pDescriptorCopies != nullptr) {
4334 if (pDescriptorCopies->sType != VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET) {
4335 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4336 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4337 "vkUpdateDescriptorSets parameter, VkStructureType "
4338 "pDescriptorCopies->sType, is an invalid enumerator");
4339 return false;
4340 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004341 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004342
4343 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004344}
4345
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004346VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4347 vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
4348 const VkWriteDescriptorSet *pDescriptorWrites,
4349 uint32_t descriptorCopyCount,
4350 const VkCopyDescriptorSet *pDescriptorCopies) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004351 PreUpdateDescriptorSets(device, pDescriptorWrites, pDescriptorCopies);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004352
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004353 get_dispatch_table(pc_device_table_map, device)
4354 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites,
4355 descriptorCopyCount, pDescriptorCopies);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004356}
4357
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004358bool PreCreateFramebuffer(VkDevice device,
4359 const VkFramebufferCreateInfo *pCreateInfo) {
4360 if (pCreateInfo != nullptr) {
4361 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO) {
4362 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4363 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4364 "vkCreateFramebuffer parameter, VkStructureType "
4365 "pCreateInfo->sType, is an invalid enumerator");
4366 return false;
4367 }
4368 if (pCreateInfo->pAttachments != nullptr) {
4369 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004370 }
4371
4372 return true;
4373}
4374
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004375bool PostCreateFramebuffer(VkDevice device, VkFramebuffer *pFramebuffer,
4376 VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004377
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004378 if (pFramebuffer != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004379 }
4380
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004381 if (result < VK_SUCCESS) {
4382 std::string reason =
4383 "vkCreateFramebuffer parameter, VkResult result, is " +
4384 EnumeratorString(result);
4385 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4386 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4387 "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004388 return false;
4389 }
4390
4391 return true;
4392}
4393
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004394VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4395 vkCreateFramebuffer(VkDevice device,
4396 const VkFramebufferCreateInfo *pCreateInfo,
4397 const VkAllocationCallbacks *pAllocator,
4398 VkFramebuffer *pFramebuffer) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004399 PreCreateFramebuffer(device, pCreateInfo);
4400
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004401 VkResult result =
4402 get_dispatch_table(pc_device_table_map, device)
4403 ->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004404
4405 PostCreateFramebuffer(device, pFramebuffer, result);
4406
4407 return result;
4408}
4409
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004410bool PreCreateRenderPass(VkDevice device,
4411 const VkRenderPassCreateInfo *pCreateInfo) {
4412 if (pCreateInfo != nullptr) {
4413 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO) {
4414 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4415 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4416 "vkCreateRenderPass parameter, VkStructureType "
4417 "pCreateInfo->sType, is an invalid enumerator");
4418 return false;
4419 }
4420 if (pCreateInfo->pAttachments != nullptr) {
4421 if (pCreateInfo->pAttachments->format < VK_FORMAT_BEGIN_RANGE ||
4422 pCreateInfo->pAttachments->format > VK_FORMAT_END_RANGE) {
4423 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4424 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4425 "PARAMCHECK", "vkCreateRenderPass parameter, VkFormat "
4426 "pCreateInfo->pAttachments->format, is "
4427 "an unrecognized enumerator");
4428 return false;
4429 }
4430 if (pCreateInfo->pAttachments->loadOp <
4431 VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
4432 pCreateInfo->pAttachments->loadOp >
4433 VK_ATTACHMENT_LOAD_OP_END_RANGE) {
4434 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4435 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4436 "PARAMCHECK", "vkCreateRenderPass parameter, "
4437 "VkAttachmentLoadOp "
4438 "pCreateInfo->pAttachments->loadOp, is "
4439 "an unrecognized enumerator");
4440 return false;
4441 }
4442 if (pCreateInfo->pAttachments->storeOp <
4443 VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
4444 pCreateInfo->pAttachments->storeOp >
4445 VK_ATTACHMENT_STORE_OP_END_RANGE) {
4446 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4447 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4448 "PARAMCHECK", "vkCreateRenderPass parameter, "
4449 "VkAttachmentStoreOp "
4450 "pCreateInfo->pAttachments->storeOp, is "
4451 "an unrecognized enumerator");
4452 return false;
4453 }
4454 if (pCreateInfo->pAttachments->stencilLoadOp <
4455 VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
4456 pCreateInfo->pAttachments->stencilLoadOp >
4457 VK_ATTACHMENT_LOAD_OP_END_RANGE) {
4458 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4459 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4460 "PARAMCHECK",
4461 "vkCreateRenderPass parameter, VkAttachmentLoadOp "
4462 "pCreateInfo->pAttachments->stencilLoadOp, is an "
4463 "unrecognized enumerator");
4464 return false;
4465 }
4466 if (pCreateInfo->pAttachments->stencilStoreOp <
4467 VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
4468 pCreateInfo->pAttachments->stencilStoreOp >
4469 VK_ATTACHMENT_STORE_OP_END_RANGE) {
4470 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4471 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4472 "PARAMCHECK",
4473 "vkCreateRenderPass parameter, VkAttachmentStoreOp "
4474 "pCreateInfo->pAttachments->stencilStoreOp, is an "
4475 "unrecognized enumerator");
4476 return false;
4477 }
4478 if (((pCreateInfo->pAttachments->initialLayout <
4479 VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4480 (pCreateInfo->pAttachments->initialLayout >
4481 VK_IMAGE_LAYOUT_END_RANGE)) &&
4482 (pCreateInfo->pAttachments->initialLayout !=
4483 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
4484 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4485 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4486 "PARAMCHECK",
4487 "vkCreateRenderPass parameter, VkImageLayout "
4488 "pCreateInfo->pAttachments->initialLayout, is an "
4489 "unrecognized enumerator");
4490 return false;
4491 }
4492 if (((pCreateInfo->pAttachments->initialLayout <
4493 VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4494 (pCreateInfo->pAttachments->initialLayout >
4495 VK_IMAGE_LAYOUT_END_RANGE)) &&
4496 (pCreateInfo->pAttachments->initialLayout !=
4497 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
4498 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4499 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4500 "PARAMCHECK", "vkCreateRenderPass parameter, "
4501 "VkImageLayout "
4502 "pCreateInfo->pAttachments->finalLayout, "
4503 "is an unrecognized enumerator");
4504 return false;
4505 }
4506 }
4507 if (pCreateInfo->pSubpasses != nullptr) {
4508 if (pCreateInfo->pSubpasses->pipelineBindPoint <
4509 VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
4510 pCreateInfo->pSubpasses->pipelineBindPoint >
4511 VK_PIPELINE_BIND_POINT_END_RANGE) {
4512 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4513 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4514 "PARAMCHECK",
4515 "vkCreateRenderPass parameter, VkPipelineBindPoint "
4516 "pCreateInfo->pSubpasses->pipelineBindPoint, is an "
4517 "unrecognized enumerator");
4518 return false;
4519 }
4520 if (pCreateInfo->pSubpasses->pInputAttachments != nullptr) {
4521 if (((pCreateInfo->pSubpasses->pInputAttachments->layout <
4522 VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4523 (pCreateInfo->pSubpasses->pInputAttachments->layout >
4524 VK_IMAGE_LAYOUT_END_RANGE)) &&
4525 (pCreateInfo->pSubpasses->pInputAttachments->layout !=
4526 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
4527 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4528 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4529 "PARAMCHECK",
4530 "vkCreateRenderPass parameter, VkImageLayout "
4531 "pCreateInfo->pSubpasses->pInputAttachments->"
4532 "layout, is an unrecognized enumerator");
4533 return false;
4534 }
4535 }
4536 if (pCreateInfo->pSubpasses->pColorAttachments != nullptr) {
4537 if (((pCreateInfo->pSubpasses->pColorAttachments->layout <
4538 VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4539 (pCreateInfo->pSubpasses->pColorAttachments->layout >
4540 VK_IMAGE_LAYOUT_END_RANGE)) &&
4541 (pCreateInfo->pSubpasses->pColorAttachments->layout !=
4542 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
4543 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4544 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4545 "PARAMCHECK",
4546 "vkCreateRenderPass parameter, VkImageLayout "
4547 "pCreateInfo->pSubpasses->pColorAttachments->"
4548 "layout, is an unrecognized enumerator");
4549 return false;
4550 }
4551 }
4552 if (pCreateInfo->pSubpasses->pResolveAttachments != nullptr) {
4553 if (((pCreateInfo->pSubpasses->pResolveAttachments->layout <
4554 VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4555 (pCreateInfo->pSubpasses->pResolveAttachments->layout >
4556 VK_IMAGE_LAYOUT_END_RANGE)) &&
4557 (pCreateInfo->pSubpasses->pResolveAttachments->layout !=
4558 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
4559 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4560 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4561 "PARAMCHECK",
4562 "vkCreateRenderPass parameter, VkImageLayout "
4563 "pCreateInfo->pSubpasses->pResolveAttachments->"
4564 "layout, is an unrecognized enumerator");
4565 return false;
4566 }
4567 }
4568 if (pCreateInfo->pSubpasses->pDepthStencilAttachment &&
4569 ((pCreateInfo->pSubpasses->pDepthStencilAttachment->layout <
4570 VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4571 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout >
4572 VK_IMAGE_LAYOUT_END_RANGE)) &&
4573 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout !=
4574 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
4575 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4576 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
4577 "PARAMCHECK",
4578 "vkCreateRenderPass parameter, VkImageLayout "
4579 "pCreateInfo->pSubpasses->pDepthStencilAttachment->"
4580 "layout, is an unrecognized enumerator");
4581 return false;
4582 }
4583 }
4584 if (pCreateInfo->pDependencies != nullptr) {
4585 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004586 }
4587
4588 return true;
4589}
4590
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004591bool PostCreateRenderPass(VkDevice device, VkRenderPass *pRenderPass,
4592 VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004593
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004594 if (pRenderPass != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004595 }
4596
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004597 if (result < VK_SUCCESS) {
4598 std::string reason =
4599 "vkCreateRenderPass parameter, VkResult result, is " +
4600 EnumeratorString(result);
4601 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4602 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4603 "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004604 return false;
4605 }
4606
4607 return true;
4608}
4609
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004610VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4611 vkCreateRenderPass(VkDevice device,
4612 const VkRenderPassCreateInfo *pCreateInfo,
4613 const VkAllocationCallbacks *pAllocator,
4614 VkRenderPass *pRenderPass) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004615 PreCreateRenderPass(device, pCreateInfo);
4616
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004617 VkResult result =
4618 get_dispatch_table(pc_device_table_map, device)
4619 ->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004620
4621 PostCreateRenderPass(device, pRenderPass, result);
4622
4623 return result;
4624}
4625
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004626bool PostGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass,
4627 VkExtent2D *pGranularity) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004628
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004629 if (pGranularity != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004630 }
4631
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004632 return true;
4633}
4634
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004635VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4636 vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass,
4637 VkExtent2D *pGranularity) {
4638 get_dispatch_table(pc_device_table_map, device)
4639 ->GetRenderAreaGranularity(device, renderPass, pGranularity);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004640
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06004641 PostGetRenderAreaGranularity(device, renderPass, pGranularity);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004642}
4643
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004644bool PreCreateCommandPool(VkDevice device,
4645 const VkCommandPoolCreateInfo *pCreateInfo) {
4646 if (pCreateInfo != nullptr) {
4647 if (pCreateInfo->sType != VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO) {
4648 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4649 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4650 "vkCreateCommandPool parameter, VkStructureType "
4651 "pCreateInfo->sType, is an invalid enumerator");
4652 return false;
4653 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004654 }
4655
4656 return true;
4657}
4658
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004659bool PostCreateCommandPool(VkDevice device, VkCommandPool *pCommandPool,
4660 VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004661
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004662 if (pCommandPool != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004663 }
4664
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004665 if (result < VK_SUCCESS) {
4666 std::string reason =
4667 "vkCreateCommandPool parameter, VkResult result, is " +
4668 EnumeratorString(result);
4669 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4670 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4671 "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004672 return false;
4673 }
4674
4675 return true;
4676}
4677
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004678VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4679 vkCreateCommandPool(VkDevice device,
4680 const VkCommandPoolCreateInfo *pCreateInfo,
4681 const VkAllocationCallbacks *pAllocator,
4682 VkCommandPool *pCommandPool) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004683 PreCreateCommandPool(device, pCreateInfo);
4684
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004685 VkResult result =
4686 get_dispatch_table(pc_device_table_map, device)
4687 ->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004688
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004689 PostCreateCommandPool(device, pCommandPool, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004690
4691 return result;
4692}
4693
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004694bool PostResetCommandPool(VkDevice device, VkCommandPool commandPool,
4695 VkCommandPoolResetFlags flags, VkResult result) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004696
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004697 if (result < VK_SUCCESS) {
4698 std::string reason =
4699 "vkResetCommandPool parameter, VkResult result, is " +
4700 EnumeratorString(result);
4701 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4702 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4703 "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004704 return false;
4705 }
4706
4707 return true;
4708}
4709
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004710VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4711 vkResetCommandPool(VkDevice device, VkCommandPool commandPool,
4712 VkCommandPoolResetFlags flags) {
4713 VkResult result = get_dispatch_table(pc_device_table_map, device)
4714 ->ResetCommandPool(device, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004715
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004716 PostResetCommandPool(device, commandPool, flags, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004717
4718 return result;
4719}
4720
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004721bool PreCreateCommandBuffer(VkDevice device,
4722 const VkCommandBufferAllocateInfo *pCreateInfo) {
4723 if (pCreateInfo != nullptr) {
4724 if (pCreateInfo->sType !=
4725 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO) {
4726 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4727 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4728 "vkAllocateCommandBuffers parameter, VkStructureType "
4729 "pCreateInfo->sType, is an invalid enumerator");
4730 return false;
4731 }
4732 if (pCreateInfo->level < VK_COMMAND_BUFFER_LEVEL_BEGIN_RANGE ||
4733 pCreateInfo->level > VK_COMMAND_BUFFER_LEVEL_END_RANGE) {
4734 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4735 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4736 "vkAllocateCommandBuffers parameter, VkCommandBufferLevel "
4737 "pCreateInfo->level, is an unrecognized enumerator");
4738 return false;
4739 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004740 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004741
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004742 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004743}
4744
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004745bool PostCreateCommandBuffer(VkDevice device, VkCommandBuffer *pCommandBuffer,
4746 VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004747
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004748 if (pCommandBuffer != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004749 }
4750
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004751 if (result < VK_SUCCESS) {
4752 std::string reason =
4753 "vkAllocateCommandBuffers parameter, VkResult result, is " +
4754 EnumeratorString(result);
4755 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4756 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4757 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004758 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004759 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004760
4761 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004762}
4763
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004764VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4765 vkAllocateCommandBuffers(VkDevice device,
4766 const VkCommandBufferAllocateInfo *pCreateInfo,
4767 VkCommandBuffer *pCommandBuffer) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004768 PreCreateCommandBuffer(device, pCreateInfo);
4769
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004770 VkResult result =
4771 get_dispatch_table(pc_device_table_map, device)
4772 ->AllocateCommandBuffers(device, pCreateInfo, pCommandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004773
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004774 PostCreateCommandBuffer(device, pCommandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004775
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004776 return result;
4777}
4778
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004779bool PreBeginCommandBuffer(VkCommandBuffer commandBuffer,
4780 const VkCommandBufferBeginInfo *pBeginInfo) {
4781 if (pBeginInfo != nullptr) {
4782 if (pBeginInfo->sType != VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO) {
4783 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4784 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4785 "vkBeginCommandBuffer parameter, VkStructureType "
4786 "pBeginInfo->sType, is an invalid enumerator");
4787 return false;
4788 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004789 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004790
4791 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004792}
4793
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004794bool PostBeginCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004795
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004796 if (result < VK_SUCCESS) {
4797 std::string reason =
4798 "vkBeginCommandBuffer parameter, VkResult result, is " +
4799 EnumeratorString(result);
4800 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4801 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4802 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004803 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004804 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004805
4806 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004807}
4808
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004809VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4810 vkBeginCommandBuffer(VkCommandBuffer commandBuffer,
4811 const VkCommandBufferBeginInfo *pBeginInfo) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004812 PreBeginCommandBuffer(commandBuffer, pBeginInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004813
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004814 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)
4815 ->BeginCommandBuffer(commandBuffer, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004816
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004817 PostBeginCommandBuffer(commandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004818
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004819 return result;
4820}
4821
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004822bool PostEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004823
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004824 if (result < VK_SUCCESS) {
4825 std::string reason =
4826 "vkEndCommandBuffer parameter, VkResult result, is " +
4827 EnumeratorString(result);
4828 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4829 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4830 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004831 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004832 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004833
4834 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004835}
4836
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004837VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4838 vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
4839 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)
4840 ->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004841
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004842 PostEndCommandBuffer(commandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004843
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004844 return result;
4845}
4846
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004847bool PostResetCommandBuffer(VkCommandBuffer commandBuffer,
4848 VkCommandBufferResetFlags flags, VkResult result) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004849
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004850 if (result < VK_SUCCESS) {
4851 std::string reason =
4852 "vkResetCommandBuffer parameter, VkResult result, is " +
4853 EnumeratorString(result);
4854 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4855 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4856 "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004857 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004858 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004859
4860 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004861}
4862
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004863VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4864 vkResetCommandBuffer(VkCommandBuffer commandBuffer,
4865 VkCommandBufferResetFlags flags) {
4866 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)
4867 ->ResetCommandBuffer(commandBuffer, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004868
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004869 PostResetCommandBuffer(commandBuffer, flags, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004870
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004871 return result;
4872}
4873
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004874bool PostCmdBindPipeline(VkCommandBuffer commandBuffer,
4875 VkPipelineBindPoint pipelineBindPoint,
4876 VkPipeline pipeline) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004877
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004878 if (pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
4879 pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE) {
4880 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4881 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4882 "vkCmdBindPipeline parameter, VkPipelineBindPoint "
4883 "pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004884 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004885 }
4886
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004887 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004888}
4889
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004890VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4891 vkCmdBindPipeline(VkCommandBuffer commandBuffer,
4892 VkPipelineBindPoint pipelineBindPoint,
4893 VkPipeline pipeline) {
4894 get_dispatch_table(pc_device_table_map, commandBuffer)
4895 ->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004896
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004897 PostCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004898}
4899
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004900VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4901 vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
4902 uint32_t viewportCount, const VkViewport *pViewports) {
4903 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetViewport(
4904 commandBuffer, firstViewport, viewportCount, pViewports);
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004905}
4906
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004907VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4908 vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor,
4909 uint32_t scissorCount, const VkRect2D *pScissors) {
4910 get_dispatch_table(pc_device_table_map, commandBuffer)
4911 ->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004912}
4913
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004914VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4915 vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
4916 get_dispatch_table(pc_device_table_map, commandBuffer)
4917 ->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004918}
4919
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004920VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4921 vkCmdSetDepthBias(VkCommandBuffer commandBuffer,
4922 float depthBiasConstantFactor, float depthBiasClamp,
4923 float depthBiasSlopeFactor) {
4924 get_dispatch_table(pc_device_table_map, commandBuffer)
4925 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor,
4926 depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004927}
4928
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004929VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4930 vkCmdSetBlendConstants(VkCommandBuffer commandBuffer,
4931 const float blendConstants[4]) {
4932 get_dispatch_table(pc_device_table_map, commandBuffer)
4933 ->CmdSetBlendConstants(commandBuffer, blendConstants);
Cody Northrop12365112015-08-17 11:10:49 -06004934}
4935
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004936VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4937 vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
4938 float maxDepthBounds) {
4939 get_dispatch_table(pc_device_table_map, commandBuffer)
4940 ->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004941}
4942
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004943VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4944 vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer,
4945 VkStencilFaceFlags faceMask,
4946 uint32_t compareMask) {
4947 get_dispatch_table(pc_device_table_map, commandBuffer)
4948 ->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004949}
4950
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004951VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4952 vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer,
4953 VkStencilFaceFlags faceMask, uint32_t writeMask) {
4954 get_dispatch_table(pc_device_table_map, commandBuffer)
4955 ->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004956}
4957
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004958VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4959 vkCmdSetStencilReference(VkCommandBuffer commandBuffer,
4960 VkStencilFaceFlags faceMask, uint32_t reference) {
4961 get_dispatch_table(pc_device_table_map, commandBuffer)
4962 ->CmdSetStencilReference(commandBuffer, faceMask, reference);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004963}
4964
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004965bool PreCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
4966 const VkDescriptorSet *pDescriptorSets,
4967 const uint32_t *pDynamicOffsets) {
4968 if (pDescriptorSets != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004969 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004970
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004971 if (pDynamicOffsets != nullptr) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004972 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004973
4974 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004975}
4976
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004977bool PostCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
4978 VkPipelineBindPoint pipelineBindPoint,
4979 VkPipelineLayout layout, uint32_t firstSet,
4980 uint32_t setCount, uint32_t dynamicOffsetCount) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004981
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004982 if (pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
4983 pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE) {
4984 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
4985 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4986 "vkCmdBindDescriptorSets parameter, VkPipelineBindPoint "
4987 "pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004988 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004989 }
4990
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004991 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004992}
4993
Chia-I Wu9ab61502015-11-06 06:42:02 +08004994VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004995 VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4996 VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount,
4997 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4998 const uint32_t *pDynamicOffsets) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004999 PreCmdBindDescriptorSets(commandBuffer, pDescriptorSets, pDynamicOffsets);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005000
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005001 get_dispatch_table(pc_device_table_map, commandBuffer)
5002 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout,
5003 firstSet, setCount, pDescriptorSets,
5004 dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005005
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005006 PostCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout,
5007 firstSet, setCount, dynamicOffsetCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005008}
5009
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005010bool PostCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer,
5011 VkDeviceSize offset, VkIndexType indexType) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005012
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005013 if (indexType < VK_INDEX_TYPE_BEGIN_RANGE ||
5014 indexType > VK_INDEX_TYPE_END_RANGE) {
5015 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5016 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5017 "vkCmdBindIndexBuffer parameter, VkIndexType indexType, is an "
5018 "unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005019 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005020 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005021
5022 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005023}
5024
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005025VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5026 vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer,
5027 VkDeviceSize offset, VkIndexType indexType) {
5028 get_dispatch_table(pc_device_table_map, commandBuffer)
5029 ->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005030
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005031 PostCmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005032}
5033
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005034bool PreCmdBindVertexBuffers(VkCommandBuffer commandBuffer,
5035 const VkBuffer *pBuffers,
5036 const VkDeviceSize *pOffsets) {
5037 if (pBuffers != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005038 }
5039
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005040 if (pOffsets != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005041 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005042
5043 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005044}
5045
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005046bool PostCmdBindVertexBuffers(VkCommandBuffer commandBuffer,
5047 uint32_t firstBinding, uint32_t bindingCount) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005048
5049 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005050}
5051
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005052VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5053 vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
5054 uint32_t bindingCount, const VkBuffer *pBuffers,
5055 const VkDeviceSize *pOffsets) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005056 PreCmdBindVertexBuffers(commandBuffer, pBuffers, pOffsets);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005057
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005058 get_dispatch_table(pc_device_table_map, commandBuffer)
5059 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount,
5060 pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005061
Jon Ashburn19d3bf12015-12-30 14:06:55 -07005062 PostCmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005063}
5064
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005065bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount,
5066 uint32_t instanceCount, uint32_t firstVertex,
5067 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06005068 if (vertexCount == 0) {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005069 // TODO: Verify against Valid Usage section. I don't see a non-zero
5070 // vertexCount listed, may need to add that and make
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005071 // this an error or leave as is.
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005072 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARN_BIT_EXT,
5073 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5074 "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06005075 return false;
5076 }
5077
5078 if (instanceCount == 0) {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005079 // TODO: Verify against Valid Usage section. I don't see a non-zero
5080 // instanceCount listed, may need to add that and make
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005081 // this an error or leave as is.
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005082 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARN_BIT_EXT,
5083 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5084 "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06005085 return false;
5086 }
5087
5088 return true;
5089}
5090
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005091bool PostCmdDraw(VkCommandBuffer commandBuffer, uint32_t firstVertex,
5092 uint32_t vertexCount, uint32_t firstInstance,
5093 uint32_t instanceCount) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005094
5095 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005096}
5097
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005098VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5099 vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount,
5100 uint32_t instanceCount, uint32_t firstVertex,
5101 uint32_t firstInstance) {
5102 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex,
5103 firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06005104
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005105 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDraw(
5106 commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005107
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005108 PostCmdDraw(commandBuffer, firstVertex, vertexCount, firstInstance,
5109 instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005110}
5111
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005112bool PostCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t firstIndex,
5113 uint32_t indexCount, int32_t vertexOffset,
5114 uint32_t firstInstance, uint32_t instanceCount) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005115
5116 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005117}
5118
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005119VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5120 vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
5121 uint32_t instanceCount, uint32_t firstIndex,
5122 int32_t vertexOffset, uint32_t firstInstance) {
5123 get_dispatch_table(pc_device_table_map, commandBuffer)
5124 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex,
5125 vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005126
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005127 PostCmdDrawIndexed(commandBuffer, firstIndex, indexCount, vertexOffset,
5128 firstInstance, instanceCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005129}
5130
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005131bool PostCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
5132 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005133
5134 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005135}
5136
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005137VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5138 vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
5139 VkDeviceSize offset, uint32_t count, uint32_t stride) {
5140 get_dispatch_table(pc_device_table_map, commandBuffer)
5141 ->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005142
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005143 PostCmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005144}
5145
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005146bool PostCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
5147 VkDeviceSize offset, uint32_t count,
5148 uint32_t stride) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005149
5150 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005151}
5152
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005153VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5154 vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
5155 VkDeviceSize offset, uint32_t count,
5156 uint32_t stride) {
5157 get_dispatch_table(pc_device_table_map, commandBuffer)
5158 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005159
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005160 PostCmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005161}
5162
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005163bool PostCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y,
5164 uint32_t z) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005165
5166 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005167}
5168
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005169VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5170 vkCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y,
5171 uint32_t z) {
5172 get_dispatch_table(pc_device_table_map, commandBuffer)
5173 ->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005174
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005175 PostCmdDispatch(commandBuffer, x, y, z);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005176}
5177
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005178bool PostCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
5179 VkDeviceSize offset) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005180
5181 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005182}
5183
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005184VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5185 vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
5186 VkDeviceSize offset) {
5187 get_dispatch_table(pc_device_table_map, commandBuffer)
5188 ->CmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005189
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005190 PostCmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005191}
5192
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005193bool PreCmdCopyBuffer(VkCommandBuffer commandBuffer,
5194 const VkBufferCopy *pRegions) {
5195 if (pRegions != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005196 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005197
5198 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005199}
5200
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005201bool PostCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
5202 VkBuffer dstBuffer, uint32_t regionCount) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005203
5204 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005205}
5206
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005207VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5208 vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
5209 VkBuffer dstBuffer, uint32_t regionCount,
5210 const VkBufferCopy *pRegions) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005211 PreCmdCopyBuffer(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005212
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005213 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyBuffer(
5214 commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005215
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005216 PostCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005217}
5218
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005219bool PreCmdCopyImage(VkCommandBuffer commandBuffer,
5220 const VkImageCopy *pRegions) {
5221 if (pRegions != nullptr) {
5222 if ((pRegions->srcSubresource.aspectMask &
5223 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
5224 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) ==
5225 0) {
5226 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5227 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5228 "vkCmdCopyImage parameter, VkImageAspect "
5229 "pRegions->srcSubresource.aspectMask, is an unrecognized "
5230 "enumerator");
5231 return false;
5232 }
5233 if ((pRegions->dstSubresource.aspectMask &
5234 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
5235 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) ==
5236 0) {
5237 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5238 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5239 "vkCmdCopyImage parameter, VkImageAspect "
5240 "pRegions->dstSubresource.aspectMask, is an unrecognized "
5241 "enumerator");
5242 return false;
5243 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005244 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005245
5246 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005247}
5248
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005249bool PostCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage,
5250 VkImageLayout srcImageLayout, VkImage dstImage,
5251 VkImageLayout dstImageLayout, uint32_t regionCount) {
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005252 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005253 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5254 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
5255 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5256 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5257 "vkCmdCopyImage parameter, VkImageLayout srcImageLayout, is an "
5258 "unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005259 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005260 }
5261
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005262 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005263 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5264 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
5265 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5266 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5267 "vkCmdCopyImage parameter, VkImageLayout dstImageLayout, is an "
5268 "unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005269 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005270 }
5271
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005272 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005273}
5274
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005275VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5276 vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage,
5277 VkImageLayout srcImageLayout, VkImage dstImage,
5278 VkImageLayout dstImageLayout, uint32_t regionCount,
5279 const VkImageCopy *pRegions) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005280 PreCmdCopyImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005281
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005282 get_dispatch_table(pc_device_table_map, commandBuffer)
5283 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage,
5284 dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005285
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005286 PostCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage,
5287 dstImageLayout, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005288}
5289
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005290bool PreCmdBlitImage(VkCommandBuffer commandBuffer,
5291 const VkImageBlit *pRegions) {
5292 if (pRegions != nullptr) {
5293 if ((pRegions->srcSubresource.aspectMask &
5294 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
5295 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) ==
5296 0) {
5297 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5298 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5299 "vkCmdCopyImage parameter, VkImageAspect "
5300 "pRegions->srcSubresource.aspectMask, is an unrecognized "
5301 "enumerator");
5302 return false;
5303 }
5304 if ((pRegions->dstSubresource.aspectMask &
5305 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
5306 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) ==
5307 0) {
5308 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5309 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5310 "vkCmdCopyImage parameter, VkImageAspect "
5311 "pRegions->dstSubresource.aspectMask, is an unrecognized "
5312 "enumerator");
5313 return false;
5314 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005315 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005316
5317 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005318}
5319
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005320bool PostCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage,
5321 VkImageLayout srcImageLayout, VkImage dstImage,
5322 VkImageLayout dstImageLayout, uint32_t regionCount,
5323 VkFilter filter) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005324
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005325 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005326 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5327 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
5328 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5329 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5330 "vkCmdBlitImage parameter, VkImageLayout srcImageLayout, is an "
5331 "unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005332 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005333 }
5334
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005335 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005336 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5337 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
5338 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5339 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5340 "vkCmdBlitImage parameter, VkImageLayout dstImageLayout, is an "
5341 "unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005342 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005343 }
5344
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005345 if (filter < VK_FILTER_BEGIN_RANGE || filter > VK_FILTER_END_RANGE) {
5346 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5347 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5348 "vkCmdBlitImage parameter, VkFilter filter, is an unrecognized "
5349 "enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005350 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005351 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005352
5353 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005354}
5355
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005356VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5357 vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage,
5358 VkImageLayout srcImageLayout, VkImage dstImage,
5359 VkImageLayout dstImageLayout, uint32_t regionCount,
5360 const VkImageBlit *pRegions, VkFilter filter) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005361 PreCmdBlitImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005362
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005363 get_dispatch_table(pc_device_table_map, commandBuffer)
5364 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage,
5365 dstImageLayout, regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005366
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005367 PostCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage,
5368 dstImageLayout, regionCount, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005369}
5370
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005371bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer,
5372 const VkBufferImageCopy *pRegions) {
5373 if (pRegions != nullptr) {
5374 if ((pRegions->imageSubresource.aspectMask &
5375 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
5376 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) ==
5377 0) {
5378 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5379 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5380 "vkCmdCopyBufferToImage parameter, VkImageAspect "
5381 "pRegions->imageSubresource.aspectMask, is an unrecognized "
5382 "enumerator");
5383 return false;
5384 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005385 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005386
5387 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005388}
5389
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005390bool PostCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
5391 VkImage dstImage, VkImageLayout dstImageLayout,
5392 uint32_t regionCount) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005393
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005394 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005395 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5396 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
5397 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5398 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5399 "vkCmdCopyBufferToImage parameter, VkImageLayout "
5400 "dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005401 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005402 }
5403
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005404 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005405}
5406
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005407VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5408 vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
5409 VkImage dstImage, VkImageLayout dstImageLayout,
5410 uint32_t regionCount,
5411 const VkBufferImageCopy *pRegions) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005412 PreCmdCopyBufferToImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005413
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005414 get_dispatch_table(pc_device_table_map, commandBuffer)
5415 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage,
5416 dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005417
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005418 PostCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout,
5419 regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005420}
5421
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005422bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer,
5423 const VkBufferImageCopy *pRegions) {
5424 if (pRegions != nullptr) {
5425 if ((pRegions->imageSubresource.aspectMask &
5426 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
5427 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) ==
5428 0) {
5429 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5430 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5431 "vkCmdCopyImageToBuffer parameter, VkImageAspect "
5432 "pRegions->imageSubresource.aspectMask, is an unrecognized "
5433 "enumerator");
5434 return false;
5435 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005436 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005437
5438 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005439}
5440
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005441bool PostCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
5442 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
5443 uint32_t regionCount) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005444
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005445 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005446 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5447 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
5448 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5449 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5450 "vkCmdCopyImageToBuffer parameter, VkImageLayout "
5451 "srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005452 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005453 }
5454
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005455 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005456}
5457
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005458VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5459 vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
5460 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
5461 uint32_t regionCount,
5462 const VkBufferImageCopy *pRegions) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005463 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005464
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005465 get_dispatch_table(pc_device_table_map, commandBuffer)
5466 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout,
5467 dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005468
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005469 PostCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer,
5470 regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005471}
5472
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005473bool PreCmdUpdateBuffer(VkCommandBuffer commandBuffer, const uint32_t *pData) {
5474 if (pData != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005475 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005476
5477 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005478}
5479
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005480bool PostCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
5481 VkDeviceSize dstOffset, VkDeviceSize dataSize) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005482
5483 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005484}
5485
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005486VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5487 vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
5488 VkDeviceSize dstOffset, VkDeviceSize dataSize,
5489 const uint32_t *pData) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005490 PreCmdUpdateBuffer(commandBuffer, pData);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005491
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005492 get_dispatch_table(pc_device_table_map, commandBuffer)
5493 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005494
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005495 PostCmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005496}
5497
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005498bool PostCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
5499 VkDeviceSize dstOffset, VkDeviceSize size,
5500 uint32_t data) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005501
5502 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005503}
5504
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005505VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5506 vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
5507 VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
5508 get_dispatch_table(pc_device_table_map, commandBuffer)
5509 ->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005510
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005511 PostCmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005512}
5513
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005514bool PreCmdClearColorImage(VkCommandBuffer commandBuffer,
5515 const VkClearColorValue *pColor,
5516 const VkImageSubresourceRange *pRanges) {
5517 if (pColor != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005518 }
5519
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005520 if (pRanges != nullptr) {
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06005521 /* TODO: How should we validate pRanges->aspectMask */
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005522 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005523
5524 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005525}
5526
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005527bool PostCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
5528 VkImageLayout imageLayout, uint32_t rangeCount) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005529
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005530 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005531 (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5532 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
5533 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5534 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5535 "vkCmdClearColorImage parameter, VkImageLayout imageLayout, is "
5536 "an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005537 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005538 }
5539
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005540 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005541}
5542
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005543VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5544 vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
5545 VkImageLayout imageLayout,
5546 const VkClearColorValue *pColor, uint32_t rangeCount,
5547 const VkImageSubresourceRange *pRanges) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005548 PreCmdClearColorImage(commandBuffer, pColor, pRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005549
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005550 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearColorImage(
5551 commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005552
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005553 PostCmdClearColorImage(commandBuffer, image, imageLayout, rangeCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005554}
5555
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005556bool PreCmdClearDepthStencilImage(VkCommandBuffer commandBuffer,
5557 const VkImageSubresourceRange *pRanges) {
5558 if (pRanges != nullptr) {
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06005559 /*
5560 * TODO: How do we validation pRanges->aspectMask?
5561 * Allows values are: VK_IMAGE_ASPECT_DEPTH_BIT and
5562 * VK_IMAGE_ASPECT_STENCIL_BIT.
5563 */
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005564 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005565
5566 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005567}
5568
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005569bool PostCmdClearDepthStencilImage(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005570 VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
5571 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005572
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005573 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005574 (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5575 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
5576 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5577 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5578 "vkCmdClearDepthStencilImage parameter, VkImageLayout "
5579 "imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005580 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005581 }
5582
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005583 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005584}
5585
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005586VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5587 vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image,
5588 VkImageLayout imageLayout,
5589 const VkClearDepthStencilValue *pDepthStencil,
5590 uint32_t rangeCount,
5591 const VkImageSubresourceRange *pRanges) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005592 PreCmdClearDepthStencilImage(commandBuffer, pRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005593
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005594 get_dispatch_table(pc_device_table_map, commandBuffer)
5595 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout,
5596 pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005597
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005598 PostCmdClearDepthStencilImage(commandBuffer, image, imageLayout,
5599 pDepthStencil, rangeCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005600}
5601
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005602bool PreCmdClearAttachments(VkCommandBuffer commandBuffer,
5603 const VkClearColorValue *pColor,
5604 const VkClearRect *pRects) {
5605 if (pColor != nullptr) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005606 }
5607
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005608 if (pRects != nullptr) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005609 }
5610
5611 return true;
5612}
5613
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005614VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5615 vkCmdClearAttachments(VkCommandBuffer commandBuffer,
5616 uint32_t attachmentCount,
5617 const VkClearAttachment *pAttachments,
5618 uint32_t rectCount, const VkClearRect *pRects) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005619 for (uint32_t i = 0; i < attachmentCount; i++) {
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005620 PreCmdClearAttachments(commandBuffer, &pAttachments[i].clearValue.color,
5621 pRects);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005622 }
5623
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005624 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearAttachments(
5625 commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005626}
5627
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005628bool PreCmdResolveImage(VkCommandBuffer commandBuffer,
5629 const VkImageResolve *pRegions) {
5630 if (pRegions != nullptr) {
5631 if ((pRegions->srcSubresource.aspectMask &
5632 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
5633 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) ==
5634 0) {
5635 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5636 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5637 "vkCmdResolveImage parameter, VkImageAspect "
5638 "pRegions->srcSubresource.aspectMask, is an unrecognized "
5639 "enumerator");
5640 return false;
5641 }
5642 if ((pRegions->dstSubresource.aspectMask &
5643 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
5644 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) ==
5645 0) {
5646 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5647 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5648 "vkCmdResolveImage parameter, VkImageAspect "
5649 "pRegions->dstSubresource.aspectMask, is an unrecognized "
5650 "enumerator");
5651 return false;
5652 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005653 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005654
5655 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005656}
5657
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005658bool PostCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage,
5659 VkImageLayout srcImageLayout, VkImage dstImage,
5660 VkImageLayout dstImageLayout, uint32_t regionCount) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005661
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005662 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005663 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5664 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
5665 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5666 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5667 "vkCmdResolveImage parameter, VkImageLayout srcImageLayout, is "
5668 "an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005669 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005670 }
5671
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005672 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005673 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5674 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) {
5675 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5676 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5677 "vkCmdResolveImage parameter, VkImageLayout dstImageLayout, is "
5678 "an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005679 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005680 }
5681
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005682 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005683}
5684
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005685VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5686 vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage,
5687 VkImageLayout srcImageLayout, VkImage dstImage,
5688 VkImageLayout dstImageLayout, uint32_t regionCount,
5689 const VkImageResolve *pRegions) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005690 PreCmdResolveImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005691
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005692 get_dispatch_table(pc_device_table_map, commandBuffer)
5693 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage,
5694 dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005695
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005696 PostCmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage,
5697 dstImageLayout, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005698}
5699
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005700bool PostCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
5701 VkPipelineStageFlags stageMask) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005702
5703 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005704}
5705
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005706VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5707 vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
5708 VkPipelineStageFlags stageMask) {
5709 get_dispatch_table(pc_device_table_map, commandBuffer)
5710 ->CmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005711
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005712 PostCmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005713}
5714
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005715bool PostCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
5716 VkPipelineStageFlags stageMask) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005717
5718 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005719}
5720
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005721VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5722 vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
5723 VkPipelineStageFlags stageMask) {
5724 get_dispatch_table(pc_device_table_map, commandBuffer)
5725 ->CmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005726
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005727 PostCmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005728}
5729
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005730bool PreCmdWaitEvents(VkCommandBuffer commandBuffer, const VkEvent *pEvents,
5731 uint32_t memoryBarrierCount,
5732 const VkMemoryBarrier *pMemoryBarriers,
5733 uint32_t bufferMemoryBarrierCount,
5734 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
5735 uint32_t imageMemoryBarrierCount,
5736 const VkImageMemoryBarrier *pImageMemoryBarriers) {
5737 if (pEvents != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005738 }
5739
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005740 if (pMemoryBarriers != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005741 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005742
5743 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005744}
5745
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005746bool PostCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount,
5747 VkPipelineStageFlags srcStageMask,
5748 VkPipelineStageFlags dstStageMask,
5749 uint32_t memoryBarrierCount) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005750
5751 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005752}
5753
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005754VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5755 vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount,
5756 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
5757 VkPipelineStageFlags dstStageMask,
5758 uint32_t memoryBarrierCount,
5759 const VkMemoryBarrier *pMemoryBarriers,
5760 uint32_t bufferMemoryBarrierCount,
5761 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
5762 uint32_t imageMemoryBarrierCount,
5763 const VkImageMemoryBarrier *pImageMemoryBarriers) {
5764 PreCmdWaitEvents(commandBuffer, pEvents, memoryBarrierCount,
5765 pMemoryBarriers, bufferMemoryBarrierCount,
5766 pBufferMemoryBarriers, imageMemoryBarrierCount,
5767 pImageMemoryBarriers);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005768
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005769 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWaitEvents(
5770 commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask,
5771 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
5772 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005773
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005774 PostCmdWaitEvents(commandBuffer, eventCount, srcStageMask, dstStageMask,
5775 memoryBarrierCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005776}
5777
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005778bool PreCmdPipelineBarrier(VkCommandBuffer commandBuffer,
5779 uint32_t memoryBarrierCount,
5780 const VkMemoryBarrier *pMemoryBarriers,
5781 uint32_t bufferMemoryBarrierCount,
5782 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
5783 uint32_t imageMemoryBarrierCount,
5784 const VkImageMemoryBarrier *pImageMemoryBarriers) {
5785 if (pMemoryBarriers != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005786 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005787
5788 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005789}
5790
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005791bool PostCmdPipelineBarrier(VkCommandBuffer commandBuffer,
5792 VkPipelineStageFlags srcStageMask,
5793 VkPipelineStageFlags dstStageMask,
5794 VkDependencyFlags dependencyFlags,
5795 uint32_t memoryBarrierCount) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005796
5797 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005798}
5799
Chia-I Wu9ab61502015-11-06 06:42:02 +08005800VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005801 VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
5802 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
5803 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
5804 uint32_t bufferMemoryBarrierCount,
Jon Ashburnf19916e2016-01-11 13:12:43 -07005805 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005806 uint32_t imageMemoryBarrierCount,
5807 const VkImageMemoryBarrier *pImageMemoryBarriers) {
5808 PreCmdPipelineBarrier(commandBuffer, memoryBarrierCount, pMemoryBarriers,
5809 bufferMemoryBarrierCount, pBufferMemoryBarriers,
5810 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005811
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005812 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdPipelineBarrier(
5813 commandBuffer, srcStageMask, dstStageMask, dependencyFlags,
5814 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
5815 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005816
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005817 PostCmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask,
5818 dependencyFlags, memoryBarrierCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005819}
5820
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005821bool PostCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
5822 uint32_t slot, VkQueryControlFlags flags) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005823
5824 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005825}
5826
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005827VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5828 vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
5829 uint32_t slot, VkQueryControlFlags flags) {
5830 get_dispatch_table(pc_device_table_map, commandBuffer)
5831 ->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005832
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005833 PostCmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005834}
5835
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005836bool PostCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
5837 uint32_t slot) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005838
5839 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005840}
5841
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005842VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5843 vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
5844 uint32_t slot) {
5845 get_dispatch_table(pc_device_table_map, commandBuffer)
5846 ->CmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005847
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005848 PostCmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005849}
5850
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005851bool PostCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
5852 uint32_t firstQuery, uint32_t queryCount) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005853
5854 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005855}
5856
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005857VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5858 vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
5859 uint32_t firstQuery, uint32_t queryCount) {
5860 get_dispatch_table(pc_device_table_map, commandBuffer)
5861 ->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005862
Jon Ashburn19d3bf12015-12-30 14:06:55 -07005863 PostCmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005864}
5865
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005866bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer,
5867 VkPipelineStageFlagBits pipelineStage,
5868 VkQueryPool queryPool, uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005869
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08005870 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005871
5872 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005873}
5874
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005875VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5876 vkCmdWriteTimestamp(VkCommandBuffer commandBuffer,
5877 VkPipelineStageFlagBits pipelineStage,
5878 VkQueryPool queryPool, uint32_t slot) {
5879 get_dispatch_table(pc_device_table_map, commandBuffer)
5880 ->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005881
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005882 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005883}
5884
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005885bool PostCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer,
5886 VkQueryPool queryPool, uint32_t firstQuery,
5887 uint32_t queryCount, VkBuffer dstBuffer,
5888 VkDeviceSize dstOffset, VkDeviceSize stride,
5889 VkQueryResultFlags flags) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005890
5891 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005892}
5893
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005894VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5895 vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer,
5896 VkQueryPool queryPool, uint32_t firstQuery,
5897 uint32_t queryCount, VkBuffer dstBuffer,
5898 VkDeviceSize dstOffset, VkDeviceSize stride,
5899 VkQueryResultFlags flags) {
5900 get_dispatch_table(pc_device_table_map, commandBuffer)
5901 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery,
5902 queryCount, dstBuffer, dstOffset, stride,
5903 flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005904
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005905 PostCmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery,
5906 queryCount, dstBuffer, dstOffset, stride,
5907 flags);
Jeremy Hayesad367152015-04-17 10:36:53 -06005908}
5909
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005910bool PreCmdPushConstants(VkCommandBuffer commandBuffer, const void *pValues) {
5911 if (pValues != nullptr) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005912 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005913
5914 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005915}
5916
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005917bool PostCmdPushConstants(VkCommandBuffer commandBuffer,
5918 VkPipelineLayout layout,
5919 VkShaderStageFlags stageFlags, uint32_t offset,
5920 uint32_t size) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005921
5922 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005923}
5924
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005925VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5926 vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
5927 VkShaderStageFlags stageFlags, uint32_t offset,
5928 uint32_t size, const void *pValues) {
Chia-I Wuce9b1772015-11-12 06:09:22 +08005929 PreCmdPushConstants(commandBuffer, pValues);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005930
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005931 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdPushConstants(
5932 commandBuffer, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005933
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005934 PostCmdPushConstants(commandBuffer, layout, stageFlags, offset, size);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005935}
5936
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005937bool PreCmdBeginRenderPass(VkCommandBuffer commandBuffer,
5938 const VkRenderPassBeginInfo *pRenderPassBegin) {
5939 if (pRenderPassBegin != nullptr) {
5940 if (pRenderPassBegin->sType !=
5941 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO) {
5942 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5943 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5944 "vkCmdBeginRenderPass parameter, VkStructureType "
5945 "pRenderPassBegin->sType, is an invalid enumerator");
5946 return false;
5947 }
5948 if (pRenderPassBegin->pClearValues != nullptr) {
5949 }
Jon Ashburne68a9ff2015-05-25 14:11:37 -06005950 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005951
5952 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005953}
5954
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005955bool PostCmdBeginRenderPass(VkCommandBuffer commandBuffer,
5956 VkSubpassContents contents) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005957
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005958 if (contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE ||
5959 contents > VK_SUBPASS_CONTENTS_END_RANGE) {
5960 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5961 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5962 "vkCmdBeginRenderPass parameter, VkSubpassContents contents, "
5963 "is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005964 return false;
5965 }
5966
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005967 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005968}
5969
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005970VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5971 vkCmdBeginRenderPass(VkCommandBuffer commandBuffer,
5972 const VkRenderPassBeginInfo *pRenderPassBegin,
5973 VkSubpassContents contents) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005974 PreCmdBeginRenderPass(commandBuffer, pRenderPassBegin);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005975
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005976 get_dispatch_table(pc_device_table_map, commandBuffer)
5977 ->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005978
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005979 PostCmdBeginRenderPass(commandBuffer, contents);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005980}
5981
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005982bool PostCmdNextSubpass(VkCommandBuffer commandBuffer,
5983 VkSubpassContents contents) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005984
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005985 if (contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE ||
5986 contents > VK_SUBPASS_CONTENTS_END_RANGE) {
5987 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT,
5988 (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5989 "vkCmdNextSubpass parameter, VkSubpassContents contents, is an "
5990 "unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005991 return false;
Chia-I Wu08accc62015-07-07 11:50:03 +08005992 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005993
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005994 return true;
Chia-I Wu08accc62015-07-07 11:50:03 +08005995}
5996
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07005997VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
5998 vkCmdNextSubpass(VkCommandBuffer commandBuffer,
5999 VkSubpassContents contents) {
6000 get_dispatch_table(pc_device_table_map, commandBuffer)
6001 ->CmdNextSubpass(commandBuffer, contents);
Chia-I Wu08accc62015-07-07 11:50:03 +08006002
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006003 PostCmdNextSubpass(commandBuffer, contents);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006004}
6005
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006006bool PostCmdEndRenderPass(VkCommandBuffer commandBuffer) { return true; }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006007
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006008VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
6009 vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
6010 get_dispatch_table(pc_device_table_map, commandBuffer)
6011 ->CmdEndRenderPass(commandBuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006012
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006013 PostCmdEndRenderPass(commandBuffer);
Chia-I Wu08accc62015-07-07 11:50:03 +08006014}
6015
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006016bool PreCmdExecuteCommands(VkCommandBuffer commandBuffer,
6017 const VkCommandBuffer *pCommandBuffers) {
6018 if (pCommandBuffers != nullptr) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006019 }
6020
6021 return true;
6022}
6023
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006024bool PostCmdExecuteCommands(VkCommandBuffer commandBuffer,
6025 uint32_t commandBuffersCount) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006026
6027 return true;
6028}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006029
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006030VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
6031 vkCmdExecuteCommands(VkCommandBuffer commandBuffer,
6032 uint32_t commandBuffersCount,
6033 const VkCommandBuffer *pCommandBuffers) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006034 PreCmdExecuteCommands(commandBuffer, pCommandBuffers);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006035
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006036 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdExecuteCommands(
6037 commandBuffer, commandBuffersCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08006038
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006039 PostCmdExecuteCommands(commandBuffer, commandBuffersCount);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06006040}
6041
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006042VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
6043 vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006044 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006045 return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006046 if (!strcmp(funcName, "vkDestroyDevice"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006047 return (PFN_vkVoidFunction)vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006048 if (!strcmp(funcName, "vkGetDeviceQueue"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006049 return (PFN_vkVoidFunction)vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006050 if (!strcmp(funcName, "vkQueueSubmit"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006051 return (PFN_vkVoidFunction)vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006052 if (!strcmp(funcName, "vkQueueWaitIdle"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006053 return (PFN_vkVoidFunction)vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006054 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006055 return (PFN_vkVoidFunction)vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006056 if (!strcmp(funcName, "vkAllocateMemory"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006057 return (PFN_vkVoidFunction)vkAllocateMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006058 if (!strcmp(funcName, "vkMapMemory"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006059 return (PFN_vkVoidFunction)vkMapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006060 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006061 return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006062 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006063 return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006064 if (!strcmp(funcName, "vkCreateFence"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006065 return (PFN_vkVoidFunction)vkCreateFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006066 if (!strcmp(funcName, "vkResetFences"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006067 return (PFN_vkVoidFunction)vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006068 if (!strcmp(funcName, "vkGetFenceStatus"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006069 return (PFN_vkVoidFunction)vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006070 if (!strcmp(funcName, "vkWaitForFences"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006071 return (PFN_vkVoidFunction)vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006072 if (!strcmp(funcName, "vkCreateSemaphore"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006073 return (PFN_vkVoidFunction)vkCreateSemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006074 if (!strcmp(funcName, "vkCreateEvent"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006075 return (PFN_vkVoidFunction)vkCreateEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006076 if (!strcmp(funcName, "vkGetEventStatus"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006077 return (PFN_vkVoidFunction)vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006078 if (!strcmp(funcName, "vkSetEvent"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006079 return (PFN_vkVoidFunction)vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006080 if (!strcmp(funcName, "vkResetEvent"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006081 return (PFN_vkVoidFunction)vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006082 if (!strcmp(funcName, "vkCreateQueryPool"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006083 return (PFN_vkVoidFunction)vkCreateQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006084 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006085 return (PFN_vkVoidFunction)vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006086 if (!strcmp(funcName, "vkCreateBuffer"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006087 return (PFN_vkVoidFunction)vkCreateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006088 if (!strcmp(funcName, "vkCreateBufferView"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006089 return (PFN_vkVoidFunction)vkCreateBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006090 if (!strcmp(funcName, "vkCreateImage"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006091 return (PFN_vkVoidFunction)vkCreateImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006092 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006093 return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006094 if (!strcmp(funcName, "vkCreateImageView"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006095 return (PFN_vkVoidFunction)vkCreateImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05006096 if (!strcmp(funcName, "vkCreateShaderModule"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006097 return (PFN_vkVoidFunction)vkCreateShaderModule;
Jon Ashburnc669cc62015-07-09 15:02:25 -06006098 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006099 return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06006100 if (!strcmp(funcName, "vkCreateComputePipelines"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006101 return (PFN_vkVoidFunction)vkCreateComputePipelines;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006102 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006103 return (PFN_vkVoidFunction)vkCreatePipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006104 if (!strcmp(funcName, "vkCreateSampler"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006105 return (PFN_vkVoidFunction)vkCreateSampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006106 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006107 return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006108 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006109 return (PFN_vkVoidFunction)vkCreateDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006110 if (!strcmp(funcName, "vkResetDescriptorPool"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006111 return (PFN_vkVoidFunction)vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006112 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006113 return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006114 if (!strcmp(funcName, "vkCmdSetViewport"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006115 return (PFN_vkVoidFunction)vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06006116 if (!strcmp(funcName, "vkCmdSetScissor"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006117 return (PFN_vkVoidFunction)vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006118 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006119 return (PFN_vkVoidFunction)vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006120 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006121 return (PFN_vkVoidFunction)vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006122 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006123 return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006124 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006125 return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006126 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006127 return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006128 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006129 return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006130 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006131 return (PFN_vkVoidFunction)vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006132 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006133 return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006134 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006135 return (PFN_vkVoidFunction)vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006136 if (!strcmp(funcName, "vkEndCommandBuffer"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006137 return (PFN_vkVoidFunction)vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006138 if (!strcmp(funcName, "vkResetCommandBuffer"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006139 return (PFN_vkVoidFunction)vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006140 if (!strcmp(funcName, "vkCmdBindPipeline"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006141 return (PFN_vkVoidFunction)vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006142 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006143 return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006144 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006145 return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006146 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006147 return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006148 if (!strcmp(funcName, "vkCmdDraw"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006149 return (PFN_vkVoidFunction)vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006150 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006151 return (PFN_vkVoidFunction)vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006152 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006153 return (PFN_vkVoidFunction)vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006154 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006155 return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006156 if (!strcmp(funcName, "vkCmdDispatch"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006157 return (PFN_vkVoidFunction)vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006158 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006159 return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006160 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006161 return (PFN_vkVoidFunction)vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006162 if (!strcmp(funcName, "vkCmdCopyImage"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006163 return (PFN_vkVoidFunction)vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006164 if (!strcmp(funcName, "vkCmdBlitImage"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006165 return (PFN_vkVoidFunction)vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006166 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006167 return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006168 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006169 return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006170 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006171 return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006172 if (!strcmp(funcName, "vkCmdFillBuffer"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006173 return (PFN_vkVoidFunction)vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006174 if (!strcmp(funcName, "vkCmdClearColorImage"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006175 return (PFN_vkVoidFunction)vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006176 if (!strcmp(funcName, "vkCmdResolveImage"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006177 return (PFN_vkVoidFunction)vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006178 if (!strcmp(funcName, "vkCmdSetEvent"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006179 return (PFN_vkVoidFunction)vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006180 if (!strcmp(funcName, "vkCmdResetEvent"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006181 return (PFN_vkVoidFunction)vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006182 if (!strcmp(funcName, "vkCmdWaitEvents"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006183 return (PFN_vkVoidFunction)vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006184 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006185 return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006186 if (!strcmp(funcName, "vkCmdBeginQuery"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006187 return (PFN_vkVoidFunction)vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006188 if (!strcmp(funcName, "vkCmdEndQuery"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006189 return (PFN_vkVoidFunction)vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006190 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006191 return (PFN_vkVoidFunction)vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006192 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006193 return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006194 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006195 return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006196 if (!strcmp(funcName, "vkCreateFramebuffer"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006197 return (PFN_vkVoidFunction)vkCreateFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006198 if (!strcmp(funcName, "vkCreateRenderPass"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006199 return (PFN_vkVoidFunction)vkCreateRenderPass;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006200 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006201 return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08006202 if (!strcmp(funcName, "vkCmdNextSubpass"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006203 return (PFN_vkVoidFunction)vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06006204
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006205 if (device == NULL) {
6206 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006207 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006208
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006209 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr ==
6210 NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006211 return NULL;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006212 return get_dispatch_table(pc_device_table_map, device)
6213 ->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006214}
6215
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006216VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
6217 vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006218 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006219 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006220 if (!strcmp(funcName, "vkCreateInstance"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006221 return (PFN_vkVoidFunction)vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006222 if (!strcmp(funcName, "vkDestroyInstance"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006223 return (PFN_vkVoidFunction)vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006224 if (!strcmp(funcName, "vkCreateDevice"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006225 return (PFN_vkVoidFunction)vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006226 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006227 return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006228 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006229 return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006230 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006231 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06006232 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006233 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006234 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006235 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006236 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006237 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006238 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006239 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006240 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006241 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06006242
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006243 if (instance == NULL) {
6244 return NULL;
6245 }
6246
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006247 layer_data *data =
6248 get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
6249 PFN_vkVoidFunction fptr =
6250 debug_report_get_instance_proc_addr(data->report_data, funcName);
6251 if (fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06006252 return fptr;
6253
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006254 if (get_dispatch_table(pc_instance_table_map, instance)
6255 ->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006256 return NULL;
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07006257 return get_dispatch_table(pc_instance_table_map, instance)
6258 ->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06006259}