blob: 9546e4c3bc5e23f5744f870eb1b44512215ab5d5 [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 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060017 *
18 * Author: Jeremy Hayes <jeremy@lunarg.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070020 * Author: Mark Lobodzinski <mark@LunarG.com>
Dustin Graves1e92cd72016-02-09 14:00:18 -070021 * Author: Dustin Graves <dustin@lunarg.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060022 */
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27
28#include <iostream>
29#include <string>
30#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050031#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060032#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060033#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060034
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060035#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070036#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060037#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060038#include "vk_enum_validate_helper.h"
39#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060040
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060041#include "vk_layer_table.h"
42#include "vk_layer_data.h"
43#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060044#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070045#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060046
Mark Lobodzinski739391a2016-03-17 15:08:18 -060047#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070048
Cody Northrop55443ef2015-09-28 15:09:32 -060049struct layer_data {
Jeremy Hayes99a96322015-06-26 12:48:09 -060050 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070051 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060052
Ian Elliotted6b5ac2016-04-28 09:08:13 -060053 // The following are for keeping track of the temporary callbacks that can
54 // be used in vkCreateInstance and vkDestroyInstance:
55 uint32_t num_tmp_callbacks;
56 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
57 VkDebugReportCallbackEXT *tmp_callbacks;
58
Jon Ashburn5484e0c2016-03-08 17:48:44 -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
Ian Elliotted6b5ac2016-04-28 09:08:13 -060064 layer_data() : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr){};
Cody Northrop55443ef2015-09-28 15:09:32 -060065};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050066
Jon Ashburn5484e0c2016-03-08 17:48:44 -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"
Jon Ashburn5484e0c2016-03-08 17:48:44 -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 Lobodzinski1ed594e2016-02-03 09:57:14 -070076 fprintf(stderr, "MID: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060077#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060078 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060079
80 return data->report_data;
81}
82
83// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070084debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060085 dispatch_key key = get_dispatch_key(object);
86 layer_data *data = get_my_data_ptr(key, layer_data_map);
87#if DISPATCH_MAP_DEBUG
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070088 fprintf(stderr, "MDD: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060089#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060090 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060091 return data->report_data;
92}
93
Mark Lobodzinski739391a2016-03-17 15:08:18 -060094static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060095
Mark Lobodzinski739391a2016-03-17 15:08:18 -060096 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -060097}
98
Jon Ashburn5484e0c2016-03-08 17:48:44 -070099VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
100vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
101 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700102 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700103 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600104
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700105 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700106 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
107 result = layer_create_msg_callback(data->report_data, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600108 }
109
110 return result;
111}
112
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700113VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,
114 VkDebugReportCallbackEXT msgCallback,
115 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700116 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700117 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600118
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700119 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700120 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600121}
122
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700123VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
124vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
125 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700126 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
127 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700128}
129
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700130static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600131
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700132VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
133vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700134 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600135}
136
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700137static const VkLayerProperties pc_global_layers[] = {{
Jon Ashburndc9111c2016-03-22 12:57:13 -0600138 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700139}};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700140
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700141VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
142vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
143 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600144}
145
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700146VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
147 const char *pLayerName, uint32_t *pCount,
148 VkExtensionProperties *pProperties) {
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600149 /* parameter_validation does not have any physical device extensions */
Jon Ashburn751c4842015-11-02 17:37:20 -0700150 if (pLayerName == NULL) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700151 return get_dispatch_table(pc_instance_table_map, physicalDevice)
152 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Jon Ashburn751c4842015-11-02 17:37:20 -0700153 } else {
154 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
155 }
Jeremy Hayesad367152015-04-17 10:36:53 -0600156}
157
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700158VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
159vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -0700160
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600161 /* parameter_validation's physical device layers are the same as global */
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700162 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600163}
Jeremy Hayes99a96322015-06-26 12:48:09 -0600164
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700165static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600166 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
168 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
169 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
170 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
171 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT |
Jon Ashburn766866a2016-01-22 15:39:20 -0700172 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700173 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600174 return false;
175 }
176
177 return true;
178}
179
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700180static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
181 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600182 return "unrecognized enumerator";
183 }
184
185 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700186 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600187 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
188 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700189 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600190 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
191 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700192 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600193 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
194 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700195 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600196 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
197 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700198 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600199 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
200 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700201 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600202 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
203 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700204 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600205 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
206 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700207 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600208 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
209 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700210 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600211 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
212 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700213 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600214 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
215 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700216 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800217 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600218 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700219 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800220 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600221 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700222 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700223 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
224 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600225
226 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700227 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600228 enumeratorString += string;
229
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700230 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600231 enumeratorString += '|';
232 }
233 }
234
235 return enumeratorString;
236}
237
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700238static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
239 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
240 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
241 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
242 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
243 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600244 return false;
245 }
246
247 return true;
248}
249
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700250static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
251 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600252 return "unrecognized enumerator";
253 }
254
255 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700256 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600257 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
258 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700259 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600260 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600261 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700262 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600263 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
264 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700265 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600266 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
267 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700268 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600269 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
270 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700271 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800272 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600273 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700274 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600275 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
276 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700277 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800278 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600279 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600280
281 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700282 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600283 enumeratorString += string;
284
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700285 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600286 enumeratorString += '|';
287 }
288 }
289
290 return enumeratorString;
291}
292
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700293static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
294 VkQueueFlagBits allFlags =
295 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
296 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600297 return false;
298 }
299
300 return true;
301}
302
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700303static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
304 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600305 return "unrecognized enumerator";
306 }
307
308 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700309 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800310 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600311 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700312 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600313 strings.push_back("VK_QUEUE_COMPUTE_BIT");
314 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700315 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800316 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600317 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700318 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600319 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
320 }
321
322 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700323 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600324 enumeratorString += string;
325
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700326 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600327 enumeratorString += '|';
328 }
329 }
330
331 return enumeratorString;
332}
333
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700334static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
335 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
336 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
337 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
338 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600339 return false;
340 }
341
342 return true;
343}
344
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700345static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
346 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600347 return "unrecognized enumerator";
348 }
349
350 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700351 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600352 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
353 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700354 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800355 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600356 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700357 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600358 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
359 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700360 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800361 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600362 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700363 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800364 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600365 }
366
367 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700368 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600369 enumeratorString += string;
370
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700371 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600372 enumeratorString += '|';
373 }
374 }
375
376 return enumeratorString;
377}
378
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700379static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700380 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700381 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600382 return false;
383 }
384
385 return true;
386}
387
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700388static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
389 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600390 return "unrecognized enumerator";
391 }
392
393 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700394 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800395 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600396 }
397
398 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700399 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600400 enumeratorString += string;
401
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700402 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600403 enumeratorString += '|';
404 }
405 }
406
407 return enumeratorString;
408}
409
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700410static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
411 VkSparseImageFormatFlagBits allFlags =
412 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
413 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
414 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600415 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600416 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600417
418 return true;
419}
420
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700421static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
422 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600423 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600424 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600425
426 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700427 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800428 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600429 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700430 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800431 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600432 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700433 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800434 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600435 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600436
437 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700438 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600439 enumeratorString += string;
440
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700441 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600442 enumeratorString += '|';
443 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600444 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600445
446 return enumeratorString;
447}
448
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700449static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700450 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700451 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600452 return false;
453 }
454
455 return true;
456}
457
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700458static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
459 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600460 return "unrecognized enumerator";
461 }
462
463 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700464 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600465 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
466 }
467
468 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700469 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600470 enumeratorString += string;
471
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700472 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600473 enumeratorString += '|';
474 }
475 }
476
477 return enumeratorString;
478}
479
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700480static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
481 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
482 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
483 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
484 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
485 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600486 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
487 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
488 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700489 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600490 return false;
491 }
492
493 return true;
494}
495
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700496static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
497 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600498 return "unrecognized enumerator";
499 }
500
501 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700502 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700503 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600504 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700505 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700506 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600507 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700508 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700509 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600510 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700511 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700512 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600513 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700514 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700515 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600516 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700517 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700518 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600519 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700520 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700521 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600522 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700523 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700524 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600525 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700526 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700527 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600528 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700529 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700530 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600531 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700532 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700533 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600534 }
535
536 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700537 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600538 enumeratorString += string;
539
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700540 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600541 enumeratorString += '|';
542 }
543 }
544
545 return enumeratorString;
546}
547
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700548static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
549 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
550 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
551 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600552 return false;
553 }
554
555 return true;
556}
557
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700558static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
559 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600560 return "unrecognized enumerator";
561 }
562
563 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700564 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600565 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
566 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700567 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600568 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
569 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700570 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600571 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
572 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700573 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600574 strings.push_back("VK_QUERY_RESULT_64_BIT");
575 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600576
577 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700578 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600579 enumeratorString += string;
580
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700581 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600582 enumeratorString += '|';
583 }
584 }
585
586 return enumeratorString;
587}
588
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700589static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
590 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
591 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
592 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
593 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
594 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600595 return false;
596 }
597
598 return true;
599}
600
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700601static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
602 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600603 return "unrecognized enumerator";
604 }
605
606 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700607 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600608 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
609 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700610 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600611 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
612 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700613 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600614 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
615 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700616 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600617 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
618 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700619 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600620 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
621 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700622 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800623 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600624 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700625 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600626 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
627 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700628 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800629 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600630 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700631 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600632 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
633 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600634
635 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700636 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600637 enumeratorString += string;
638
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700639 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600640 enumeratorString += '|';
641 }
642 }
643
644 return enumeratorString;
645}
646
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700647static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
648 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
649 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
650 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600651 return false;
652 }
653
654 return true;
655}
656
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700657static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
658 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600659 return "unrecognized enumerator";
660 }
661
662 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700663 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600664 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
665 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700666 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600667 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
668 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700669 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600670 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600671 }
672
673 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700674 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600675 enumeratorString += string;
676
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700677 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600678 enumeratorString += '|';
679 }
680 }
681
682 return enumeratorString;
683}
684
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700685static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
686 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
687 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
688 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
689 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600690 return false;
691 }
692
693 return true;
694}
695
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700696static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
697 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600698 return "unrecognized enumerator";
699 }
700
701 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700702 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600703 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
704 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700705 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600706 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
707 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700708 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600709 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
710 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700711 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600712 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
713 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700714 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600715 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600716 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600717
718 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700719 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600720 enumeratorString += string;
721
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700722 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600723 enumeratorString += '|';
724 }
725 }
726
727 return enumeratorString;
728}
729
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700730static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
731 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
732 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
733 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600734 return false;
735 }
736
737 return true;
738}
739
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700740static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
741 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600742 return "unrecognized enumerator";
743 }
744
745 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700746 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800747 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600748 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700749 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800750 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600751 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700752 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800753 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600754 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700755 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800756 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600757 }
758
759 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700760 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600761 enumeratorString += string;
762
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700763 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600764 enumeratorString += '|';
765 }
766 }
767
768 return enumeratorString;
769}
770
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700771static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
772 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
773 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
774 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600775 return false;
776 }
777
778 return true;
779}
780
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700781static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
782 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600783 return "unrecognized enumerator";
784 }
785
786 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700787 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600788 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
789 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700790 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600791 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
792 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700793 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600794 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600795 }
796
797 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700798 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600799 enumeratorString += string;
800
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700801 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600802 enumeratorString += '|';
803 }
804 }
805
806 return enumeratorString;
807}
808
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700809static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
810 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
811 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
812 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
813 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600814 return false;
815 }
816
817 return true;
818}
819
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700820static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
821 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600822 return "unrecognized enumerator";
823 }
824
825 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700826 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600827 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600828 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700829 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600830 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600831 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700832 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600833 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
834 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700835 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600836 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
837 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700838 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600839 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600840 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700841 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600842 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600843 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700844 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600845 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600846 }
847
848 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700849 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600850 enumeratorString += string;
851
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700852 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600853 enumeratorString += '|';
854 }
855 }
856
857 return enumeratorString;
858}
859
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700860static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800861 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700862 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
863 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
864 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
865 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
866 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
867 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700868 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700869 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600870 return false;
871 }
872
873 return true;
874}
875
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700876static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
877 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600878 return "unrecognized enumerator";
879 }
880
881 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700882 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800883 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
884 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700885 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800886 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600887 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700888 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600889 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600890 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700891 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600892 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600893 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700894 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600895 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600896 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700897 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700898 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600899 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700900 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600901 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600902 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700903 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600904 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600905 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700906 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600907 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600908 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700909 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600910 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600911 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700912 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600913 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
914 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700915 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600916 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
917 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700918 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700919 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600920 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700921 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600922 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
923 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700924 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600925 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
926 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700927 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600928 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
929 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700930 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600931 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600932 }
933
934 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700935 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600936 enumeratorString += string;
937
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700938 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600939 enumeratorString += '|';
940 }
941 }
942
943 return enumeratorString;
944}
945
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700946static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800947 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700948 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
949 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
950 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
951 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
952 VK_ACCESS_HOST_READ_BIT | VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT);
Chia-I Wua4594202015-10-27 19:54:37 +0800953
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700954 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600955 return false;
956 }
957
958 return true;
959}
960
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700961static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
962 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600963 return "unrecognized enumerator";
964 }
965
966 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700967 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800968 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600969 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700970 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800971 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600972 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700973 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800974 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600975 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700976 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800977 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600978 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700979 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800980 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600981 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700982 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800983 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600984 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700985 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800986 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600987 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700988 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800989 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600990 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700991 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800992 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600993 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700994 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800995 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600996 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700997 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800998 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600999 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001000 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001001 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001002 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001003 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001004 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001005 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001006 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001007 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001008 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001009 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001010 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001011 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001012 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001013 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001014 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001015 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001016 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001017 }
1018
1019 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001020 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001021 enumeratorString += string;
1022
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001023 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001024 enumeratorString += '|';
1025 }
1026 }
1027
1028 return enumeratorString;
1029}
1030
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001031static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1032 VkCommandPoolCreateFlagBits allFlags =
1033 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1034 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001035 return false;
1036 }
1037
1038 return true;
1039}
1040
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001041static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1042 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001043 return "unrecognized enumerator";
1044 }
1045
1046 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001047 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001048 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001049 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001050 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001051 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001052 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001053
1054 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001055 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001056 enumeratorString += string;
1057
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001058 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001059 enumeratorString += '|';
1060 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001061 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001062
1063 return enumeratorString;
1064}
1065
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001066static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001067 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001068 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001069 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001070 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001071
1072 return true;
1073}
1074
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001075static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1076 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001077 return "unrecognized enumerator";
1078 }
1079
1080 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001081 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001082 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001083 }
1084
1085 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001086 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001087 enumeratorString += string;
1088
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001089 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001090 enumeratorString += '|';
1091 }
1092 }
1093
1094 return enumeratorString;
1095}
1096
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001097static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1098 VkCommandBufferUsageFlags allFlags =
1099 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1100 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1101 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001102 return false;
1103 }
1104
1105 return true;
1106}
1107
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001108static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1109 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001110 return "unrecognized enumerator";
1111 }
1112
1113 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001114 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001115 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001116 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001117 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001118 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001119 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001120 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001121 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001122 }
1123
1124 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001125 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001126 enumeratorString += string;
1127
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001128 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001129 enumeratorString += '|';
1130 }
1131 }
1132
1133 return enumeratorString;
1134}
1135
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001136static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001137 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001138 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001139 return false;
1140 }
1141
1142 return true;
1143}
1144
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001145static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1146 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001147 return "unrecognized enumerator";
1148 }
1149
1150 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001151 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001152 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001153 }
1154
1155 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001156 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001157 enumeratorString += string;
1158
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001159 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001160 enumeratorString += '|';
1161 }
1162 }
1163
1164 return enumeratorString;
1165}
1166
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001167static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1168 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1169 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1170 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001171 return false;
1172 }
1173
1174 return true;
1175}
1176
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001177static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1178 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001179 return "unrecognized enumerator";
1180 }
1181
1182 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001183 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001184 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1185 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001186 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001187 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1188 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001189 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001190 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1191 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001192 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001193 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1194 }
1195
1196 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001197 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001198 enumeratorString += string;
1199
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001200 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001201 enumeratorString += '|';
1202 }
1203 }
1204
1205 return enumeratorString;
1206}
1207
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001208static bool validate_queue_family_indices(VkDevice device, const char *function_name, const uint32_t count,
1209 const uint32_t *indices) {
1210 bool skipCall = false;
1211 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1212
1213 for (auto i = 0u; i < count; i++) {
1214 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
1215 skipCall |=
1216 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1217 "%s: the specified queueFamilyIndex cannot be VK_QUEUE_FAMILY_IGNORED.", function_name);
1218 } else {
1219 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(indices[i]);
1220 if (queue_data == my_device_data->queueFamilyIndexMap.end()) {
1221 skipCall |= log_msg(
1222 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1223 "VkGetDeviceQueue parameter, uint32_t queueFamilyIndex %d, must have been given when the device was created.",
1224 indices[i]);
1225 return false;
1226 }
1227 }
1228 }
1229 return skipCall;
1230}
1231
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001232static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001233 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001234 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001235 return false;
1236 }
1237
1238 return true;
1239}
1240
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001241static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1242 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001243 return "unrecognized enumerator";
1244 }
1245
1246 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001247 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001248 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001249 }
1250
1251 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001252 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001253 enumeratorString += string;
1254
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001255 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001256 enumeratorString += '|';
1257 }
1258 }
1259
1260 return enumeratorString;
1261}
1262
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001263static const int MaxParamCheckerStringLength = 256;
1264
Dustin Graves080069b2016-04-05 13:48:15 -06001265static bool validate_string(debug_report_data *report_data, const char *apiName, const char *stringName,
1266 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001267 assert(apiName != nullptr);
1268 assert(stringName != nullptr);
1269 assert(validateString != nullptr);
1270
Dustin Graves080069b2016-04-05 13:48:15 -06001271 bool skipCall = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001272
1273 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1274
1275 if (result == VK_STRING_ERROR_NONE) {
1276 return skipCall;
1277 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001278 skipCall = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1279 "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001280 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001281 skipCall = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1282 "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001283 }
1284 return skipCall;
1285}
1286
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001287VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1288vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001289 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001290
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001291 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001292 assert(chain_info != nullptr);
1293 assert(chain_info->u.pLayerInfo != nullptr);
1294
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001295 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1296 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001297 if (fpCreateInstance == NULL) {
1298 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001299 }
1300
Dustin Graves842621d2016-03-03 14:17:08 -07001301 // Advance the link info for the next element on the chain
1302 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1303
1304 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001305
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001306 if (result == VK_SUCCESS) {
1307 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1308 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001309
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001310 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001311
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001312 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1313 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001314
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001315 // Look for one or more debug report create info structures
1316 // and setup a callback(s) for each one found.
1317 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1318 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1319 if (my_instance_data->num_tmp_callbacks > 0) {
1320 // Setup the temporary callback(s) here to catch early issues:
1321 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1322 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1323 // Failure of setting up one or more of the callback.
1324 // Therefore, clean up and don't use those callbacks:
1325 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1326 my_instance_data->num_tmp_callbacks = 0;
1327 }
1328 }
1329 }
1330
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001331 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001332
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001333 // Ordinarily we'd check these before calling down the chain, but none of the layer
1334 // support is in place until now, if we survive we can report the issue now.
1335 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001336
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001337 if (pCreateInfo->pApplicationInfo) {
1338 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1339 validate_string(my_instance_data->report_data, "vkCreateInstance",
1340 "pCreateInfo->VkApplicationInfo->pApplicationName",
1341 pCreateInfo->pApplicationInfo->pApplicationName);
1342 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001343
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001344 if (pCreateInfo->pApplicationInfo->pEngineName) {
1345 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1346 pCreateInfo->pApplicationInfo->pEngineName);
1347 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001348 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001349
1350 // Disable the tmp callbacks:
1351 if (my_instance_data->num_tmp_callbacks > 0) {
1352 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1353 my_instance_data->tmp_callbacks);
1354 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001355 }
1356
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001357 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001358}
1359
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001360VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001361 // Grab the key before the instance is destroyed.
1362 dispatch_key key = get_dispatch_key(instance);
Dustin Graves080069b2016-04-05 13:48:15 -06001363 bool skipCall = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001364 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001365 assert(my_data != NULL);
1366
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001367 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1368 bool callback_setup = false;
1369 if (my_data->num_tmp_callbacks > 0) {
1370 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1371 my_data->tmp_callbacks)) {
1372 callback_setup = true;
1373 }
1374 }
1375
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001376 skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001377
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001378 // Disable and cleanup the temporary callback(s):
1379 if (callback_setup) {
1380 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1381 }
1382 if (my_data->num_tmp_callbacks > 0) {
1383 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1384 my_data->num_tmp_callbacks = 0;
1385 }
1386
Dustin Graves080069b2016-04-05 13:48:15 -06001387 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001388 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001389 pTable->DestroyInstance(instance, pAllocator);
1390
1391 // Clean up logging callback, if any
1392 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001393 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1394 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001395 my_data->logging_callback.pop_back();
1396 }
1397
1398 layer_debug_report_destroy_instance(mid(instance));
1399 layer_data_map.erase(pTable);
1400
1401 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001402 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001403 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001404}
1405
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001406VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1407vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) {
1408 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001409 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001410 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001411 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001412
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001413 skipCall |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001414
Dustin Graves080069b2016-04-05 13:48:15 -06001415 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001416 result = get_dispatch_table(pc_instance_table_map, instance)
1417 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001418
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001419 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001420 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001421
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001422 return result;
1423}
1424
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001425VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1426vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Dustin Graves080069b2016-04-05 13:48:15 -06001427 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001428 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001429 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001430
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001431 skipCall |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001432
Dustin Graves080069b2016-04-05 13:48:15 -06001433 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001434 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001435 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001436}
1437
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001438VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1439vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001440 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001441 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001442 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001443
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001444 skipCall |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001445
Dustin Graves080069b2016-04-05 13:48:15 -06001446 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001447 get_dispatch_table(pc_instance_table_map, physicalDevice)
1448 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001449 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001450}
1451
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001452VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1453vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1454 VkImageUsageFlags usage, VkImageCreateFlags flags,
1455 VkImageFormatProperties *pImageFormatProperties) {
1456 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001457 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001458 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001459 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001460
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001461 skipCall |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001462 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001463
Dustin Graves080069b2016-04-05 13:48:15 -06001464 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001465 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1466 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1467 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001468
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001469 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001470 }
Chia-I Wu17241042015-10-31 00:31:16 +08001471
1472 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001473}
1474
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001475VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1476vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001477 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001478 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001479 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001480
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001481 skipCall |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001482
Dustin Graves080069b2016-04-05 13:48:15 -06001483 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001484 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001485 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001486}
1487
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001488VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1489vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1490 VkQueueFamilyProperties *pQueueFamilyProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001491 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001492 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001493 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001494
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001495 skipCall |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001496 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001497
Dustin Graves080069b2016-04-05 13:48:15 -06001498 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001499 get_dispatch_table(pc_instance_table_map, physicalDevice)
1500 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001501 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001502}
1503
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001504VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1505vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001506 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001507 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001508 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001509
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001510 skipCall |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001511
Dustin Graves080069b2016-04-05 13:48:15 -06001512 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001513 get_dispatch_table(pc_instance_table_map, physicalDevice)
1514 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001515 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001516}
1517
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001518void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1519 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001520 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001521
1522 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1523 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1524 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001525 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001526 "PARAMCHECK",
1527 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1528 "structure.",
1529 i);
1530 } else {
1531 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001532 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001533
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001534 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1535 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1536 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1537 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
1538 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1539 "PARAMCHECK",
1540 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1541 "between 0 and 1. Actual value is %f",
1542 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1543 }
1544 }
1545 }
1546
1547 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1548 log_msg(
1549 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001550 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1551 "of queue families.",
1552 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001553 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1554 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1555 log_msg(
1556 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001557 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1558 "queues for the given family index.",
1559 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001560 }
Michael Lentine774704f2016-01-27 13:36:46 -06001561 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001562 }
1563}
1564
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001565void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001566 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001567
1568 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1569 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1570 my_device_data->queueFamilyIndexMap.insert(
1571 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1572 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001573 }
1574}
1575
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001576VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice,
1577 const VkDeviceCreateInfo *pCreateInfo,
1578 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001579 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001580 * NOTE: We do not validate physicalDevice or any dispatchable
1581 * object as the first parameter. We couldn't get here if it was wrong!
1582 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001583
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001584 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001585 bool skipCall = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001586 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001587 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001588
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001589 skipCall |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001590
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001591 if (pCreateInfo != NULL) {
1592 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001593 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001594 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1595 pCreateInfo->ppEnabledLayerNames[i]);
1596 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001597 }
Michael Lentine774704f2016-01-27 13:36:46 -06001598
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001599 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001600 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001601 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1602 pCreateInfo->ppEnabledExtensionNames[i]);
1603 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001604 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001605 }
1606
Dustin Graves080069b2016-04-05 13:48:15 -06001607 if (!skipCall) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001608 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001609 assert(chain_info != nullptr);
1610 assert(chain_info->u.pLayerInfo != nullptr);
1611
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001612 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1613 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001614 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001615 if (fpCreateDevice == NULL) {
1616 return VK_ERROR_INITIALIZATION_FAILED;
1617 }
1618
1619 // Advance the link info for the next element on the chain
1620 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1621
1622 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001623
1624 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1625
1626 if (result == VK_SUCCESS) {
1627 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1628 assert(my_device_data != nullptr);
1629
1630 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1631 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1632
1633 uint32_t count;
1634 get_dispatch_table(pc_instance_table_map, physicalDevice)
1635 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
1636 std::vector<VkQueueFamilyProperties> properties(count);
1637 get_dispatch_table(pc_instance_table_map, physicalDevice)
1638 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
1639
1640 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1641 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001642 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001643 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001644
Jeremy Hayes99a96322015-06-26 12:48:09 -06001645 return result;
1646}
1647
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001648VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001649 dispatch_key key = get_dispatch_key(device);
Dustin Graves080069b2016-04-05 13:48:15 -06001650 bool skipCall = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001651 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1652 assert(my_data != NULL);
1653
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001654 skipCall |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001655
Dustin Graves080069b2016-04-05 13:48:15 -06001656 if (!skipCall) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001657 layer_debug_report_destroy_device(device);
1658
Jeremy Hayes99a96322015-06-26 12:48:09 -06001659#if DISPATCH_MAP_DEBUG
Dustin Graves27a912a2016-03-07 17:52:14 -07001660 fprintf(stderr, "Device: %p, key: %p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001661#endif
1662
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001663 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001664 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001665 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001666 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001667}
1668
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001669bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001670 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001671 assert(my_device_data != nullptr);
1672
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001673 validate_queue_family_indices(device, "vkGetDeviceQueue", 1, &queueFamilyIndex);
1674
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001675 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001676 if (queue_data->second <= queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001677 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001678 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1679 "was created.",
1680 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001681 return false;
1682 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001683
Michael Lentinebdf744f2016-01-27 15:43:43 -06001684 return true;
1685}
1686
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001687VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1688vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001689 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001690 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001691 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001692
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001693 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001694
Dustin Graves080069b2016-04-05 13:48:15 -06001695 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001696 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1697
1698 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001699 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001700}
1701
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001702VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1703vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
1704 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001705 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001706 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001707 assert(my_data != NULL);
1708
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001709 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001710
Dustin Graves080069b2016-04-05 13:48:15 -06001711 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001712 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1713
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001714 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001715 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001716
Jeremy Hayes99a96322015-06-26 12:48:09 -06001717 return result;
1718}
1719
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001720VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001721 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1722 assert(my_data != NULL);
1723
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001724 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001725
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001726 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001727
1728 return result;
1729}
1730
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001731VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001732 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1733 assert(my_data != NULL);
1734
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001735 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001736
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001737 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001738
1739 return result;
1740}
1741
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001742VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1743 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1744 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001745 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001746 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001747 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001748
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001749 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001750
Dustin Graves080069b2016-04-05 13:48:15 -06001751 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001752 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1753
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001754 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001755 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001756
1757 return result;
1758}
1759
Dustin Graves27a912a2016-03-07 17:52:14 -07001760VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001761vkFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001762 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001763 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001764 assert(my_data != NULL);
1765
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001766 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001767
Dustin Graves080069b2016-04-05 13:48:15 -06001768 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001769 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001770 }
1771}
1772
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001773VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1774vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
1775 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001776 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001777 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001778 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001779
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001780 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001781
Dustin Graves080069b2016-04-05 13:48:15 -06001782 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001783 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1784
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001785 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001786 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001787
1788 return result;
1789}
1790
Dustin Graves20fd66f2016-04-18 18:33:21 -06001791VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUnmapMemory(VkDevice device, VkDeviceMemory memory) {
1792 bool skipCall = false;
1793 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1794 assert(my_data != NULL);
1795
1796 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1797
1798 if (!skipCall) {
1799 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1800 }
1801}
1802
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001803VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1804vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1805 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001806 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001807 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001808 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001809
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001810 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001811
Dustin Graves080069b2016-04-05 13:48:15 -06001812 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001813 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1814
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001815 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001816 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001817
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001818 return result;
1819}
1820
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001821VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1822vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1823 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001824 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001825 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001826 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001827
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001828 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001829
Dustin Graves080069b2016-04-05 13:48:15 -06001830 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001831 result =
1832 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001833
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001834 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001835 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001836
Tony Barbourb1250542015-04-16 19:23:13 -06001837 return result;
1838}
1839
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001840VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1841vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001842 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001843 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001844 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001845
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001846 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001847
Dustin Graves080069b2016-04-05 13:48:15 -06001848 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001849 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001850 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001851}
1852
Dustin Graves20fd66f2016-04-18 18:33:21 -06001853VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1854 VkDeviceSize memoryOffset) {
1855 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1856 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001857 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1858 assert(my_data != NULL);
1859
Dustin Graves20fd66f2016-04-18 18:33:21 -06001860 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001861
Dustin Graves20fd66f2016-04-18 18:33:21 -06001862 if (!skipCall) {
1863 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1864
1865 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1866 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001867
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001868 return result;
1869}
1870
Dustin Graves20fd66f2016-04-18 18:33:21 -06001871VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1872 VkDeviceSize memoryOffset) {
1873 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1874 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001875 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1876 assert(my_data != NULL);
1877
Dustin Graves20fd66f2016-04-18 18:33:21 -06001878 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001879
Dustin Graves20fd66f2016-04-18 18:33:21 -06001880 if (!skipCall) {
1881 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1882
1883 validate_result(my_data->report_data, "vkBindImageMemory", result);
1884 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001885
1886 return result;
1887}
1888
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001889VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1890vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001891 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001892 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001893 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001894
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001895 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001896
Dustin Graves080069b2016-04-05 13:48:15 -06001897 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001898 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001899 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001900}
1901
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001902VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1903vkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001904 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001905 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001906 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001907
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001908 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001909
Dustin Graves080069b2016-04-05 13:48:15 -06001910 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001911 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001912 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001913}
1914
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001915bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1916 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1917 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001918 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001919 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1920 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001921 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001922 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1923 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001924 return false;
1925 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001926 }
1927
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001928 return true;
1929}
1930
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001931VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1932vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1933 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001934 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001935 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001936 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001937
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001938 skipCall |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001939 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001940
Dustin Graves080069b2016-04-05 13:48:15 -06001941 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001942 get_dispatch_table(pc_device_table_map, device)
1943 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001944
1945 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1946 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001947}
1948
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001949bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1950 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1951 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001952 if (pProperties != nullptr) {
1953 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1954 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001955 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001956 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
1957 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001958 return false;
1959 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001960 }
1961
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001962 return true;
1963}
1964
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001965VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1966vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1967 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1968 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001969 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001970 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001971 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001972
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001973 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001974 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001975
Dustin Graves080069b2016-04-05 13:48:15 -06001976 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001977 get_dispatch_table(pc_instance_table_map, physicalDevice)
1978 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
1979 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001980
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001981 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
1982 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001983 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001984}
1985
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001986VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1987vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
1988 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001989 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001990 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001991 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001992
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001993 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001994
Dustin Graves080069b2016-04-05 13:48:15 -06001995 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001996 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
1997
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001998 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001999 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002000
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002001 return result;
2002}
2003
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002004VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2005vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
2006 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002007 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002008 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002009 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002010
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002011 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002012
Dustin Graves080069b2016-04-05 13:48:15 -06002013 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002014 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2015
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002016 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002017 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002018
2019 return result;
2020}
2021
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002022VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002023 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002024 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002025 assert(my_data != NULL);
2026
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002027 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002028
Dustin Graves080069b2016-04-05 13:48:15 -06002029 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002030 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002031 }
2032}
2033
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002034VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
2035 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002036 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002037 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002038 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002039
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002040 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002041
Dustin Graves080069b2016-04-05 13:48:15 -06002042 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002043 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2044
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002045 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002046 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002047
2048 return result;
2049}
2050
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002051VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002052 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2053 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002054 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2055 assert(my_data != NULL);
2056
Dustin Graves20fd66f2016-04-18 18:33:21 -06002057 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002058
Dustin Graves20fd66f2016-04-18 18:33:21 -06002059 if (!skipCall) {
2060 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2061
2062 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2063 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002064
2065 return result;
2066}
2067
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002068VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2069vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
2070 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002071 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002072 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002073 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002074
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002075 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002076
Dustin Graves080069b2016-04-05 13:48:15 -06002077 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002078 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2079
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002080 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002081 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002082
2083 return result;
2084}
2085
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002086VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
2087 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2088 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002089 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002090 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002091 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002092
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002093 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002094
Dustin Graves080069b2016-04-05 13:48:15 -06002095 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002096 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2097
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002098 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002099 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002100
2101 return result;
2102}
2103
Dustin Graves27a912a2016-03-07 17:52:14 -07002104VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002105vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002106 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002107 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002108 assert(my_data != NULL);
2109
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002110 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002111
Dustin Graves080069b2016-04-05 13:48:15 -06002112 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002113 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002114 }
2115}
2116
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002117VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2118vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
2119 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002120 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002121 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002122 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002123
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002124 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002125
Dustin Graves080069b2016-04-05 13:48:15 -06002126 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002127 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2128
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002129 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002130 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002131
2132 return result;
2133}
2134
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002135VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002136 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002137 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002138 assert(my_data != NULL);
2139
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002140 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002141
Dustin Graves080069b2016-04-05 13:48:15 -06002142 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002143 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002144 }
2145}
2146
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002147VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002148 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2149 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002150 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2151 assert(my_data != NULL);
2152
Dustin Graves20fd66f2016-04-18 18:33:21 -06002153 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002154
Dustin Graves20fd66f2016-04-18 18:33:21 -06002155 if (!skipCall) {
2156 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2157
2158 validate_result(my_data->report_data, "vkGetEventStatus", result);
2159 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002160
2161 return result;
2162}
2163
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002164VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002165 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2166 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002167 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2168 assert(my_data != NULL);
2169
Dustin Graves20fd66f2016-04-18 18:33:21 -06002170 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002171
Dustin Graves20fd66f2016-04-18 18:33:21 -06002172 if (!skipCall) {
2173 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2174
2175 validate_result(my_data->report_data, "vkSetEvent", result);
2176 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002177
2178 return result;
2179}
2180
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002181VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002182 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2183 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002184 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2185 assert(my_data != NULL);
2186
Dustin Graves20fd66f2016-04-18 18:33:21 -06002187 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002188
Dustin Graves20fd66f2016-04-18 18:33:21 -06002189 if (!skipCall) {
2190 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2191
2192 validate_result(my_data->report_data, "vkResetEvent", result);
2193 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002194
2195 return result;
2196}
2197
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002198VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2199 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
2200 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002201 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002202 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002203 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002204
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002205 skipCall |= parameter_validation_vkCreateQueryPool(my_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002206
Dustin Graves080069b2016-04-05 13:48:15 -06002207 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002208 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2209
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002210 validate_result(my_data->report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002211 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002212
2213 return result;
2214}
2215
Dustin Graves27a912a2016-03-07 17:52:14 -07002216VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002217vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002218 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002219 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002220 assert(my_data != NULL);
2221
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002222 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002223
Dustin Graves080069b2016-04-05 13:48:15 -06002224 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002225 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002226 }
2227}
2228
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002229VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2230 uint32_t queryCount, size_t dataSize, void *pData,
2231 VkDeviceSize stride, VkQueryResultFlags flags) {
2232 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002233 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002234 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002235 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002236
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002237 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002238 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002239
Dustin Graves080069b2016-04-05 13:48:15 -06002240 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002241 result = get_dispatch_table(pc_device_table_map, device)
2242 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002243
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002244 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002245 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002246
2247 return result;
2248}
2249
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002250bool PreCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo) {
2251 if (pCreateInfo != nullptr) {
Dustin Graves29148ff2016-03-23 19:44:00 -06002252 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002253 validate_queue_family_indices(device, "vkCreateBuffer", pCreateInfo->queueFamilyIndexCount,
2254 pCreateInfo->pQueueFamilyIndices);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002255 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002256 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002257
2258 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002259}
2260
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002261VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2262vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
2263 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002264 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002265 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002266 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002267
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002268 skipCall |= parameter_validation_vkCreateBuffer(my_data->report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002269
Dustin Graves080069b2016-04-05 13:48:15 -06002270 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002271 PreCreateBuffer(device, pCreateInfo);
2272
2273 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2274
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002275 validate_result(my_data->report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002276 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002277
2278 return result;
2279}
2280
Dustin Graves27a912a2016-03-07 17:52:14 -07002281VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002282vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002283 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002284 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002285 assert(my_data != NULL);
2286
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002287 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002288
Dustin Graves080069b2016-04-05 13:48:15 -06002289 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002290 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002291 }
2292}
2293
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002294VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2295 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
2296 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002297 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002298 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002299 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002300
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002301 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002302
Dustin Graves080069b2016-04-05 13:48:15 -06002303 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002304 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2305
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002306 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002307 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002308
2309 return result;
2310}
2311
Dustin Graves27a912a2016-03-07 17:52:14 -07002312VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002313vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002314 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002315 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002316 assert(my_data != NULL);
2317
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002318 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002319
Dustin Graves080069b2016-04-05 13:48:15 -06002320 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002321 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002322 }
2323}
2324
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002325bool PreCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo) {
2326 if (pCreateInfo != nullptr) {
Dustin Graves29148ff2016-03-23 19:44:00 -06002327 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002328 validate_queue_family_indices(device, "vkCreateImage", pCreateInfo->queueFamilyIndexCount,
2329 pCreateInfo->pQueueFamilyIndices);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002330 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002331 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002332
2333 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002334}
2335
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002336VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2337vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
2338 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002339 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002340 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002341 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002342
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002343 skipCall |= parameter_validation_vkCreateImage(my_data->report_data, pCreateInfo, pAllocator, pImage);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002344
Dustin Graves080069b2016-04-05 13:48:15 -06002345 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002346 PreCreateImage(device, pCreateInfo);
2347
2348 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2349
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002350 validate_result(my_data->report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002351 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002352
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002353 return result;
2354}
2355
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002356VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002357 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002358 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002359 assert(my_data != NULL);
2360
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002361 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002362
Dustin Graves080069b2016-04-05 13:48:15 -06002363 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002364 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002365 }
2366}
2367
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002368bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2369 if (pSubresource != nullptr) {
2370 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2371 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
2372 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2373 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2374 return false;
2375 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002376 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002377
2378 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002379}
2380
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002381VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2382vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002383 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002384 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002385 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002386
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002387 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002388
Dustin Graves080069b2016-04-05 13:48:15 -06002389 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002390 PreGetImageSubresourceLayout(device, pSubresource);
2391
2392 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002393 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002394}
2395
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002396VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2397 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
2398 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002399 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002400 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002401 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002402
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002403 skipCall |= parameter_validation_vkCreateImageView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002404
Dustin Graves080069b2016-04-05 13:48:15 -06002405 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002406 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2407
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002408 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002409 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002410
2411 return result;
2412}
2413
Dustin Graves27a912a2016-03-07 17:52:14 -07002414VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002415vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002416 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002417 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002418 assert(my_data != NULL);
2419
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002420 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002421
Dustin Graves080069b2016-04-05 13:48:15 -06002422 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002423 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002424 }
2425}
2426
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002427VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2428 const VkAllocationCallbacks *pAllocator,
2429 VkShaderModule *pShaderModule) {
2430 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002431 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002432 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002433 assert(my_data != NULL);
2434
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002435 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002436
Dustin Graves080069b2016-04-05 13:48:15 -06002437 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002438 result =
2439 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002440
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002441 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002442 }
2443
Michael Lentine03d8e572015-09-15 14:59:14 -05002444 return result;
2445}
2446
Dustin Graves27a912a2016-03-07 17:52:14 -07002447VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002448vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002449 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002450 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002451 assert(my_data != NULL);
2452
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002453 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002454
Dustin Graves080069b2016-04-05 13:48:15 -06002455 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002456 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002457 }
2458}
2459
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002460VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2461 const VkAllocationCallbacks *pAllocator,
2462 VkPipelineCache *pPipelineCache) {
2463 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002464 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002465 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002466 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002467
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002468 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002469
Dustin Graves080069b2016-04-05 13:48:15 -06002470 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002471 result =
2472 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002473
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002474 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002475 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002476
2477 return result;
2478}
2479
Dustin Graves27a912a2016-03-07 17:52:14 -07002480VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002481vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002482 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002483 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002484 assert(my_data != NULL);
2485
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002486 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002487
Dustin Graves080069b2016-04-05 13:48:15 -06002488 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002489 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002490 }
2491}
2492
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002493VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2494vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
2495 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002496 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002497 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002498 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002499
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002500 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002501
Dustin Graves080069b2016-04-05 13:48:15 -06002502 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002503 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2504
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002505 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002506 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002507
2508 return result;
2509}
2510
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002511VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2512vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
2513 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002514 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002515 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002516 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002517
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002518 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002519
Dustin Graves080069b2016-04-05 13:48:15 -06002520 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002521 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2522
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002523 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002524 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002525
2526 return result;
2527}
2528
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002529bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002530 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2531
2532 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002533 if (pCreateInfos != nullptr) {
2534 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2535 if (pCreateInfos->basePipelineIndex != -1) {
2536 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2537 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2538 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2539 "pCreateInfos->flags "
2540 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2541 return false;
2542 }
2543 }
2544
2545 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2546 if (pCreateInfos->basePipelineIndex != -1) {
2547 log_msg(
2548 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2549 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2550 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2551 "VK_NULL_HANDLE");
2552 return false;
2553 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002554 }
2555 }
2556
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002557 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002558 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
2559 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2560 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2561 "unrecognized enumerator");
2562 return false;
2563 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002564 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002565
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002566 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002567 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002568 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002569 pCreateInfos[i].pStages[j].pName);
2570 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002571 }
2572
2573 return true;
2574}
2575
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002576VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2577vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2578 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2579 VkPipeline *pPipelines) {
2580 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002581 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002582 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002583 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002584
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002585 skipCall |= parameter_validation_vkCreateGraphicsPipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002586 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002587
Dustin Graves080069b2016-04-05 13:48:15 -06002588 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002589 PreCreateGraphicsPipelines(device, pCreateInfos);
2590
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002591 result = get_dispatch_table(pc_device_table_map, device)
2592 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002593
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002594 validate_result(my_data->report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002595 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002596
2597 return result;
2598}
2599
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002600bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002601 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2602
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002603 if (pCreateInfos != nullptr) {
2604 // TODO: Handle count!
2605 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002606 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002607 }
2608
2609 return true;
2610}
2611
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002612VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2613vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2614 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2615 VkPipeline *pPipelines) {
2616 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002617 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002618 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002619 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002620
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002621 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002622 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002623
Dustin Graves080069b2016-04-05 13:48:15 -06002624 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002625 PreCreateComputePipelines(device, pCreateInfos);
2626
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002627 result = get_dispatch_table(pc_device_table_map, device)
2628 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002629
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002630 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002631 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002632
2633 return result;
2634}
2635
Dustin Graves27a912a2016-03-07 17:52:14 -07002636VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002637vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002638 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002639 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002640 assert(my_data != NULL);
2641
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002642 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002643
Dustin Graves080069b2016-04-05 13:48:15 -06002644 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002645 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002646 }
2647}
2648
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002649VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2650vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2651 VkPipelineLayout *pPipelineLayout) {
2652 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002653 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002654 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002655 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002656
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002657 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002658
Dustin Graves080069b2016-04-05 13:48:15 -06002659 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002660 result =
2661 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002662
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002663 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002664 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002665
2666 return result;
2667}
2668
Dustin Graves27a912a2016-03-07 17:52:14 -07002669VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002670vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002671 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002672 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002673 assert(my_data != NULL);
2674
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002675 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002676
Dustin Graves080069b2016-04-05 13:48:15 -06002677 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002678 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002679 }
2680}
2681
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002682VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2683 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
2684 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002685 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002686 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002687 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002688
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002689 skipCall |= parameter_validation_vkCreateSampler(my_data->report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002690
Dustin Graves080069b2016-04-05 13:48:15 -06002691 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002692 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
2693
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002694 validate_result(my_data->report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002695 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002696
2697 return result;
2698}
2699
Dustin Graves27a912a2016-03-07 17:52:14 -07002700VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002701vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002702 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002703 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002704 assert(my_data != NULL);
2705
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002706 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002707
Dustin Graves080069b2016-04-05 13:48:15 -06002708 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002709 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002710 }
2711}
2712
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002713VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2714vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2715 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
2716 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002717 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002718 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002719 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002720
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002721 skipCall |= parameter_validation_vkCreateDescriptorSetLayout(my_data->report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002722
Dustin Graves080069b2016-04-05 13:48:15 -06002723 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002724 result =
2725 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002726
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002727 validate_result(my_data->report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002728 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002729
2730 return result;
2731}
2732
Dustin Graves27a912a2016-03-07 17:52:14 -07002733VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002734vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002735 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002736 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002737 assert(my_data != NULL);
2738
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002739 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002740
Dustin Graves080069b2016-04-05 13:48:15 -06002741 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002742 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002743 }
2744}
2745
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002746VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2747vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2748 VkDescriptorPool *pDescriptorPool) {
2749 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002750 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002751 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002752 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002753
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002754 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002755
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002756 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
2757
Dustin Graves080069b2016-04-05 13:48:15 -06002758 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002759 result =
2760 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002761
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002762 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002763 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002764
2765 return result;
2766}
2767
Dustin Graves27a912a2016-03-07 17:52:14 -07002768VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002769vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002770 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002771 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002772 assert(my_data != NULL);
2773
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002774 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002775
Dustin Graves080069b2016-04-05 13:48:15 -06002776 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002777 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002778 }
2779}
2780
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002781VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2782vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002783 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2784 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002785 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2786 assert(my_data != NULL);
2787
Dustin Graves20fd66f2016-04-18 18:33:21 -06002788 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002789
Dustin Graves20fd66f2016-04-18 18:33:21 -06002790 if (!skipCall) {
2791 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
2792
2793 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
2794 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002795
2796 return result;
2797}
2798
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002799VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2800vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
2801 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002802 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002803 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002804 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002805
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002806 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002807
Dustin Graves080069b2016-04-05 13:48:15 -06002808 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002809 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
2810
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002811 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002812 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002813
2814 return result;
2815}
2816
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002817VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
2818 uint32_t descriptorSetCount,
2819 const VkDescriptorSet *pDescriptorSets) {
2820 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002821 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002822 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002823 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002824
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002825 skipCall |= parameter_validation_vkFreeDescriptorSets(my_data->report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002826
Dustin Graves080069b2016-04-05 13:48:15 -06002827 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002828 result = get_dispatch_table(pc_device_table_map, device)
2829 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002830
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002831 validate_result(my_data->report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002832 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002833
2834 return result;
2835}
2836
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002837VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2838vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
2839 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Graves080069b2016-04-05 13:48:15 -06002840 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002841 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002842 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002843
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002844 skipCall |= parameter_validation_vkUpdateDescriptorSets(my_data->report_data, descriptorWriteCount, pDescriptorWrites,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002845 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002846
Dustin Graves080069b2016-04-05 13:48:15 -06002847 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002848 get_dispatch_table(pc_device_table_map, device)
2849 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002850 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002851}
2852
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002853VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2854 const VkAllocationCallbacks *pAllocator,
2855 VkFramebuffer *pFramebuffer) {
2856 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002857 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002858 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002859 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002860
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002861 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002862
Dustin Graves080069b2016-04-05 13:48:15 -06002863 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002864 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
2865
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002866 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002867 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002868
2869 return result;
2870}
2871
Dustin Graves27a912a2016-03-07 17:52:14 -07002872VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002873vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002874 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002875 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002876 assert(my_data != NULL);
2877
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002878 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002879
Dustin Graves080069b2016-04-05 13:48:15 -06002880 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002881 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002882 }
2883}
2884
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002885VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2886 const VkAllocationCallbacks *pAllocator,
2887 VkRenderPass *pRenderPass) {
2888 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002889 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002890 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002891 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002892
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002893 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002894
Dustin Graves080069b2016-04-05 13:48:15 -06002895 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002896 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
2897
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002898 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002899 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002900
2901 return result;
2902}
2903
Dustin Graves27a912a2016-03-07 17:52:14 -07002904VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002905vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002906 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002907 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002908 assert(my_data != NULL);
2909
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002910 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002911
Dustin Graves080069b2016-04-05 13:48:15 -06002912 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002913 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002914 }
2915}
2916
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002917VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2918vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06002919 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002920 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002921 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002922
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002923 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002924
Dustin Graves080069b2016-04-05 13:48:15 -06002925 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002926 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002927 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002928}
2929
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002930VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
2931 const VkAllocationCallbacks *pAllocator,
2932 VkCommandPool *pCommandPool) {
2933 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002934 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002935 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002936 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002937
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002938 skipCall |= validate_queue_family_indices(device, "vkCreateCommandPool", 1, &(pCreateInfo->queueFamilyIndex));
2939
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002940 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002941
Dustin Graves080069b2016-04-05 13:48:15 -06002942 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002943 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
2944
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002945 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002946 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002947
2948 return result;
2949}
2950
Dustin Graves27a912a2016-03-07 17:52:14 -07002951VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002952vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002953 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002954 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002955 assert(my_data != NULL);
2956
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002957 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002958
Dustin Graves080069b2016-04-05 13:48:15 -06002959 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002960 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002961 }
2962}
2963
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002964VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2965vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002966 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2967 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002968 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2969 assert(my_data != NULL);
2970
Dustin Graves20fd66f2016-04-18 18:33:21 -06002971 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002972
Dustin Graves20fd66f2016-04-18 18:33:21 -06002973 if (!skipCall) {
2974 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
2975
2976 validate_result(my_data->report_data, "vkResetCommandPool", result);
2977 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002978
2979 return result;
2980}
2981
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002982VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2983vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
2984 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002985 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002986 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002987 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002988
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002989 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002990
Dustin Graves080069b2016-04-05 13:48:15 -06002991 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002992 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
2993
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002994 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002995 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002996
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002997 return result;
2998}
2999
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003000VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3001 uint32_t commandBufferCount,
3002 const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003003 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003004 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003005 assert(my_data != NULL);
3006
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003007 skipCall |= parameter_validation_vkFreeCommandBuffers(my_data->report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003008
Dustin Graves080069b2016-04-05 13:48:15 -06003009 if (!skipCall) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003010 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003011 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003012 }
3013}
3014
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003015VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3016vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3017 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003018 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003019 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003020 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003021
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003022 skipCall |= parameter_validation_vkBeginCommandBuffer(my_data->report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003023
Dustin Graves080069b2016-04-05 13:48:15 -06003024 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003025 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3026
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003027 validate_result(my_data->report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003028 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003029
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003030 return result;
3031}
3032
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003033VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003034 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3035 assert(my_data != NULL);
3036
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003037 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003038
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003039 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003040
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003041 return result;
3042}
3043
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003044VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3045vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003046 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3047 assert(my_data != NULL);
3048
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003049 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003050
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003051 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003052
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003053 return result;
3054}
3055
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003056VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3057vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003058 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003059 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3060 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003061
Dustin Graves29148ff2016-03-23 19:44:00 -06003062 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3063
Dustin Graves080069b2016-04-05 13:48:15 -06003064 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003065 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3066 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003067}
3068
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003069VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3070vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003071 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003072 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003073 assert(my_data != NULL);
3074
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003075 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003076
Dustin Graves080069b2016-04-05 13:48:15 -06003077 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003078 get_dispatch_table(pc_device_table_map, commandBuffer)
3079 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003080 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003081}
3082
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003083VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3084vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003085 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003086 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003087 assert(my_data != NULL);
3088
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003089 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003090
Dustin Graves080069b2016-04-05 13:48:15 -06003091 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003092 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3093 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003094}
3095
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003096VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003097 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003098}
3099
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003100VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3101vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
3102 get_dispatch_table(pc_device_table_map, commandBuffer)
3103 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003104}
3105
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003106VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003107 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003108 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003109 assert(my_data != NULL);
3110
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003111 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003112
Dustin Graves080069b2016-04-05 13:48:15 -06003113 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003114 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3115 }
Cody Northrop12365112015-08-17 11:10:49 -06003116}
3117
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003118VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3119vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003120 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003121}
3122
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003123VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3124vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003125 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003126}
3127
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003128VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3129vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003130 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003131}
3132
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003133VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3134vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003135 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003136}
3137
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003138VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3139vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3140 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3141 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003142 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003143 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003144 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003145
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003146 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003147 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003148
Dustin Graves080069b2016-04-05 13:48:15 -06003149 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003150 get_dispatch_table(pc_device_table_map, commandBuffer)
3151 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3152 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003153 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003154}
3155
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003156VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3157vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003158 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003159 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3160 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003161
Dustin Graves29148ff2016-03-23 19:44:00 -06003162 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3163
Dustin Graves080069b2016-04-05 13:48:15 -06003164 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003165 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3166 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003167}
3168
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003169VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3170 uint32_t bindingCount, const VkBuffer *pBuffers,
3171 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003172 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003173 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003174 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003175
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003176 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003177
Dustin Graves080069b2016-04-05 13:48:15 -06003178 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003179 get_dispatch_table(pc_device_table_map, commandBuffer)
3180 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003181 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003182}
3183
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003184bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3185 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003186 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003187 // TODO: Verify against Valid Usage section. I don't see a non-zero vertexCount listed, may need to add that and make
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003188 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003189 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003190 "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003191 return false;
3192 }
3193
3194 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003195 // TODO: Verify against Valid Usage section. I don't see a non-zero instanceCount listed, may need to add that and make
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003196 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003197 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003198 "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003199 return false;
3200 }
3201
3202 return true;
3203}
3204
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003205VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3206 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003207 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06003208
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003209 get_dispatch_table(pc_device_table_map, commandBuffer)
3210 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003211}
3212
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003213VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3214 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3215 uint32_t firstInstance) {
3216 get_dispatch_table(pc_device_table_map, commandBuffer)
3217 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003218}
3219
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003220VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3221vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003222 bool skipCall = false;
3223 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3224 assert(my_data != NULL);
3225
3226 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
3227
3228 if (!skipCall) {
3229 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
3230 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003231}
3232
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003233VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3234vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003235 bool skipCall = false;
3236 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3237 assert(my_data != NULL);
3238
3239 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
3240
3241 if (!skipCall) {
3242 get_dispatch_table(pc_device_table_map, commandBuffer)
3243 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
3244 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003245}
3246
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003247VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003248 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003249}
3250
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003251VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3252vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003253 bool skipCall = false;
3254 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3255 assert(my_data != NULL);
3256
3257 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
3258
3259 if (!skipCall) {
3260 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
3261 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003262}
3263
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003264VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
3265 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003266 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003267 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003268 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003269
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003270 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003271
Dustin Graves080069b2016-04-05 13:48:15 -06003272 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003273 get_dispatch_table(pc_device_table_map, commandBuffer)
3274 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003275 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003276}
3277
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003278bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
3279 if (pRegions != nullptr) {
3280 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3281 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3282 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3283 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3284 return false;
3285 }
3286 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3287 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3288 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3289 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3290 return false;
3291 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003292 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003293
3294 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003295}
3296
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003297VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3298vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3299 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003300 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003301 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003302 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003303
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003304 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003305 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003306
Dustin Graves080069b2016-04-05 13:48:15 -06003307 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003308 PreCmdCopyImage(commandBuffer, pRegions);
3309
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003310 get_dispatch_table(pc_device_table_map, commandBuffer)
3311 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003312 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003313}
3314
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003315bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
3316 if (pRegions != nullptr) {
3317 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3318 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3319 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3320 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3321 return false;
3322 }
3323 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3324 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3325 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3326 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3327 return false;
3328 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003329 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003330
3331 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003332}
3333
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003334VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3335vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3336 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06003337 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003338 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003339 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003340
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003341 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003342 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003343
Dustin Graves080069b2016-04-05 13:48:15 -06003344 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003345 PreCmdBlitImage(commandBuffer, pRegions);
3346
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003347 get_dispatch_table(pc_device_table_map, commandBuffer)
3348 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003349 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003350}
3351
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003352bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3353 if (pRegions != nullptr) {
3354 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3355 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3356 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3357 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3358 "enumerator");
3359 return false;
3360 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003361 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003362
3363 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003364}
3365
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003366VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
3367 VkImage dstImage, VkImageLayout dstImageLayout,
3368 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003369 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003370 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003371 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003372
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003373 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003374 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003375
Dustin Graves080069b2016-04-05 13:48:15 -06003376 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003377 PreCmdCopyBufferToImage(commandBuffer, pRegions);
3378
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003379 get_dispatch_table(pc_device_table_map, commandBuffer)
3380 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003381 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003382}
3383
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003384bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3385 if (pRegions != nullptr) {
3386 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3387 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3388 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3389 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3390 "enumerator");
3391 return false;
3392 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003393 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003394
3395 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003396}
3397
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003398VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
3399 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
3400 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003401 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003402 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003403 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003404
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003405 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003406 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003407
Dustin Graves080069b2016-04-05 13:48:15 -06003408 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003409 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
3410
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003411 get_dispatch_table(pc_device_table_map, commandBuffer)
3412 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003413 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003414}
3415
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003416VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
3417 VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) {
Dustin Graves080069b2016-04-05 13:48:15 -06003418 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003419 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003420 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003421
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003422 skipCall |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003423
Dustin Graves080069b2016-04-05 13:48:15 -06003424 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003425 get_dispatch_table(pc_device_table_map, commandBuffer)
3426 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003427 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003428}
3429
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003430VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3431vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003432 bool skipCall = false;
3433 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3434 assert(my_data != NULL);
3435
3436 skipCall |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
3437
3438 if (!skipCall) {
3439 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
3440 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003441}
3442
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003443VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
3444 VkImageLayout imageLayout, const VkClearColorValue *pColor,
3445 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003446 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003447 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003448 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003449
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003450 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003451
Dustin Graves080069b2016-04-05 13:48:15 -06003452 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003453 get_dispatch_table(pc_device_table_map, commandBuffer)
3454 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003455 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003456}
3457
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003458VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3459vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
3460 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
3461 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003462 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003463 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003464 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003465
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003466 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003467 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003468
Dustin Graves080069b2016-04-05 13:48:15 -06003469 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003470 get_dispatch_table(pc_device_table_map, commandBuffer)
3471 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003472 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003473}
3474
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003475VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
3476 const VkClearAttachment *pAttachments, uint32_t rectCount,
3477 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06003478 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003479 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003480 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003481
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003482 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003483
Dustin Graves080069b2016-04-05 13:48:15 -06003484 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003485 get_dispatch_table(pc_device_table_map, commandBuffer)
3486 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003487 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003488}
3489
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003490bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
3491 if (pRegions != nullptr) {
3492 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3493 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3494 log_msg(
3495 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3496 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3497 return false;
3498 }
3499 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3500 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3501 log_msg(
3502 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3503 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3504 return false;
3505 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003506 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003507
3508 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003509}
3510
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003511VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3512vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3513 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003514 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003515 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003516 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003517
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003518 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003519 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003520
Dustin Graves080069b2016-04-05 13:48:15 -06003521 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003522 PreCmdResolveImage(commandBuffer, pRegions);
3523
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003524 get_dispatch_table(pc_device_table_map, commandBuffer)
3525 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003526 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003527}
3528
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003529VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3530vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003531 bool skipCall = false;
3532 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3533 assert(my_data != NULL);
3534
3535 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
3536
3537 if (!skipCall) {
3538 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
3539 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003540}
3541
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003542VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3543vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003544 bool skipCall = false;
3545 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3546 assert(my_data != NULL);
3547
3548 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
3549
3550 if (!skipCall) {
3551 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
3552 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003553}
3554
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003555VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3556vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
3557 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3558 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3559 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003560 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003561 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003562 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003563
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003564 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003565 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
3566 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003567
Dustin Graves080069b2016-04-05 13:48:15 -06003568 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003569 get_dispatch_table(pc_device_table_map, commandBuffer)
3570 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
3571 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003572 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003573}
3574
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003575VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3576vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
3577 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3578 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3579 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003580 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003581 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003582 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003583
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003584 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003585 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
3586 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003587
Dustin Graves080069b2016-04-05 13:48:15 -06003588 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003589 get_dispatch_table(pc_device_table_map, commandBuffer)
3590 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
3591 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003592 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003593}
3594
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003595VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3596vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003597 bool skipCall = false;
3598 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3599 assert(my_data != NULL);
3600
3601 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
3602
3603 if (!skipCall) {
3604 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
3605 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003606}
3607
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003608VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003609 bool skipCall = false;
3610 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3611 assert(my_data != NULL);
3612
3613 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
3614
3615 if (!skipCall) {
3616 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
3617 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003618}
3619
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003620VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3621vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003622 bool skipCall = false;
3623 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3624 assert(my_data != NULL);
3625
3626 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
3627
3628 if (!skipCall) {
3629 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
3630 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003631}
3632
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003633bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
3634 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003635
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08003636 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003637
3638 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003639}
3640
Dustin Graves20fd66f2016-04-18 18:33:21 -06003641VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
3642 VkQueryPool queryPool, uint32_t query) {
3643 bool skipCall = false;
3644 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3645 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003646
Dustin Graves20fd66f2016-04-18 18:33:21 -06003647 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
3648
3649 if (!skipCall) {
3650 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3651
3652 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3653 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003654}
3655
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003656VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3657vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
3658 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003659 bool skipCall = false;
3660 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3661 assert(my_data != NULL);
3662
3663 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
3664 dstOffset, stride, flags);
3665
3666 if (!skipCall) {
3667 get_dispatch_table(pc_device_table_map, commandBuffer)
3668 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
3669 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003670}
3671
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003672VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
3673 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
3674 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06003675 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003676 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003677 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003678
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003679 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003680
Dustin Graves080069b2016-04-05 13:48:15 -06003681 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003682 get_dispatch_table(pc_device_table_map, commandBuffer)
3683 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003684 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003685}
3686
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003687VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3688vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003689 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003690 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003691 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003692
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003693 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003694
Dustin Graves080069b2016-04-05 13:48:15 -06003695 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003696 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003697 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003698}
3699
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003700VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003701 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003702 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3703 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08003704
Dustin Graves29148ff2016-03-23 19:44:00 -06003705 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
3706
Dustin Graves080069b2016-04-05 13:48:15 -06003707 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003708 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
3709 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003710}
3711
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003712VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003713 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003714}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003715
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003716VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3717vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003718 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003719 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003720 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003721
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003722 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08003723
Dustin Graves080069b2016-04-05 13:48:15 -06003724 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003725 get_dispatch_table(pc_device_table_map, commandBuffer)
3726 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003727 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003728}
3729
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003730VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003731 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3732
Dustin Graves080069b2016-04-05 13:48:15 -06003733 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003734 return NULL;
3735 }
3736
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003737 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003738 return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003739 if (!strcmp(funcName, "vkDestroyDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003740 return (PFN_vkVoidFunction)vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003741 if (!strcmp(funcName, "vkGetDeviceQueue"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003742 return (PFN_vkVoidFunction)vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003743 if (!strcmp(funcName, "vkQueueSubmit"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003744 return (PFN_vkVoidFunction)vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003745 if (!strcmp(funcName, "vkQueueWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003746 return (PFN_vkVoidFunction)vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003747 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003748 return (PFN_vkVoidFunction)vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003749 if (!strcmp(funcName, "vkAllocateMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003750 return (PFN_vkVoidFunction)vkAllocateMemory;
Dustin Graves27a912a2016-03-07 17:52:14 -07003751 if (!strcmp(funcName, "vkFreeMemory"))
3752 return (PFN_vkVoidFunction)vkFreeMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003753 if (!strcmp(funcName, "vkMapMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003754 return (PFN_vkVoidFunction)vkMapMemory;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003755 if (!strcmp(funcName, "vkUnmapMemory"))
3756 return (PFN_vkVoidFunction)vkUnmapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003757 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003758 return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003759 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003760 return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003761 if (!strcmp(funcName, "vkGetDeviceMemoryCommitment"))
3762 return (PFN_vkVoidFunction)vkGetDeviceMemoryCommitment;
3763 if (!strcmp(funcName, "vkBindBufferMemory"))
3764 return (PFN_vkVoidFunction)vkBindBufferMemory;
3765 if (!strcmp(funcName, "vkBindImageMemory"))
3766 return (PFN_vkVoidFunction)vkBindImageMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003767 if (!strcmp(funcName, "vkCreateFence"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003768 return (PFN_vkVoidFunction)vkCreateFence;
Dustin Graves27a912a2016-03-07 17:52:14 -07003769 if (!strcmp(funcName, "vkDestroyFence"))
3770 return (PFN_vkVoidFunction)vkDestroyFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003771 if (!strcmp(funcName, "vkResetFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003772 return (PFN_vkVoidFunction)vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003773 if (!strcmp(funcName, "vkGetFenceStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003774 return (PFN_vkVoidFunction)vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003775 if (!strcmp(funcName, "vkWaitForFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003776 return (PFN_vkVoidFunction)vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003777 if (!strcmp(funcName, "vkCreateSemaphore"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003778 return (PFN_vkVoidFunction)vkCreateSemaphore;
Dustin Graves27a912a2016-03-07 17:52:14 -07003779 if (!strcmp(funcName, "vkDestroySemaphore"))
3780 return (PFN_vkVoidFunction)vkDestroySemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003781 if (!strcmp(funcName, "vkCreateEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003782 return (PFN_vkVoidFunction)vkCreateEvent;
Dustin Graves27a912a2016-03-07 17:52:14 -07003783 if (!strcmp(funcName, "vkDestroyEvent"))
3784 return (PFN_vkVoidFunction)vkDestroyEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003785 if (!strcmp(funcName, "vkGetEventStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003786 return (PFN_vkVoidFunction)vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003787 if (!strcmp(funcName, "vkSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003788 return (PFN_vkVoidFunction)vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003789 if (!strcmp(funcName, "vkResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003790 return (PFN_vkVoidFunction)vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003791 if (!strcmp(funcName, "vkCreateQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003792 return (PFN_vkVoidFunction)vkCreateQueryPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07003793 if (!strcmp(funcName, "vkDestroyQueryPool"))
3794 return (PFN_vkVoidFunction)vkDestroyQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003795 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003796 return (PFN_vkVoidFunction)vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003797 if (!strcmp(funcName, "vkCreateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003798 return (PFN_vkVoidFunction)vkCreateBuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07003799 if (!strcmp(funcName, "vkDestroyBuffer"))
3800 return (PFN_vkVoidFunction)vkDestroyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003801 if (!strcmp(funcName, "vkCreateBufferView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003802 return (PFN_vkVoidFunction)vkCreateBufferView;
Dustin Graves27a912a2016-03-07 17:52:14 -07003803 if (!strcmp(funcName, "vkDestroyBufferView"))
3804 return (PFN_vkVoidFunction)vkDestroyBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003805 if (!strcmp(funcName, "vkCreateImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003806 return (PFN_vkVoidFunction)vkCreateImage;
Dustin Graves27a912a2016-03-07 17:52:14 -07003807 if (!strcmp(funcName, "vkDestroyImage"))
3808 return (PFN_vkVoidFunction)vkDestroyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003809 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003810 return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003811 if (!strcmp(funcName, "vkCreateImageView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003812 return (PFN_vkVoidFunction)vkCreateImageView;
Dustin Graves27a912a2016-03-07 17:52:14 -07003813 if (!strcmp(funcName, "vkDestroyImageView"))
3814 return (PFN_vkVoidFunction)vkDestroyImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05003815 if (!strcmp(funcName, "vkCreateShaderModule"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003816 return (PFN_vkVoidFunction)vkCreateShaderModule;
Dustin Graves27a912a2016-03-07 17:52:14 -07003817 if (!strcmp(funcName, "vkDestroyShaderModule"))
3818 return (PFN_vkVoidFunction)vkDestroyShaderModule;
3819 if (!strcmp(funcName, "vkCreatePipelineCache"))
3820 return (PFN_vkVoidFunction)vkCreatePipelineCache;
3821 if (!strcmp(funcName, "vkDestroyPipelineCache"))
3822 return (PFN_vkVoidFunction)vkDestroyPipelineCache;
3823 if (!strcmp(funcName, "vkGetPipelineCacheData"))
3824 return (PFN_vkVoidFunction)vkGetPipelineCacheData;
3825 if (!strcmp(funcName, "vkMergePipelineCaches"))
3826 return (PFN_vkVoidFunction)vkMergePipelineCaches;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003827 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003828 return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003829 if (!strcmp(funcName, "vkCreateComputePipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003830 return (PFN_vkVoidFunction)vkCreateComputePipelines;
Dustin Graves27a912a2016-03-07 17:52:14 -07003831 if (!strcmp(funcName, "vkDestroyPipeline"))
3832 return (PFN_vkVoidFunction)vkDestroyPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003833 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003834 return (PFN_vkVoidFunction)vkCreatePipelineLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07003835 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
3836 return (PFN_vkVoidFunction)vkDestroyPipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003837 if (!strcmp(funcName, "vkCreateSampler"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003838 return (PFN_vkVoidFunction)vkCreateSampler;
Dustin Graves27a912a2016-03-07 17:52:14 -07003839 if (!strcmp(funcName, "vkDestroySampler"))
3840 return (PFN_vkVoidFunction)vkDestroySampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003841 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003842 return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07003843 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
3844 return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003845 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003846 return (PFN_vkVoidFunction)vkCreateDescriptorPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07003847 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
3848 return (PFN_vkVoidFunction)vkDestroyDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003849 if (!strcmp(funcName, "vkResetDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003850 return (PFN_vkVoidFunction)vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003851 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003852 return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003853 if (!strcmp(funcName, "vkCmdSetViewport"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003854 return (PFN_vkVoidFunction)vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003855 if (!strcmp(funcName, "vkCmdSetScissor"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003856 return (PFN_vkVoidFunction)vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003857 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003858 return (PFN_vkVoidFunction)vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003859 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003860 return (PFN_vkVoidFunction)vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003861 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003862 return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003863 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003864 return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003865 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003866 return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003867 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003868 return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003869 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003870 return (PFN_vkVoidFunction)vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003871 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003872 return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003873 if (!strcmp(funcName, "vkFreeCommandBuffers"))
3874 return (PFN_vkVoidFunction)vkFreeCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003875 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003876 return (PFN_vkVoidFunction)vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003877 if (!strcmp(funcName, "vkEndCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003878 return (PFN_vkVoidFunction)vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003879 if (!strcmp(funcName, "vkResetCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003880 return (PFN_vkVoidFunction)vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003881 if (!strcmp(funcName, "vkCmdBindPipeline"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003882 return (PFN_vkVoidFunction)vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003883 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003884 return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003885 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003886 return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003887 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003888 return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003889 if (!strcmp(funcName, "vkCmdDraw"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003890 return (PFN_vkVoidFunction)vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003891 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003892 return (PFN_vkVoidFunction)vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003893 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003894 return (PFN_vkVoidFunction)vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003895 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003896 return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003897 if (!strcmp(funcName, "vkCmdDispatch"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003898 return (PFN_vkVoidFunction)vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003899 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003900 return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003901 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003902 return (PFN_vkVoidFunction)vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003903 if (!strcmp(funcName, "vkCmdCopyImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003904 return (PFN_vkVoidFunction)vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003905 if (!strcmp(funcName, "vkCmdBlitImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003906 return (PFN_vkVoidFunction)vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003907 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003908 return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003909 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003910 return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003911 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003912 return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003913 if (!strcmp(funcName, "vkCmdFillBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003914 return (PFN_vkVoidFunction)vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003915 if (!strcmp(funcName, "vkCmdClearColorImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003916 return (PFN_vkVoidFunction)vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003917 if (!strcmp(funcName, "vkCmdResolveImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003918 return (PFN_vkVoidFunction)vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003919 if (!strcmp(funcName, "vkCmdSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003920 return (PFN_vkVoidFunction)vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003921 if (!strcmp(funcName, "vkCmdResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003922 return (PFN_vkVoidFunction)vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003923 if (!strcmp(funcName, "vkCmdWaitEvents"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003924 return (PFN_vkVoidFunction)vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003925 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003926 return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003927 if (!strcmp(funcName, "vkCmdBeginQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003928 return (PFN_vkVoidFunction)vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003929 if (!strcmp(funcName, "vkCmdEndQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003930 return (PFN_vkVoidFunction)vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003931 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003932 return (PFN_vkVoidFunction)vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003933 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003934 return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003935 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003936 return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003937 if (!strcmp(funcName, "vkCreateFramebuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003938 return (PFN_vkVoidFunction)vkCreateFramebuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07003939 if (!strcmp(funcName, "vkDestroyFramebuffer"))
3940 return (PFN_vkVoidFunction)vkDestroyFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003941 if (!strcmp(funcName, "vkCreateRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003942 return (PFN_vkVoidFunction)vkCreateRenderPass;
Dustin Graves27a912a2016-03-07 17:52:14 -07003943 if (!strcmp(funcName, "vkDestroyRenderPass"))
3944 return (PFN_vkVoidFunction)vkDestroyRenderPass;
3945 if (!strcmp(funcName, "vkGetRenderAreaGranularity"))
3946 return (PFN_vkVoidFunction)vkGetRenderAreaGranularity;
3947 if (!strcmp(funcName, "vkCreateCommandPool"))
3948 return (PFN_vkVoidFunction)vkCreateCommandPool;
3949 if (!strcmp(funcName, "vkDestroyCommandPool"))
3950 return (PFN_vkVoidFunction)vkDestroyCommandPool;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003951 if (!strcmp(funcName, "vkResetCommandPool"))
3952 return (PFN_vkVoidFunction)vkResetCommandPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003953 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003954 return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08003955 if (!strcmp(funcName, "vkCmdNextSubpass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003956 return (PFN_vkVoidFunction)vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06003957
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003958 if (device == NULL) {
3959 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003960 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003961
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003962 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003963 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003964 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003965}
3966
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003967VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003968 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003969 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003970 if (!strcmp(funcName, "vkCreateInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003971 return (PFN_vkVoidFunction)vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003972 if (!strcmp(funcName, "vkDestroyInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003973 return (PFN_vkVoidFunction)vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003974 if (!strcmp(funcName, "vkCreateDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003975 return (PFN_vkVoidFunction)vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003976 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003977 return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003978 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003979 return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003980 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003981 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06003982 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003983 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06003984 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003985 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06003986 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003987 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06003988 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003989 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06003990 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003991 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06003992
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003993 if (instance == NULL) {
3994 return NULL;
3995 }
3996
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003997 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003998
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003999 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004000 if (fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004001 return fptr;
4002
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004003 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004004 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004005 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004006}