blob: d556c3c8fe9a85fe87168aec3a39270e13266df6 [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
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060049using namespace parameter_validation;
50
Cody Northrop55443ef2015-09-28 15:09:32 -060051struct layer_data {
Jeremy Hayes99a96322015-06-26 12:48:09 -060052 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070053 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060054
Ian Elliotted6b5ac2016-04-28 09:08:13 -060055 // The following are for keeping track of the temporary callbacks that can
56 // be used in vkCreateInstance and vkDestroyInstance:
57 uint32_t num_tmp_callbacks;
58 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
59 VkDebugReportCallbackEXT *tmp_callbacks;
60
Jon Ashburn5484e0c2016-03-08 17:48:44 -070061 // TODO: Split instance/device structs
62 // Device Data
63 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060064 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
65
Ian Elliotted6b5ac2016-04-28 09:08:13 -060066 layer_data() : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr){};
Cody Northrop55443ef2015-09-28 15:09:32 -060067};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050068
Jon Ashburn5484e0c2016-03-08 17:48:44 -070069static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060070static device_table_map pc_device_table_map;
71static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060072
Jeremy Hayes99a96322015-06-26 12:48:09 -060073// "my instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070074debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060075 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060076 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060077#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060078 fprintf(stderr, "MID: map: 0x%p, object: 0x%p, key: 0x%p, data: 0x%p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060079#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060080 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060081
82 return data->report_data;
83}
84
85// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070086debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060087 dispatch_key key = get_dispatch_key(object);
88 layer_data *data = get_my_data_ptr(key, layer_data_map);
89#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060090 fprintf(stderr, "MDD: map: 0x%p, object: 0x%p, key: 0x%p, data: 0x%p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060091#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060092 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060093 return data->report_data;
94}
95
Mark Lobodzinski739391a2016-03-17 15:08:18 -060096static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060097
Mark Lobodzinski739391a2016-03-17 15:08:18 -060098 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -060099}
100
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700101VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
102vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
103 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700104 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700105 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600106
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700107 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700108 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
109 result = layer_create_msg_callback(data->report_data, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600110 }
111
112 return result;
113}
114
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700115VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,
116 VkDebugReportCallbackEXT msgCallback,
117 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700118 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700119 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600120
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700121 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700122 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600123}
124
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700125VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
126vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
127 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700128 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
129 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700130}
131
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700132static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600133
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700134VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
135vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700136 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600137}
138
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700139static const VkLayerProperties pc_global_layers[] = {{
Jon Ashburndc9111c2016-03-22 12:57:13 -0600140 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700141}};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700142
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700143VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
144vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
145 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600146}
147
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700148VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
149 const char *pLayerName, uint32_t *pCount,
150 VkExtensionProperties *pProperties) {
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600151 /* parameter_validation does not have any physical device extensions */
Jon Ashburn751c4842015-11-02 17:37:20 -0700152 if (pLayerName == NULL) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700153 return get_dispatch_table(pc_instance_table_map, physicalDevice)
154 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Jon Ashburn751c4842015-11-02 17:37:20 -0700155 } else {
156 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
157 }
Jeremy Hayesad367152015-04-17 10:36:53 -0600158}
159
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700160VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
161vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -0700162
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600163 /* parameter_validation's physical device layers are the same as global */
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700164 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600165}
Jeremy Hayes99a96322015-06-26 12:48:09 -0600166
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600168 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700169 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
170 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
171 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
172 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
173 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 -0700174 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700175 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600176 return false;
177 }
178
179 return true;
180}
181
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700182static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
183 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600184 return "unrecognized enumerator";
185 }
186
187 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700188 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600189 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
190 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700191 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600192 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
193 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700194 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600195 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
196 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700197 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600198 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
199 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700200 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600201 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
202 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700203 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600204 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
205 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700206 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600207 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
208 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700209 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600210 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
211 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700212 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600213 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
214 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700215 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600216 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
217 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700218 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800219 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600220 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700221 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800222 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600223 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700224 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700225 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
226 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600227
228 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700229 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600230 enumeratorString += string;
231
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700232 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600233 enumeratorString += '|';
234 }
235 }
236
237 return enumeratorString;
238}
239
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700240static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
241 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
242 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
243 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
244 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
245 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600246 return false;
247 }
248
249 return true;
250}
251
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700252static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
253 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600254 return "unrecognized enumerator";
255 }
256
257 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700258 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600259 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
260 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700261 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600262 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600263 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700264 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600265 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
266 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700267 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600268 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
269 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700270 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600271 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
272 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700273 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800274 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600275 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700276 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600277 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
278 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700279 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800280 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600281 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600282
283 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700284 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600285 enumeratorString += string;
286
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700287 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600288 enumeratorString += '|';
289 }
290 }
291
292 return enumeratorString;
293}
294
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700295static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
296 VkQueueFlagBits allFlags =
297 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
298 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600299 return false;
300 }
301
302 return true;
303}
304
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700305static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
306 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600307 return "unrecognized enumerator";
308 }
309
310 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700311 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800312 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600313 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700314 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600315 strings.push_back("VK_QUEUE_COMPUTE_BIT");
316 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700317 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800318 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600319 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700320 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600321 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
322 }
323
324 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700325 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600326 enumeratorString += string;
327
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700328 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600329 enumeratorString += '|';
330 }
331 }
332
333 return enumeratorString;
334}
335
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700336static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
337 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
338 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
339 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
340 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600341 return false;
342 }
343
344 return true;
345}
346
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700347static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
348 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600349 return "unrecognized enumerator";
350 }
351
352 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700353 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600354 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
355 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700356 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800357 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600358 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700359 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600360 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
361 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700362 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800363 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600364 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700365 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800366 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600367 }
368
369 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700370 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600371 enumeratorString += string;
372
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700373 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600374 enumeratorString += '|';
375 }
376 }
377
378 return enumeratorString;
379}
380
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700381static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700382 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700383 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600384 return false;
385 }
386
387 return true;
388}
389
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700390static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
391 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600392 return "unrecognized enumerator";
393 }
394
395 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700396 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800397 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600398 }
399
400 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700401 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600402 enumeratorString += string;
403
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700404 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600405 enumeratorString += '|';
406 }
407 }
408
409 return enumeratorString;
410}
411
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700412static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
413 VkSparseImageFormatFlagBits allFlags =
414 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
415 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
416 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600417 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600418 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600419
420 return true;
421}
422
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700423static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
424 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600425 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600426 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600427
428 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700429 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800430 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600431 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700432 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800433 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600434 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700435 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800436 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600437 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600438
439 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700440 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600441 enumeratorString += string;
442
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700443 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600444 enumeratorString += '|';
445 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600446 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600447
448 return enumeratorString;
449}
450
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700451static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700452 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700453 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600454 return false;
455 }
456
457 return true;
458}
459
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700460static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
461 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600462 return "unrecognized enumerator";
463 }
464
465 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700466 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600467 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
468 }
469
470 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700471 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600472 enumeratorString += string;
473
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700474 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600475 enumeratorString += '|';
476 }
477 }
478
479 return enumeratorString;
480}
481
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700482static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
483 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
484 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
485 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
486 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
487 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600488 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
489 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
490 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700491 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600492 return false;
493 }
494
495 return true;
496}
497
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700498static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
499 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600500 return "unrecognized enumerator";
501 }
502
503 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700504 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700505 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600506 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700507 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700508 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600509 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700510 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700511 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600512 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700513 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700514 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600515 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700516 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700517 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600518 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700519 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700520 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600521 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700522 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700523 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600524 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700525 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700526 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600527 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700528 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700529 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600530 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700531 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700532 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600533 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700534 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700535 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600536 }
537
538 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700539 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600540 enumeratorString += string;
541
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700542 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600543 enumeratorString += '|';
544 }
545 }
546
547 return enumeratorString;
548}
549
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700550static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
551 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
552 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
553 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600554 return false;
555 }
556
557 return true;
558}
559
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700560static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
561 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600562 return "unrecognized enumerator";
563 }
564
565 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700566 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600567 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
568 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700569 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600570 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
571 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700572 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600573 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
574 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700575 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600576 strings.push_back("VK_QUERY_RESULT_64_BIT");
577 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600578
579 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700580 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600581 enumeratorString += string;
582
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700583 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600584 enumeratorString += '|';
585 }
586 }
587
588 return enumeratorString;
589}
590
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700591static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
592 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
593 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
594 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
595 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
596 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600597 return false;
598 }
599
600 return true;
601}
602
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700603static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
604 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600605 return "unrecognized enumerator";
606 }
607
608 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700609 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600610 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
611 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700612 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600613 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
614 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700615 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600616 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
617 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700618 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600619 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
620 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700621 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600622 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
623 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700624 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800625 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600626 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700627 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600628 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
629 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700630 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800631 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600632 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700633 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600634 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
635 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600636
637 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700638 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600639 enumeratorString += string;
640
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700641 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600642 enumeratorString += '|';
643 }
644 }
645
646 return enumeratorString;
647}
648
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700649static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
650 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
651 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
652 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600653 return false;
654 }
655
656 return true;
657}
658
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700659static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
660 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600661 return "unrecognized enumerator";
662 }
663
664 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700665 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600666 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
667 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700668 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600669 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
670 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700671 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600672 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600673 }
674
675 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700676 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600677 enumeratorString += string;
678
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700679 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600680 enumeratorString += '|';
681 }
682 }
683
684 return enumeratorString;
685}
686
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700687static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
688 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
689 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
690 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
691 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600692 return false;
693 }
694
695 return true;
696}
697
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700698static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
699 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600700 return "unrecognized enumerator";
701 }
702
703 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700704 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600705 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
706 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700707 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600708 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
709 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700710 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600711 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
712 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700713 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600714 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
715 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700716 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600717 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600718 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600719
720 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700721 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600722 enumeratorString += string;
723
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700724 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600725 enumeratorString += '|';
726 }
727 }
728
729 return enumeratorString;
730}
731
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700732static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
733 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
734 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
735 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600736 return false;
737 }
738
739 return true;
740}
741
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700742static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
743 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600744 return "unrecognized enumerator";
745 }
746
747 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700748 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800749 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600750 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700751 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800752 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600753 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700754 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800755 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600756 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700757 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800758 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600759 }
760
761 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700762 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600763 enumeratorString += string;
764
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700765 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600766 enumeratorString += '|';
767 }
768 }
769
770 return enumeratorString;
771}
772
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700773static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
774 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
775 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
776 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600777 return false;
778 }
779
780 return true;
781}
782
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700783static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
784 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600785 return "unrecognized enumerator";
786 }
787
788 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700789 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600790 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
791 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700792 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600793 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
794 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700795 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600796 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600797 }
798
799 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700800 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600801 enumeratorString += string;
802
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700803 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600804 enumeratorString += '|';
805 }
806 }
807
808 return enumeratorString;
809}
810
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700811static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
812 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
813 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
814 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
815 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600816 return false;
817 }
818
819 return true;
820}
821
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700822static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
823 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600824 return "unrecognized enumerator";
825 }
826
827 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700828 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600829 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600830 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700831 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600832 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600833 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700834 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600835 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
836 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700837 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600838 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
839 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700840 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600841 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600842 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700843 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600844 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600845 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700846 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600847 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600848 }
849
850 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700851 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600852 enumeratorString += string;
853
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700854 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600855 enumeratorString += '|';
856 }
857 }
858
859 return enumeratorString;
860}
861
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700862static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800863 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700864 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
865 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
866 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
867 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
868 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
869 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 -0700870 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700871 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600872 return false;
873 }
874
875 return true;
876}
877
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700878static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
879 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600880 return "unrecognized enumerator";
881 }
882
883 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700884 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800885 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
886 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700887 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800888 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600889 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700890 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600891 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600892 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700893 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600894 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600895 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700896 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600897 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600898 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700899 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700900 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600901 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700902 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600903 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600904 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700905 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600906 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600907 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700908 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600909 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600910 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700911 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600912 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600913 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700914 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600915 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
916 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700917 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600918 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
919 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700920 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700921 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600922 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700923 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600924 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
925 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700926 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600927 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
928 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700929 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600930 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
931 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700932 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600933 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600934 }
935
936 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700937 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600938 enumeratorString += string;
939
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700940 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600941 enumeratorString += '|';
942 }
943 }
944
945 return enumeratorString;
946}
947
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700948static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800949 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700950 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
951 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
952 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
953 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
954 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 +0800955
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700956 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600957 return false;
958 }
959
960 return true;
961}
962
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700963static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
964 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600965 return "unrecognized enumerator";
966 }
967
968 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700969 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800970 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600971 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700972 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800973 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600974 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700975 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800976 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600977 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700978 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800979 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600980 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700981 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800982 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600983 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700984 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800985 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600986 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700987 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800988 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600989 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700990 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800991 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600992 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700993 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800994 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600995 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700996 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800997 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600998 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700999 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001000 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001001 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001002 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001003 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001004 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001005 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001006 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001007 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001008 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001009 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001010 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001011 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001012 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001013 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001014 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001015 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001016 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001017 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001018 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001019 }
1020
1021 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001022 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001023 enumeratorString += string;
1024
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001025 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001026 enumeratorString += '|';
1027 }
1028 }
1029
1030 return enumeratorString;
1031}
1032
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001033static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1034 VkCommandPoolCreateFlagBits allFlags =
1035 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1036 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001037 return false;
1038 }
1039
1040 return true;
1041}
1042
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001043static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1044 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001045 return "unrecognized enumerator";
1046 }
1047
1048 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001049 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001050 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001051 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001052 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001053 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001054 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001055
1056 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001057 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001058 enumeratorString += string;
1059
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001060 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001061 enumeratorString += '|';
1062 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001063 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001064
1065 return enumeratorString;
1066}
1067
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001068static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001069 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001070 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001071 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001072 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001073
1074 return true;
1075}
1076
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001077static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1078 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001079 return "unrecognized enumerator";
1080 }
1081
1082 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001083 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001084 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001085 }
1086
1087 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001088 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001089 enumeratorString += string;
1090
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001091 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001092 enumeratorString += '|';
1093 }
1094 }
1095
1096 return enumeratorString;
1097}
1098
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001099static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1100 VkCommandBufferUsageFlags allFlags =
1101 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1102 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1103 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001104 return false;
1105 }
1106
1107 return true;
1108}
1109
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001110static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1111 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001112 return "unrecognized enumerator";
1113 }
1114
1115 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001116 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001117 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001118 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001119 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001120 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001121 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001122 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001123 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001124 }
1125
1126 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001127 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001128 enumeratorString += string;
1129
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001130 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001131 enumeratorString += '|';
1132 }
1133 }
1134
1135 return enumeratorString;
1136}
1137
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001138static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001139 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001140 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001141 return false;
1142 }
1143
1144 return true;
1145}
1146
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001147static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1148 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001149 return "unrecognized enumerator";
1150 }
1151
1152 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001153 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001154 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001155 }
1156
1157 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001158 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001159 enumeratorString += string;
1160
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001161 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001162 enumeratorString += '|';
1163 }
1164 }
1165
1166 return enumeratorString;
1167}
1168
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001169static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1170 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1171 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1172 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001173 return false;
1174 }
1175
1176 return true;
1177}
1178
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001179static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1180 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001181 return "unrecognized enumerator";
1182 }
1183
1184 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001185 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001186 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1187 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001188 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001189 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1190 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001191 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001192 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1193 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001194 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001195 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1196 }
1197
1198 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001199 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001200 enumeratorString += string;
1201
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001202 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001203 enumeratorString += '|';
1204 }
1205 }
1206
1207 return enumeratorString;
1208}
1209
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001210static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001211 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001212 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001213 return false;
1214 }
1215
1216 return true;
1217}
1218
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001219static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1220 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001221 return "unrecognized enumerator";
1222 }
1223
1224 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001225 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001226 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001227 }
1228
1229 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001230 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001231 enumeratorString += string;
1232
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001233 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001234 enumeratorString += '|';
1235 }
1236 }
1237
1238 return enumeratorString;
1239}
1240
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001241static const int MaxParamCheckerStringLength = 256;
1242
Dustin Graves080069b2016-04-05 13:48:15 -06001243static bool validate_string(debug_report_data *report_data, const char *apiName, const char *stringName,
1244 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001245 assert(apiName != nullptr);
1246 assert(stringName != nullptr);
1247 assert(validateString != nullptr);
1248
Dustin Graves080069b2016-04-05 13:48:15 -06001249 bool skipCall = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001250
1251 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1252
1253 if (result == VK_STRING_ERROR_NONE) {
1254 return skipCall;
1255 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001256 skipCall =
1257 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1258 "PARAMCHECK", "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001259 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001260 skipCall =
1261 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1262 "PARAMCHECK", "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001263 }
1264 return skipCall;
1265}
1266
Dustin Gravesde628532016-04-21 16:30:17 -06001267static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1268 uint32_t index) {
1269 assert(device_data != nullptr);
1270 debug_report_data *report_data = device_data->report_data;
1271 bool skip_call = false;
1272
1273 if (index == VK_QUEUE_FAMILY_IGNORED) {
1274 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1275 "PARAMCHECK", "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
1276 } else {
1277 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1278 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1279 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1280 "PARAMCHECK", "%s: %s (%d) must be one of the indices specified when the device was created, via "
1281 "the VkDeviceQueueCreateInfo structure.",
1282 function_name, parameter_name, index);
1283 return false;
1284 }
1285 }
1286
1287 return skip_call;
1288}
1289
1290static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1291 const uint32_t count, const uint32_t *indices) {
1292 assert(device_data != nullptr);
1293 debug_report_data *report_data = device_data->report_data;
1294 bool skip_call = false;
1295
1296 if (indices != nullptr) {
1297 for (uint32_t i = 0; i < count; i++) {
1298 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
1299 skip_call |=
1300 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1301 "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
1302 } else {
1303 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1304 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1305 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1306 "PARAMCHECK", "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1307 "created, via the VkDeviceQueueCreateInfo structure.",
1308 function_name, parameter_name, i, indices[i]);
1309 return false;
1310 }
1311 }
1312 }
1313 }
1314
1315 return skip_call;
1316}
1317
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001318VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1319vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001320 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001321
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001322 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001323 assert(chain_info != nullptr);
1324 assert(chain_info->u.pLayerInfo != nullptr);
1325
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001326 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1327 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001328 if (fpCreateInstance == NULL) {
1329 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001330 }
1331
Dustin Graves842621d2016-03-03 14:17:08 -07001332 // Advance the link info for the next element on the chain
1333 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1334
1335 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001336
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001337 if (result == VK_SUCCESS) {
1338 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1339 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001340
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001341 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001342
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001343 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1344 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001345
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001346 // Look for one or more debug report create info structures
1347 // and setup a callback(s) for each one found.
1348 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1349 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1350 if (my_instance_data->num_tmp_callbacks > 0) {
1351 // Setup the temporary callback(s) here to catch early issues:
1352 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1353 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1354 // Failure of setting up one or more of the callback.
1355 // Therefore, clean up and don't use those callbacks:
1356 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1357 my_instance_data->num_tmp_callbacks = 0;
1358 }
1359 }
1360 }
1361
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001362 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001363
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001364 // Ordinarily we'd check these before calling down the chain, but none of the layer
1365 // support is in place until now, if we survive we can report the issue now.
1366 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001367
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001368 if (pCreateInfo->pApplicationInfo) {
1369 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1370 validate_string(my_instance_data->report_data, "vkCreateInstance",
1371 "pCreateInfo->VkApplicationInfo->pApplicationName",
1372 pCreateInfo->pApplicationInfo->pApplicationName);
1373 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001374
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001375 if (pCreateInfo->pApplicationInfo->pEngineName) {
1376 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1377 pCreateInfo->pApplicationInfo->pEngineName);
1378 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001379 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001380
1381 // Disable the tmp callbacks:
1382 if (my_instance_data->num_tmp_callbacks > 0) {
1383 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1384 my_instance_data->tmp_callbacks);
1385 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001386 }
1387
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001388 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001389}
1390
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001391VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001392 // Grab the key before the instance is destroyed.
1393 dispatch_key key = get_dispatch_key(instance);
Dustin Graves080069b2016-04-05 13:48:15 -06001394 bool skipCall = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001395 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001396 assert(my_data != NULL);
1397
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001398 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1399 bool callback_setup = false;
1400 if (my_data->num_tmp_callbacks > 0) {
1401 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1402 my_data->tmp_callbacks)) {
1403 callback_setup = true;
1404 }
1405 }
1406
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001407 skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001408
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001409 // Disable and cleanup the temporary callback(s):
1410 if (callback_setup) {
1411 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1412 }
1413 if (my_data->num_tmp_callbacks > 0) {
1414 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1415 my_data->num_tmp_callbacks = 0;
1416 }
1417
Dustin Graves080069b2016-04-05 13:48:15 -06001418 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001419 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001420 pTable->DestroyInstance(instance, pAllocator);
1421
1422 // Clean up logging callback, if any
1423 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001424 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1425 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001426 my_data->logging_callback.pop_back();
1427 }
1428
1429 layer_debug_report_destroy_instance(mid(instance));
1430 layer_data_map.erase(pTable);
1431
1432 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001433 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001434 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001435}
1436
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001437VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1438vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) {
1439 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
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(instance), 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_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
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 result = get_dispatch_table(pc_instance_table_map, instance)
1448 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001449
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001450 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001451 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001452
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001453 return result;
1454}
1455
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001456VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1457vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Dustin Graves080069b2016-04-05 13:48:15 -06001458 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001459 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001460 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001461
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001462 skipCall |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001463
Dustin Graves080069b2016-04-05 13:48:15 -06001464 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001465 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001466 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001467}
1468
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001469VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1470vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001471 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001472 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001473 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001474
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001475 skipCall |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001476
Dustin Graves080069b2016-04-05 13:48:15 -06001477 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001478 get_dispatch_table(pc_instance_table_map, physicalDevice)
1479 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001480 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001481}
1482
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001483VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1484vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1485 VkImageUsageFlags usage, VkImageCreateFlags flags,
1486 VkImageFormatProperties *pImageFormatProperties) {
1487 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001488 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001489 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001490 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001491
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001492 skipCall |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001493 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001494
Dustin Graves080069b2016-04-05 13:48:15 -06001495 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001496 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1497 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1498 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001499
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001500 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001501 }
Chia-I Wu17241042015-10-31 00:31:16 +08001502
1503 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001504}
1505
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001506VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1507vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001508 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001509 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001510 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001511
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001512 skipCall |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001513
Dustin Graves080069b2016-04-05 13:48:15 -06001514 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001515 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001516 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001517}
1518
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001519VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1520vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1521 VkQueueFamilyProperties *pQueueFamilyProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001522 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001523 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001524 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001525
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001526 skipCall |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001527 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001528
Dustin Graves080069b2016-04-05 13:48:15 -06001529 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001530 get_dispatch_table(pc_instance_table_map, physicalDevice)
1531 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001532 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001533}
1534
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001535VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1536vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001537 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001538 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001539 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001540
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001541 skipCall |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001542
Dustin Graves080069b2016-04-05 13:48:15 -06001543 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001544 get_dispatch_table(pc_instance_table_map, physicalDevice)
1545 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001546 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001547}
1548
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001549void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1550 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001551 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001552
1553 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1554 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1555 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001556 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1557 INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001558 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1559 "structure.",
1560 i);
1561 } else {
1562 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001563 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001564
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001565 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1566 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1567 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1568 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001569 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
1570 __LINE__, INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001571 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1572 "between 0 and 1. Actual value is %f",
1573 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1574 }
1575 }
1576 }
1577
1578 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1579 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001580 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1581 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001582 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1583 "of queue families.",
1584 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001585 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1586 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1587 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001588 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1589 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001590 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1591 "queues for the given family index.",
1592 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001593 }
Michael Lentine774704f2016-01-27 13:36:46 -06001594 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001595 }
1596}
1597
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001598void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001599 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001600
1601 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1602 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1603 my_device_data->queueFamilyIndexMap.insert(
1604 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1605 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001606 }
1607}
1608
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001609VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice,
1610 const VkDeviceCreateInfo *pCreateInfo,
1611 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001612 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001613 * NOTE: We do not validate physicalDevice or any dispatchable
1614 * object as the first parameter. We couldn't get here if it was wrong!
1615 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001616
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001617 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001618 bool skipCall = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001619 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001620 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001621
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001622 skipCall |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001623
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001624 if (pCreateInfo != NULL) {
1625 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001626 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001627 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1628 pCreateInfo->ppEnabledLayerNames[i]);
1629 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001630 }
Michael Lentine774704f2016-01-27 13:36:46 -06001631
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001632 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001633 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001634 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1635 pCreateInfo->ppEnabledExtensionNames[i]);
1636 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001637 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001638 }
1639
Dustin Graves080069b2016-04-05 13:48:15 -06001640 if (!skipCall) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001641 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001642 assert(chain_info != nullptr);
1643 assert(chain_info->u.pLayerInfo != nullptr);
1644
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001645 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1646 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001647 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001648 if (fpCreateDevice == NULL) {
1649 return VK_ERROR_INITIALIZATION_FAILED;
1650 }
1651
1652 // Advance the link info for the next element on the chain
1653 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1654
1655 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001656
1657 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1658
1659 if (result == VK_SUCCESS) {
1660 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1661 assert(my_device_data != nullptr);
1662
1663 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1664 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1665
1666 uint32_t count;
1667 get_dispatch_table(pc_instance_table_map, physicalDevice)
1668 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
1669 std::vector<VkQueueFamilyProperties> properties(count);
1670 get_dispatch_table(pc_instance_table_map, physicalDevice)
1671 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
1672
1673 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1674 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001675 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001676 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001677
Jeremy Hayes99a96322015-06-26 12:48:09 -06001678 return result;
1679}
1680
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001681VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001682 dispatch_key key = get_dispatch_key(device);
Dustin Graves080069b2016-04-05 13:48:15 -06001683 bool skipCall = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001684 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1685 assert(my_data != NULL);
1686
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001687 skipCall |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001688
Dustin Graves080069b2016-04-05 13:48:15 -06001689 if (!skipCall) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001690 layer_debug_report_destroy_device(device);
1691
Jeremy Hayes99a96322015-06-26 12:48:09 -06001692#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001693 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001694#endif
1695
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001696 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001697 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001698 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001699 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001700}
1701
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001702bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001703 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001704 assert(my_device_data != nullptr);
1705
Dustin Gravesde628532016-04-21 16:30:17 -06001706 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001707
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001708 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001709 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001710 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1711 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001712 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1713 "was created.",
1714 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001715 return false;
1716 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001717
Michael Lentinebdf744f2016-01-27 15:43:43 -06001718 return true;
1719}
1720
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001721VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1722vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001723 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001724 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001725 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001726
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001727 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001728
Dustin Graves080069b2016-04-05 13:48:15 -06001729 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001730 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1731
1732 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001733 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001734}
1735
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001736VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1737vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
1738 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001739 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001740 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001741 assert(my_data != NULL);
1742
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001743 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001744
Dustin Graves080069b2016-04-05 13:48:15 -06001745 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001746 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1747
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001748 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001749 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001750
Jeremy Hayes99a96322015-06-26 12:48:09 -06001751 return result;
1752}
1753
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001754VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001755 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1756 assert(my_data != NULL);
1757
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001758 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001759
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001760 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001761
1762 return result;
1763}
1764
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001765VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001766 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1767 assert(my_data != NULL);
1768
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001769 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001770
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001771 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001772
1773 return result;
1774}
1775
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001776VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1777 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1778 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001779 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001780 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001781 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001782
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001783 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001784
Dustin Graves080069b2016-04-05 13:48:15 -06001785 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001786 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1787
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001788 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001789 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001790
1791 return result;
1792}
1793
Dustin Graves27a912a2016-03-07 17:52:14 -07001794VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001795vkFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001796 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001797 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001798 assert(my_data != NULL);
1799
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001800 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001801
Dustin Graves080069b2016-04-05 13:48:15 -06001802 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001803 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001804 }
1805}
1806
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001807VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1808vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
1809 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001810 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001811 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001812 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001813
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001814 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001815
Dustin Graves080069b2016-04-05 13:48:15 -06001816 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001817 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1818
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001819 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001820 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001821
1822 return result;
1823}
1824
Dustin Graves20fd66f2016-04-18 18:33:21 -06001825VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUnmapMemory(VkDevice device, VkDeviceMemory memory) {
1826 bool skipCall = false;
1827 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1828 assert(my_data != NULL);
1829
1830 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1831
1832 if (!skipCall) {
1833 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1834 }
1835}
1836
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001837VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1838vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1839 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001840 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001841 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001842 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001843
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001844 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001845
Dustin Graves080069b2016-04-05 13:48:15 -06001846 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001847 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1848
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001849 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001850 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001851
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001852 return result;
1853}
1854
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001855VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1856vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1857 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001858 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001859 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001860 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001861
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001862 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001863
Dustin Graves080069b2016-04-05 13:48:15 -06001864 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001865 result =
1866 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001867
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001868 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001869 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001870
Tony Barbourb1250542015-04-16 19:23:13 -06001871 return result;
1872}
1873
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001874VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1875vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001876 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001877 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001878 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001879
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001880 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001881
Dustin Graves080069b2016-04-05 13:48:15 -06001882 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001883 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001884 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001885}
1886
Dustin Graves20fd66f2016-04-18 18:33:21 -06001887VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1888 VkDeviceSize memoryOffset) {
1889 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1890 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001891 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1892 assert(my_data != NULL);
1893
Dustin Graves20fd66f2016-04-18 18:33:21 -06001894 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001895
Dustin Graves20fd66f2016-04-18 18:33:21 -06001896 if (!skipCall) {
1897 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1898
1899 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1900 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001901
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001902 return result;
1903}
1904
Dustin Graves20fd66f2016-04-18 18:33:21 -06001905VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1906 VkDeviceSize memoryOffset) {
1907 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1908 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001909 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1910 assert(my_data != NULL);
1911
Dustin Graves20fd66f2016-04-18 18:33:21 -06001912 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001913
Dustin Graves20fd66f2016-04-18 18:33:21 -06001914 if (!skipCall) {
1915 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1916
1917 validate_result(my_data->report_data, "vkBindImageMemory", result);
1918 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001919
1920 return result;
1921}
1922
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001923VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1924vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001925 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001926 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001927 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001928
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001929 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001930
Dustin Graves080069b2016-04-05 13:48:15 -06001931 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001932 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001933 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001934}
1935
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001936VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1937vkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001938 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001939 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001940 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001941
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001942 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001943
Dustin Graves080069b2016-04-05 13:48:15 -06001944 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001945 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001946 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001947}
1948
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001949bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1950 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1951 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001952 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001953 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1954 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001955 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1956 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001957 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1958 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001959 return false;
1960 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001961 }
1962
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001963 return true;
1964}
1965
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001966VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1967vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1968 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
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(device), 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_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001974 pSparseMemoryRequirements);
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_device_table_map, device)
1978 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001979
1980 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1981 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001982}
1983
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001984bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1985 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1986 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001987 if (pProperties != nullptr) {
1988 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1989 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001990 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
1991 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001992 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
1993 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001994 return false;
1995 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001996 }
1997
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001998 return true;
1999}
2000
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002001VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2002vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2003 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2004 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06002005 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002006 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002007 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002008
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002009 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002010 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002011
Dustin Graves080069b2016-04-05 13:48:15 -06002012 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002013 get_dispatch_table(pc_instance_table_map, physicalDevice)
2014 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2015 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002016
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002017 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2018 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002019 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002020}
2021
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002022VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2023vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
2024 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002025 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002026 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002027 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002028
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002029 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002030
Dustin Graves080069b2016-04-05 13:48:15 -06002031 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002032 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2033
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002034 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002035 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002036
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002037 return result;
2038}
2039
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002040VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2041vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
2042 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002043 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002044 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002045 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002046
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002047 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002048
Dustin Graves080069b2016-04-05 13:48:15 -06002049 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002050 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2051
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002052 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002053 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002054
2055 return result;
2056}
2057
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002058VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002059 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002060 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002061 assert(my_data != NULL);
2062
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002063 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002064
Dustin Graves080069b2016-04-05 13:48:15 -06002065 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002066 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002067 }
2068}
2069
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002070VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
2071 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002072 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002073 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002074 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002075
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002076 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002077
Dustin Graves080069b2016-04-05 13:48:15 -06002078 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002079 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2080
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002081 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002082 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002083
2084 return result;
2085}
2086
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002087VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002088 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2089 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002090 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2091 assert(my_data != NULL);
2092
Dustin Graves20fd66f2016-04-18 18:33:21 -06002093 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002094
Dustin Graves20fd66f2016-04-18 18:33:21 -06002095 if (!skipCall) {
2096 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2097
2098 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2099 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002100
2101 return result;
2102}
2103
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002104VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2105vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
2106 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002107 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002108 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002109 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002110
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002111 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002112
Dustin Graves080069b2016-04-05 13:48:15 -06002113 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002114 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2115
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002116 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002117 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002118
2119 return result;
2120}
2121
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002122VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
2123 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2124 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002125 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002126 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002127 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002128
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002129 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002130
Dustin Graves080069b2016-04-05 13:48:15 -06002131 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002132 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2133
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002134 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002135 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002136
2137 return result;
2138}
2139
Dustin Graves27a912a2016-03-07 17:52:14 -07002140VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002141vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002142 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002143 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002144 assert(my_data != NULL);
2145
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002146 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002147
Dustin Graves080069b2016-04-05 13:48:15 -06002148 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002149 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002150 }
2151}
2152
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002153VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2154vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
2155 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002156 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002157 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002158 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002159
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002160 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002161
Dustin Graves080069b2016-04-05 13:48:15 -06002162 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002163 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2164
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002165 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002166 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002167
2168 return result;
2169}
2170
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002171VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002172 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002173 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002174 assert(my_data != NULL);
2175
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002176 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002177
Dustin Graves080069b2016-04-05 13:48:15 -06002178 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002179 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002180 }
2181}
2182
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002183VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002184 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2185 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002186 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2187 assert(my_data != NULL);
2188
Dustin Graves20fd66f2016-04-18 18:33:21 -06002189 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002190
Dustin Graves20fd66f2016-04-18 18:33:21 -06002191 if (!skipCall) {
2192 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2193
2194 validate_result(my_data->report_data, "vkGetEventStatus", result);
2195 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002196
2197 return result;
2198}
2199
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002200VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002201 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2202 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002203 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2204 assert(my_data != NULL);
2205
Dustin Graves20fd66f2016-04-18 18:33:21 -06002206 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002207
Dustin Graves20fd66f2016-04-18 18:33:21 -06002208 if (!skipCall) {
2209 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2210
2211 validate_result(my_data->report_data, "vkSetEvent", result);
2212 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002213
2214 return result;
2215}
2216
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002217VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002218 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2219 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002220 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2221 assert(my_data != NULL);
2222
Dustin Graves20fd66f2016-04-18 18:33:21 -06002223 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002224
Dustin Graves20fd66f2016-04-18 18:33:21 -06002225 if (!skipCall) {
2226 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2227
2228 validate_result(my_data->report_data, "vkResetEvent", result);
2229 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002230
2231 return result;
2232}
2233
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002234VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2235 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
2236 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002237 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002238 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002239 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002240
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002241 skipCall |= parameter_validation_vkCreateQueryPool(my_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002242
Dustin Graves080069b2016-04-05 13:48:15 -06002243 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002244 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2245
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002246 validate_result(my_data->report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002247 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002248
2249 return result;
2250}
2251
Dustin Graves27a912a2016-03-07 17:52:14 -07002252VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002253vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002254 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002255 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002256 assert(my_data != NULL);
2257
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002258 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002259
Dustin Graves080069b2016-04-05 13:48:15 -06002260 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002261 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002262 }
2263}
2264
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002265VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2266 uint32_t queryCount, size_t dataSize, void *pData,
2267 VkDeviceSize stride, VkQueryResultFlags flags) {
2268 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002269 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002270 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002271 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002272
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002273 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002274 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002275
Dustin Graves080069b2016-04-05 13:48:15 -06002276 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002277 result = get_dispatch_table(pc_device_table_map, device)
2278 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002279
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002280 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002281 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002282
2283 return result;
2284}
2285
Dustin Gravesde628532016-04-21 16:30:17 -06002286bool PreCreateBuffer(layer_data *device_data, const VkBufferCreateInfo *pCreateInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002287 if (pCreateInfo != nullptr) {
Dustin Graves29148ff2016-03-23 19:44:00 -06002288 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesde628532016-04-21 16:30:17 -06002289 validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2290 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002291 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002292 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002293
2294 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002295}
2296
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002297VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2298vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
2299 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002300 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002301 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002302 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002303
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002304 skipCall |= parameter_validation_vkCreateBuffer(my_data->report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002305
Dustin Graves080069b2016-04-05 13:48:15 -06002306 if (!skipCall) {
Dustin Gravesde628532016-04-21 16:30:17 -06002307 PreCreateBuffer(my_data, pCreateInfo);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002308
2309 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2310
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002311 validate_result(my_data->report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002312 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002313
2314 return result;
2315}
2316
Dustin Graves27a912a2016-03-07 17:52:14 -07002317VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002318vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002319 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002320 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002321 assert(my_data != NULL);
2322
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002323 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002324
Dustin Graves080069b2016-04-05 13:48:15 -06002325 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002326 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002327 }
2328}
2329
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002330VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2331 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
2332 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002333 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002334 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002335 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002336
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002337 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002338
Dustin Graves080069b2016-04-05 13:48:15 -06002339 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002340 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2341
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002342 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002343 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002344
2345 return result;
2346}
2347
Dustin Graves27a912a2016-03-07 17:52:14 -07002348VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002349vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002350 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002351 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002352 assert(my_data != NULL);
2353
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002354 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002355
Dustin Graves080069b2016-04-05 13:48:15 -06002356 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002357 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002358 }
2359}
2360
Dustin Gravesde628532016-04-21 16:30:17 -06002361bool PreCreateImage(layer_data *device_data, const VkImageCreateInfo *pCreateInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002362 if (pCreateInfo != nullptr) {
Dustin Graves29148ff2016-03-23 19:44:00 -06002363 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesde628532016-04-21 16:30:17 -06002364 validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2365 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002366 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002367 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002368
2369 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002370}
2371
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002372VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2373vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
2374 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002375 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002376 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002377 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002378
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002379 skipCall |= parameter_validation_vkCreateImage(my_data->report_data, pCreateInfo, pAllocator, pImage);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002380
Dustin Graves080069b2016-04-05 13:48:15 -06002381 if (!skipCall) {
Dustin Gravesde628532016-04-21 16:30:17 -06002382 PreCreateImage(my_data, pCreateInfo);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002383
2384 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2385
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002386 validate_result(my_data->report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002387 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002388
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002389 return result;
2390}
2391
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002392VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002393 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002394 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002395 assert(my_data != NULL);
2396
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002397 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002398
Dustin Graves080069b2016-04-05 13:48:15 -06002399 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002400 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002401 }
2402}
2403
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002404bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2405 if (pSubresource != nullptr) {
2406 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2407 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002408 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2409 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002410 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2411 return false;
2412 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002413 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002414
2415 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002416}
2417
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002418VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2419vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002420 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002421 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002422 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002423
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002424 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002425
Dustin Graves080069b2016-04-05 13:48:15 -06002426 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002427 PreGetImageSubresourceLayout(device, pSubresource);
2428
2429 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002430 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002431}
2432
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002433VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2434 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
2435 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002436 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002437 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002438 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002439
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002440 skipCall |= parameter_validation_vkCreateImageView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002441
Dustin Graves080069b2016-04-05 13:48:15 -06002442 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002443 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2444
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002445 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002446 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002447
2448 return result;
2449}
2450
Dustin Graves27a912a2016-03-07 17:52:14 -07002451VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002452vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002453 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002454 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002455 assert(my_data != NULL);
2456
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002457 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002458
Dustin Graves080069b2016-04-05 13:48:15 -06002459 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002460 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002461 }
2462}
2463
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002464VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2465 const VkAllocationCallbacks *pAllocator,
2466 VkShaderModule *pShaderModule) {
2467 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002468 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002469 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002470 assert(my_data != NULL);
2471
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002472 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002473
Dustin Graves080069b2016-04-05 13:48:15 -06002474 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002475 result =
2476 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002477
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002478 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002479 }
2480
Michael Lentine03d8e572015-09-15 14:59:14 -05002481 return result;
2482}
2483
Dustin Graves27a912a2016-03-07 17:52:14 -07002484VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002485vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002486 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002487 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002488 assert(my_data != NULL);
2489
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002490 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002491
Dustin Graves080069b2016-04-05 13:48:15 -06002492 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002493 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002494 }
2495}
2496
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002497VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2498 const VkAllocationCallbacks *pAllocator,
2499 VkPipelineCache *pPipelineCache) {
2500 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002501 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002502 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002503 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002504
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002505 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002506
Dustin Graves080069b2016-04-05 13:48:15 -06002507 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002508 result =
2509 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002510
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002511 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002512 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002513
2514 return result;
2515}
2516
Dustin Graves27a912a2016-03-07 17:52:14 -07002517VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002518vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002519 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002520 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002521 assert(my_data != NULL);
2522
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002523 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002524
Dustin Graves080069b2016-04-05 13:48:15 -06002525 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002526 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002527 }
2528}
2529
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002530VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2531vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
2532 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002533 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002534 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002535 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002536
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002537 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002538
Dustin Graves080069b2016-04-05 13:48:15 -06002539 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002540 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2541
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002542 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002543 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002544
2545 return result;
2546}
2547
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002548VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2549vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
2550 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002551 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002552 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002553 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002554
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002555 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002556
Dustin Graves080069b2016-04-05 13:48:15 -06002557 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002558 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2559
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002560 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002561 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002562
2563 return result;
2564}
2565
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002566bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002567 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2568
2569 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002570 if (pCreateInfos != nullptr) {
2571 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2572 if (pCreateInfos->basePipelineIndex != -1) {
2573 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002574 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2575 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002576 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2577 "pCreateInfos->flags "
2578 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2579 return false;
2580 }
2581 }
2582
2583 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2584 if (pCreateInfos->basePipelineIndex != -1) {
2585 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002586 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2587 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002588 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2589 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2590 "VK_NULL_HANDLE");
2591 return false;
2592 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002593 }
2594 }
2595
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002596 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002597 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002598 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2599 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002600 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2601 "unrecognized enumerator");
2602 return false;
2603 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002604 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002605
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002606 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002607 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002608 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002609 pCreateInfos[i].pStages[j].pName);
2610 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002611 }
2612
2613 return true;
2614}
2615
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002616VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2617vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2618 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2619 VkPipeline *pPipelines) {
2620 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002621 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002622 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002623 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002624
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002625 skipCall |= parameter_validation_vkCreateGraphicsPipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002626 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002627
Dustin Graves080069b2016-04-05 13:48:15 -06002628 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002629 PreCreateGraphicsPipelines(device, pCreateInfos);
2630
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002631 result = get_dispatch_table(pc_device_table_map, device)
2632 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002633
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002634 validate_result(my_data->report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002635 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002636
2637 return result;
2638}
2639
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002640bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002641 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2642
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002643 if (pCreateInfos != nullptr) {
2644 // TODO: Handle count!
2645 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002646 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002647 }
2648
2649 return true;
2650}
2651
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002652VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2653vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2654 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2655 VkPipeline *pPipelines) {
2656 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002657 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002658 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002659 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002660
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002661 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002662 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002663
Dustin Graves080069b2016-04-05 13:48:15 -06002664 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002665 PreCreateComputePipelines(device, pCreateInfos);
2666
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002667 result = get_dispatch_table(pc_device_table_map, device)
2668 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002669
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002670 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002671 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002672
2673 return result;
2674}
2675
Dustin Graves27a912a2016-03-07 17:52:14 -07002676VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002677vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002678 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002679 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002680 assert(my_data != NULL);
2681
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002682 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002683
Dustin Graves080069b2016-04-05 13:48:15 -06002684 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002685 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002686 }
2687}
2688
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002689VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2690vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2691 VkPipelineLayout *pPipelineLayout) {
2692 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002693 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002694 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002695 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002696
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002697 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002698
Dustin Graves080069b2016-04-05 13:48:15 -06002699 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002700 result =
2701 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002702
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002703 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002704 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002705
2706 return result;
2707}
2708
Dustin Graves27a912a2016-03-07 17:52:14 -07002709VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002710vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002711 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002712 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002713 assert(my_data != NULL);
2714
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002715 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002716
Dustin Graves080069b2016-04-05 13:48:15 -06002717 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002718 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002719 }
2720}
2721
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002722VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2723 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
2724 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002725 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002726 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002727 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002728
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002729 skipCall |= parameter_validation_vkCreateSampler(my_data->report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002730
Dustin Graves080069b2016-04-05 13:48:15 -06002731 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002732 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
2733
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002734 validate_result(my_data->report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002735 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002736
2737 return result;
2738}
2739
Dustin Graves27a912a2016-03-07 17:52:14 -07002740VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002741vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002742 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002743 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002744 assert(my_data != NULL);
2745
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002746 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002747
Dustin Graves080069b2016-04-05 13:48:15 -06002748 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002749 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002750 }
2751}
2752
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002753VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2754vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2755 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
2756 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002757 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002758 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002759 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002760
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002761 skipCall |= parameter_validation_vkCreateDescriptorSetLayout(my_data->report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002762
Dustin Graves080069b2016-04-05 13:48:15 -06002763 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002764 result =
2765 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002766
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002767 validate_result(my_data->report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002768 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002769
2770 return result;
2771}
2772
Dustin Graves27a912a2016-03-07 17:52:14 -07002773VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002774vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002775 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002776 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002777 assert(my_data != NULL);
2778
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002779 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002780
Dustin Graves080069b2016-04-05 13:48:15 -06002781 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002782 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002783 }
2784}
2785
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002786VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2787vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2788 VkDescriptorPool *pDescriptorPool) {
2789 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002790 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002791 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002792 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002793
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002794 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002795
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002796 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
2797
Dustin Graves080069b2016-04-05 13:48:15 -06002798 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002799 result =
2800 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002801
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002802 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002803 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002804
2805 return result;
2806}
2807
Dustin Graves27a912a2016-03-07 17:52:14 -07002808VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002809vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002810 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002811 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002812 assert(my_data != NULL);
2813
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002814 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002815
Dustin Graves080069b2016-04-05 13:48:15 -06002816 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002817 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002818 }
2819}
2820
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002821VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2822vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002823 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2824 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002825 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2826 assert(my_data != NULL);
2827
Dustin Graves20fd66f2016-04-18 18:33:21 -06002828 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002829
Dustin Graves20fd66f2016-04-18 18:33:21 -06002830 if (!skipCall) {
2831 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
2832
2833 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
2834 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002835
2836 return result;
2837}
2838
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002839VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2840vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
2841 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002842 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002843 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002844 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002845
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002846 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002847
Dustin Graves080069b2016-04-05 13:48:15 -06002848 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002849 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
2850
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002851 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002852 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002853
2854 return result;
2855}
2856
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002857VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
2858 uint32_t descriptorSetCount,
2859 const VkDescriptorSet *pDescriptorSets) {
2860 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002861 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002862 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002863 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002864
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002865 skipCall |= parameter_validation_vkFreeDescriptorSets(my_data->report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002866
Dustin Graves080069b2016-04-05 13:48:15 -06002867 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002868 result = get_dispatch_table(pc_device_table_map, device)
2869 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002870
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002871 validate_result(my_data->report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002872 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002873
2874 return result;
2875}
2876
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002877VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2878vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
2879 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Graves080069b2016-04-05 13:48:15 -06002880 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002881 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002882 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002883
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002884 skipCall |= parameter_validation_vkUpdateDescriptorSets(my_data->report_data, descriptorWriteCount, pDescriptorWrites,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002885 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002886
Dustin Graves080069b2016-04-05 13:48:15 -06002887 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002888 get_dispatch_table(pc_device_table_map, device)
2889 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002890 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002891}
2892
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002893VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2894 const VkAllocationCallbacks *pAllocator,
2895 VkFramebuffer *pFramebuffer) {
2896 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002897 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002898 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002899 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002900
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002901 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002902
Dustin Graves080069b2016-04-05 13:48:15 -06002903 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002904 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
2905
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002906 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002907 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002908
2909 return result;
2910}
2911
Dustin Graves27a912a2016-03-07 17:52:14 -07002912VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002913vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002914 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002915 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002916 assert(my_data != NULL);
2917
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002918 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002919
Dustin Graves080069b2016-04-05 13:48:15 -06002920 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002921 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002922 }
2923}
2924
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002925VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2926 const VkAllocationCallbacks *pAllocator,
2927 VkRenderPass *pRenderPass) {
2928 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002929 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002930 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002931 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002932
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002933 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002934
Dustin Graves080069b2016-04-05 13:48:15 -06002935 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002936 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
2937
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002938 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002939 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002940
2941 return result;
2942}
2943
Dustin Graves27a912a2016-03-07 17:52:14 -07002944VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002945vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002946 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002947 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002948 assert(my_data != NULL);
2949
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002950 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002951
Dustin Graves080069b2016-04-05 13:48:15 -06002952 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002953 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002954 }
2955}
2956
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002957VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2958vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06002959 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002960 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002961 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002962
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002963 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002964
Dustin Graves080069b2016-04-05 13:48:15 -06002965 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002966 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002967 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002968}
2969
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002970VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
2971 const VkAllocationCallbacks *pAllocator,
2972 VkCommandPool *pCommandPool) {
2973 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002974 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002975 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002976 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002977
Dustin Gravesde628532016-04-21 16:30:17 -06002978 skipCall |=
2979 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002980
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002981 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002982
Dustin Graves080069b2016-04-05 13:48:15 -06002983 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002984 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
2985
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002986 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002987 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002988
2989 return result;
2990}
2991
Dustin Graves27a912a2016-03-07 17:52:14 -07002992VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002993vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002994 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002995 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002996 assert(my_data != NULL);
2997
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002998 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002999
Dustin Graves080069b2016-04-05 13:48:15 -06003000 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003001 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003002 }
3003}
3004
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003005VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3006vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003007 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3008 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003009 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3010 assert(my_data != NULL);
3011
Dustin Graves20fd66f2016-04-18 18:33:21 -06003012 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003013
Dustin Graves20fd66f2016-04-18 18:33:21 -06003014 if (!skipCall) {
3015 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3016
3017 validate_result(my_data->report_data, "vkResetCommandPool", result);
3018 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003019
3020 return result;
3021}
3022
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003023VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3024vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
3025 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003026 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003027 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003028 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003029
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003030 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003031
Dustin Graves080069b2016-04-05 13:48:15 -06003032 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003033 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3034
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003035 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003036 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003037
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003038 return result;
3039}
3040
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003041VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3042 uint32_t commandBufferCount,
3043 const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003044 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003045 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003046 assert(my_data != NULL);
3047
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003048 skipCall |= parameter_validation_vkFreeCommandBuffers(my_data->report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003049
Dustin Graves080069b2016-04-05 13:48:15 -06003050 if (!skipCall) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003051 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003052 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003053 }
3054}
3055
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003056VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3057vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3058 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003059 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003060 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003061 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003062
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003063 skipCall |= parameter_validation_vkBeginCommandBuffer(my_data->report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003064
Dustin Graves080069b2016-04-05 13:48:15 -06003065 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003066 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3067
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003068 validate_result(my_data->report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003069 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003070
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003071 return result;
3072}
3073
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003074VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003075 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3076 assert(my_data != NULL);
3077
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003078 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003079
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003080 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003081
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003082 return result;
3083}
3084
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003085VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3086vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003087 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003088 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3089 assert(my_data != NULL);
3090
Dustin Graves16d18972016-05-09 17:36:57 -06003091 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003092
Dustin Graves16d18972016-05-09 17:36:57 -06003093 if (!skip_call) {
3094 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3095
3096 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3097 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003098
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003099 return result;
3100}
3101
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003102VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3103vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003104 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003105 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3106 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003107
Dustin Graves29148ff2016-03-23 19:44:00 -06003108 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3109
Dustin Graves080069b2016-04-05 13:48:15 -06003110 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003111 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3112 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003113}
3114
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003115VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3116vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003117 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003118 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003119 assert(my_data != NULL);
3120
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003121 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003122
Dustin Graves080069b2016-04-05 13:48:15 -06003123 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003124 get_dispatch_table(pc_device_table_map, commandBuffer)
3125 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003126 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003127}
3128
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003129VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3130vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003131 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003132 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003133 assert(my_data != NULL);
3134
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003135 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003136
Dustin Graves080069b2016-04-05 13:48:15 -06003137 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003138 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3139 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003140}
3141
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003142VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003143 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003144}
3145
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003146VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3147vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
3148 get_dispatch_table(pc_device_table_map, commandBuffer)
3149 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003150}
3151
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003152VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003153 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003154 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003155 assert(my_data != NULL);
3156
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003157 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003158
Dustin Graves080069b2016-04-05 13:48:15 -06003159 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003160 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3161 }
Cody Northrop12365112015-08-17 11:10:49 -06003162}
3163
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003164VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3165vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003166 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003167}
3168
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003169VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3170vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003171 bool skipCall = false;
3172 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3173 assert(my_data != NULL);
3174
3175 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3176
3177 if (!skipCall) {
3178 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3179 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003180}
3181
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003182VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3183vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003184 bool skipCall = false;
3185 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3186 assert(my_data != NULL);
3187
3188 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3189
3190 if (!skipCall) {
3191 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3192 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003193}
3194
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003195VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3196vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003197 bool skipCall = false;
3198 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3199 assert(my_data != NULL);
3200
3201 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3202
3203 if (!skipCall) {
3204 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3205 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003206}
3207
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003208VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3209vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3210 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3211 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003212 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003213 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003214 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003215
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003216 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003217 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003218
Dustin Graves080069b2016-04-05 13:48:15 -06003219 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003220 get_dispatch_table(pc_device_table_map, commandBuffer)
3221 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3222 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003223 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003224}
3225
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003226VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3227vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003228 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003229 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3230 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003231
Dustin Graves29148ff2016-03-23 19:44:00 -06003232 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3233
Dustin Graves080069b2016-04-05 13:48:15 -06003234 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003235 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3236 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003237}
3238
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003239VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3240 uint32_t bindingCount, const VkBuffer *pBuffers,
3241 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003242 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003243 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003244 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003245
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003246 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003247
Dustin Graves080069b2016-04-05 13:48:15 -06003248 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003249 get_dispatch_table(pc_device_table_map, commandBuffer)
3250 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003251 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003252}
3253
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003254bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3255 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003256 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003257 // 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 -07003258 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003259 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3260 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003261 return false;
3262 }
3263
3264 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003265 // 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 -07003266 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003267 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3268 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003269 return false;
3270 }
3271
3272 return true;
3273}
3274
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003275VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3276 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003277 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06003278
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003279 get_dispatch_table(pc_device_table_map, commandBuffer)
3280 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003281}
3282
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003283VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3284 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3285 uint32_t firstInstance) {
3286 get_dispatch_table(pc_device_table_map, commandBuffer)
3287 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003288}
3289
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003290VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3291vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003292 bool skipCall = false;
3293 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3294 assert(my_data != NULL);
3295
3296 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
3297
3298 if (!skipCall) {
3299 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
3300 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003301}
3302
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003303VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3304vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003305 bool skipCall = false;
3306 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3307 assert(my_data != NULL);
3308
3309 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
3310
3311 if (!skipCall) {
3312 get_dispatch_table(pc_device_table_map, commandBuffer)
3313 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
3314 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003315}
3316
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003317VK_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 -07003318 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003319}
3320
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003321VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3322vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003323 bool skipCall = false;
3324 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3325 assert(my_data != NULL);
3326
3327 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
3328
3329 if (!skipCall) {
3330 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
3331 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003332}
3333
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003334VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
3335 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003336 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003337 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003338 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003339
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003340 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003341
Dustin Graves080069b2016-04-05 13:48:15 -06003342 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003343 get_dispatch_table(pc_device_table_map, commandBuffer)
3344 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003345 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003346}
3347
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003348bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
3349 if (pRegions != nullptr) {
3350 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3351 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003352 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3353 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003354 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3355 return false;
3356 }
3357 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3358 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003359 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3360 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003361 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3362 return false;
3363 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003364 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003365
3366 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003367}
3368
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003369VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3370vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3371 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003372 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003373 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003374 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003375
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003376 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003377 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003378
Dustin Graves080069b2016-04-05 13:48:15 -06003379 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003380 PreCmdCopyImage(commandBuffer, pRegions);
3381
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003382 get_dispatch_table(pc_device_table_map, commandBuffer)
3383 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003384 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003385}
3386
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003387bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
3388 if (pRegions != nullptr) {
3389 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3390 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003391 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3392 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003393 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3394 return false;
3395 }
3396 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3397 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003398 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3399 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003400 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3401 return false;
3402 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003403 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003404
3405 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003406}
3407
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003408VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3409vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3410 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06003411 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003412 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003413 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003414
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003415 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003416 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003417
Dustin Graves080069b2016-04-05 13:48:15 -06003418 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003419 PreCmdBlitImage(commandBuffer, pRegions);
3420
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003421 get_dispatch_table(pc_device_table_map, commandBuffer)
3422 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003423 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003424}
3425
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003426bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3427 if (pRegions != nullptr) {
3428 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3429 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003430 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3431 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003432 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3433 "enumerator");
3434 return false;
3435 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003436 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003437
3438 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003439}
3440
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003441VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
3442 VkImage dstImage, VkImageLayout dstImageLayout,
3443 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003444 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003445 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003446 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003447
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003448 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003449 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003450
Dustin Graves080069b2016-04-05 13:48:15 -06003451 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003452 PreCmdCopyBufferToImage(commandBuffer, pRegions);
3453
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003454 get_dispatch_table(pc_device_table_map, commandBuffer)
3455 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003456 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003457}
3458
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003459bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3460 if (pRegions != nullptr) {
3461 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3462 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003463 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3464 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003465 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3466 "enumerator");
3467 return false;
3468 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003469 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003470
3471 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003472}
3473
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003474VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
3475 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
3476 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003477 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003478 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003479 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003480
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003481 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003482 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003483
Dustin Graves080069b2016-04-05 13:48:15 -06003484 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003485 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
3486
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003487 get_dispatch_table(pc_device_table_map, commandBuffer)
3488 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003489 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003490}
3491
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003492VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
3493 VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) {
Dustin Graves080069b2016-04-05 13:48:15 -06003494 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003495 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003496 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003497
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003498 skipCall |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003499
Dustin Graves080069b2016-04-05 13:48:15 -06003500 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003501 get_dispatch_table(pc_device_table_map, commandBuffer)
3502 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003503 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003504}
3505
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003506VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3507vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003508 bool skipCall = false;
3509 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3510 assert(my_data != NULL);
3511
3512 skipCall |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
3513
3514 if (!skipCall) {
3515 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
3516 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003517}
3518
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003519VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
3520 VkImageLayout imageLayout, const VkClearColorValue *pColor,
3521 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003522 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003523 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003524 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003525
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003526 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003527
Dustin Graves080069b2016-04-05 13:48:15 -06003528 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003529 get_dispatch_table(pc_device_table_map, commandBuffer)
3530 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003531 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003532}
3533
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003534VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3535vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
3536 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
3537 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003538 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003539 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003540 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003541
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003542 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003543 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003544
Dustin Graves080069b2016-04-05 13:48:15 -06003545 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003546 get_dispatch_table(pc_device_table_map, commandBuffer)
3547 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003548 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003549}
3550
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003551VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
3552 const VkClearAttachment *pAttachments, uint32_t rectCount,
3553 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06003554 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003555 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003556 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003557
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003558 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003559
Dustin Graves080069b2016-04-05 13:48:15 -06003560 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003561 get_dispatch_table(pc_device_table_map, commandBuffer)
3562 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003563 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003564}
3565
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003566bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
3567 if (pRegions != nullptr) {
3568 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3569 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3570 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06003571 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3572 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003573 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3574 return false;
3575 }
3576 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3577 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3578 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06003579 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3580 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003581 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3582 return false;
3583 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003584 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003585
3586 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003587}
3588
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003589VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3590vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3591 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003592 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003593 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003594 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003595
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003596 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003597 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003598
Dustin Graves080069b2016-04-05 13:48:15 -06003599 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003600 PreCmdResolveImage(commandBuffer, pRegions);
3601
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003602 get_dispatch_table(pc_device_table_map, commandBuffer)
3603 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003604 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003605}
3606
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003607VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3608vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
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_vkCmdSetEvent(my_data->report_data, event, stageMask);
3614
3615 if (!skipCall) {
3616 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
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
3621vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
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_vkCmdResetEvent(my_data->report_data, event, stageMask);
3627
3628 if (!skipCall) {
3629 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
3630 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003631}
3632
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003633VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3634vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
3635 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3636 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3637 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003638 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003639 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003640 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003641
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003642 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003643 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
3644 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003645
Dustin Graves080069b2016-04-05 13:48:15 -06003646 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003647 get_dispatch_table(pc_device_table_map, commandBuffer)
3648 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
3649 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003650 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003651}
3652
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003653VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3654vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
3655 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3656 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3657 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003658 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003659 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003660 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003661
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003662 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003663 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
3664 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003665
Dustin Graves080069b2016-04-05 13:48:15 -06003666 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003667 get_dispatch_table(pc_device_table_map, commandBuffer)
3668 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
3669 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003670 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003671}
3672
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003673VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3674vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003675 bool skipCall = false;
3676 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3677 assert(my_data != NULL);
3678
3679 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
3680
3681 if (!skipCall) {
3682 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
3683 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003684}
3685
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003686VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003687 bool skipCall = false;
3688 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3689 assert(my_data != NULL);
3690
3691 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
3692
3693 if (!skipCall) {
3694 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
3695 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003696}
3697
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003698VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3699vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003700 bool skipCall = false;
3701 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3702 assert(my_data != NULL);
3703
3704 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
3705
3706 if (!skipCall) {
3707 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
3708 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003709}
3710
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003711bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
3712 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003713
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08003714 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003715
3716 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003717}
3718
Dustin Graves20fd66f2016-04-18 18:33:21 -06003719VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
3720 VkQueryPool queryPool, uint32_t query) {
3721 bool skipCall = false;
3722 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3723 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003724
Dustin Graves20fd66f2016-04-18 18:33:21 -06003725 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
3726
3727 if (!skipCall) {
3728 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3729
3730 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3731 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003732}
3733
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003734VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3735vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
3736 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003737 bool skipCall = false;
3738 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3739 assert(my_data != NULL);
3740
3741 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
3742 dstOffset, stride, flags);
3743
3744 if (!skipCall) {
3745 get_dispatch_table(pc_device_table_map, commandBuffer)
3746 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
3747 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003748}
3749
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003750VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
3751 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
3752 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06003753 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003754 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003755 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003756
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003757 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003758
Dustin Graves080069b2016-04-05 13:48:15 -06003759 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003760 get_dispatch_table(pc_device_table_map, commandBuffer)
3761 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003762 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003763}
3764
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003765VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3766vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003767 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003768 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003769 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003770
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003771 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003772
Dustin Graves080069b2016-04-05 13:48:15 -06003773 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003774 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003775 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003776}
3777
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003778VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003779 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003780 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3781 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08003782
Dustin Graves29148ff2016-03-23 19:44:00 -06003783 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
3784
Dustin Graves080069b2016-04-05 13:48:15 -06003785 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003786 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
3787 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003788}
3789
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003790VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003791 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003792}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003793
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003794VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3795vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003796 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003797 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003798 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003799
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003800 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08003801
Dustin Graves080069b2016-04-05 13:48:15 -06003802 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003803 get_dispatch_table(pc_device_table_map, commandBuffer)
3804 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003805 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003806}
3807
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003808VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003809 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3810
Dustin Graves080069b2016-04-05 13:48:15 -06003811 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003812 return NULL;
3813 }
3814
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003815 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003816 return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003817 if (!strcmp(funcName, "vkDestroyDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003818 return (PFN_vkVoidFunction)vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003819 if (!strcmp(funcName, "vkGetDeviceQueue"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003820 return (PFN_vkVoidFunction)vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003821 if (!strcmp(funcName, "vkQueueSubmit"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003822 return (PFN_vkVoidFunction)vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003823 if (!strcmp(funcName, "vkQueueWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003824 return (PFN_vkVoidFunction)vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003825 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003826 return (PFN_vkVoidFunction)vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003827 if (!strcmp(funcName, "vkAllocateMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003828 return (PFN_vkVoidFunction)vkAllocateMemory;
Dustin Graves27a912a2016-03-07 17:52:14 -07003829 if (!strcmp(funcName, "vkFreeMemory"))
3830 return (PFN_vkVoidFunction)vkFreeMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003831 if (!strcmp(funcName, "vkMapMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003832 return (PFN_vkVoidFunction)vkMapMemory;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003833 if (!strcmp(funcName, "vkUnmapMemory"))
3834 return (PFN_vkVoidFunction)vkUnmapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003835 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003836 return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003837 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003838 return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003839 if (!strcmp(funcName, "vkGetDeviceMemoryCommitment"))
3840 return (PFN_vkVoidFunction)vkGetDeviceMemoryCommitment;
3841 if (!strcmp(funcName, "vkBindBufferMemory"))
3842 return (PFN_vkVoidFunction)vkBindBufferMemory;
3843 if (!strcmp(funcName, "vkBindImageMemory"))
3844 return (PFN_vkVoidFunction)vkBindImageMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003845 if (!strcmp(funcName, "vkCreateFence"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003846 return (PFN_vkVoidFunction)vkCreateFence;
Dustin Graves27a912a2016-03-07 17:52:14 -07003847 if (!strcmp(funcName, "vkDestroyFence"))
3848 return (PFN_vkVoidFunction)vkDestroyFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003849 if (!strcmp(funcName, "vkResetFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003850 return (PFN_vkVoidFunction)vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003851 if (!strcmp(funcName, "vkGetFenceStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003852 return (PFN_vkVoidFunction)vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003853 if (!strcmp(funcName, "vkWaitForFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003854 return (PFN_vkVoidFunction)vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003855 if (!strcmp(funcName, "vkCreateSemaphore"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003856 return (PFN_vkVoidFunction)vkCreateSemaphore;
Dustin Graves27a912a2016-03-07 17:52:14 -07003857 if (!strcmp(funcName, "vkDestroySemaphore"))
3858 return (PFN_vkVoidFunction)vkDestroySemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003859 if (!strcmp(funcName, "vkCreateEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003860 return (PFN_vkVoidFunction)vkCreateEvent;
Dustin Graves27a912a2016-03-07 17:52:14 -07003861 if (!strcmp(funcName, "vkDestroyEvent"))
3862 return (PFN_vkVoidFunction)vkDestroyEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003863 if (!strcmp(funcName, "vkGetEventStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003864 return (PFN_vkVoidFunction)vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003865 if (!strcmp(funcName, "vkSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003866 return (PFN_vkVoidFunction)vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003867 if (!strcmp(funcName, "vkResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003868 return (PFN_vkVoidFunction)vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003869 if (!strcmp(funcName, "vkCreateQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003870 return (PFN_vkVoidFunction)vkCreateQueryPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07003871 if (!strcmp(funcName, "vkDestroyQueryPool"))
3872 return (PFN_vkVoidFunction)vkDestroyQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003873 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003874 return (PFN_vkVoidFunction)vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003875 if (!strcmp(funcName, "vkCreateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003876 return (PFN_vkVoidFunction)vkCreateBuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07003877 if (!strcmp(funcName, "vkDestroyBuffer"))
3878 return (PFN_vkVoidFunction)vkDestroyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003879 if (!strcmp(funcName, "vkCreateBufferView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003880 return (PFN_vkVoidFunction)vkCreateBufferView;
Dustin Graves27a912a2016-03-07 17:52:14 -07003881 if (!strcmp(funcName, "vkDestroyBufferView"))
3882 return (PFN_vkVoidFunction)vkDestroyBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003883 if (!strcmp(funcName, "vkCreateImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003884 return (PFN_vkVoidFunction)vkCreateImage;
Dustin Graves27a912a2016-03-07 17:52:14 -07003885 if (!strcmp(funcName, "vkDestroyImage"))
3886 return (PFN_vkVoidFunction)vkDestroyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003887 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003888 return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003889 if (!strcmp(funcName, "vkCreateImageView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003890 return (PFN_vkVoidFunction)vkCreateImageView;
Dustin Graves27a912a2016-03-07 17:52:14 -07003891 if (!strcmp(funcName, "vkDestroyImageView"))
3892 return (PFN_vkVoidFunction)vkDestroyImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05003893 if (!strcmp(funcName, "vkCreateShaderModule"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003894 return (PFN_vkVoidFunction)vkCreateShaderModule;
Dustin Graves27a912a2016-03-07 17:52:14 -07003895 if (!strcmp(funcName, "vkDestroyShaderModule"))
3896 return (PFN_vkVoidFunction)vkDestroyShaderModule;
3897 if (!strcmp(funcName, "vkCreatePipelineCache"))
3898 return (PFN_vkVoidFunction)vkCreatePipelineCache;
3899 if (!strcmp(funcName, "vkDestroyPipelineCache"))
3900 return (PFN_vkVoidFunction)vkDestroyPipelineCache;
3901 if (!strcmp(funcName, "vkGetPipelineCacheData"))
3902 return (PFN_vkVoidFunction)vkGetPipelineCacheData;
3903 if (!strcmp(funcName, "vkMergePipelineCaches"))
3904 return (PFN_vkVoidFunction)vkMergePipelineCaches;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003905 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003906 return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003907 if (!strcmp(funcName, "vkCreateComputePipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003908 return (PFN_vkVoidFunction)vkCreateComputePipelines;
Dustin Graves27a912a2016-03-07 17:52:14 -07003909 if (!strcmp(funcName, "vkDestroyPipeline"))
3910 return (PFN_vkVoidFunction)vkDestroyPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003911 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003912 return (PFN_vkVoidFunction)vkCreatePipelineLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07003913 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
3914 return (PFN_vkVoidFunction)vkDestroyPipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003915 if (!strcmp(funcName, "vkCreateSampler"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003916 return (PFN_vkVoidFunction)vkCreateSampler;
Dustin Graves27a912a2016-03-07 17:52:14 -07003917 if (!strcmp(funcName, "vkDestroySampler"))
3918 return (PFN_vkVoidFunction)vkDestroySampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003919 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003920 return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07003921 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
3922 return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003923 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003924 return (PFN_vkVoidFunction)vkCreateDescriptorPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07003925 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
3926 return (PFN_vkVoidFunction)vkDestroyDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003927 if (!strcmp(funcName, "vkResetDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003928 return (PFN_vkVoidFunction)vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003929 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003930 return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003931 if (!strcmp(funcName, "vkCmdSetViewport"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003932 return (PFN_vkVoidFunction)vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003933 if (!strcmp(funcName, "vkCmdSetScissor"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003934 return (PFN_vkVoidFunction)vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003935 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003936 return (PFN_vkVoidFunction)vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003937 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003938 return (PFN_vkVoidFunction)vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003939 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003940 return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003941 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003942 return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003943 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003944 return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003945 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003946 return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003947 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003948 return (PFN_vkVoidFunction)vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003949 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003950 return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003951 if (!strcmp(funcName, "vkFreeCommandBuffers"))
3952 return (PFN_vkVoidFunction)vkFreeCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003953 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003954 return (PFN_vkVoidFunction)vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003955 if (!strcmp(funcName, "vkEndCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003956 return (PFN_vkVoidFunction)vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003957 if (!strcmp(funcName, "vkResetCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003958 return (PFN_vkVoidFunction)vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003959 if (!strcmp(funcName, "vkCmdBindPipeline"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003960 return (PFN_vkVoidFunction)vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003961 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003962 return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003963 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003964 return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003965 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003966 return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003967 if (!strcmp(funcName, "vkCmdDraw"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003968 return (PFN_vkVoidFunction)vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003969 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003970 return (PFN_vkVoidFunction)vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003971 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003972 return (PFN_vkVoidFunction)vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003973 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003974 return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003975 if (!strcmp(funcName, "vkCmdDispatch"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003976 return (PFN_vkVoidFunction)vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003977 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003978 return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003979 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003980 return (PFN_vkVoidFunction)vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003981 if (!strcmp(funcName, "vkCmdCopyImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003982 return (PFN_vkVoidFunction)vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003983 if (!strcmp(funcName, "vkCmdBlitImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003984 return (PFN_vkVoidFunction)vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003985 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003986 return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003987 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003988 return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003989 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003990 return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003991 if (!strcmp(funcName, "vkCmdFillBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003992 return (PFN_vkVoidFunction)vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003993 if (!strcmp(funcName, "vkCmdClearColorImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003994 return (PFN_vkVoidFunction)vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003995 if (!strcmp(funcName, "vkCmdResolveImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003996 return (PFN_vkVoidFunction)vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003997 if (!strcmp(funcName, "vkCmdSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003998 return (PFN_vkVoidFunction)vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003999 if (!strcmp(funcName, "vkCmdResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004000 return (PFN_vkVoidFunction)vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004001 if (!strcmp(funcName, "vkCmdWaitEvents"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004002 return (PFN_vkVoidFunction)vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004003 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004004 return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004005 if (!strcmp(funcName, "vkCmdBeginQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004006 return (PFN_vkVoidFunction)vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004007 if (!strcmp(funcName, "vkCmdEndQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004008 return (PFN_vkVoidFunction)vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004009 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004010 return (PFN_vkVoidFunction)vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004011 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004012 return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004013 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004014 return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004015 if (!strcmp(funcName, "vkCreateFramebuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004016 return (PFN_vkVoidFunction)vkCreateFramebuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07004017 if (!strcmp(funcName, "vkDestroyFramebuffer"))
4018 return (PFN_vkVoidFunction)vkDestroyFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004019 if (!strcmp(funcName, "vkCreateRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004020 return (PFN_vkVoidFunction)vkCreateRenderPass;
Dustin Graves27a912a2016-03-07 17:52:14 -07004021 if (!strcmp(funcName, "vkDestroyRenderPass"))
4022 return (PFN_vkVoidFunction)vkDestroyRenderPass;
4023 if (!strcmp(funcName, "vkGetRenderAreaGranularity"))
4024 return (PFN_vkVoidFunction)vkGetRenderAreaGranularity;
4025 if (!strcmp(funcName, "vkCreateCommandPool"))
4026 return (PFN_vkVoidFunction)vkCreateCommandPool;
4027 if (!strcmp(funcName, "vkDestroyCommandPool"))
4028 return (PFN_vkVoidFunction)vkDestroyCommandPool;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004029 if (!strcmp(funcName, "vkResetCommandPool"))
4030 return (PFN_vkVoidFunction)vkResetCommandPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004031 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004032 return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08004033 if (!strcmp(funcName, "vkCmdNextSubpass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004034 return (PFN_vkVoidFunction)vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06004035
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004036 if (device == NULL) {
4037 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004038 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004039
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004040 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004041 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004042 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004043}
4044
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004045VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004046 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004047 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004048 if (!strcmp(funcName, "vkCreateInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004049 return (PFN_vkVoidFunction)vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004050 if (!strcmp(funcName, "vkDestroyInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004051 return (PFN_vkVoidFunction)vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004052 if (!strcmp(funcName, "vkCreateDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004053 return (PFN_vkVoidFunction)vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004054 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004055 return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004056 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004057 return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004058 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004059 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06004060 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004061 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
Dustin Graves16d18972016-05-09 17:36:57 -06004062 if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties"))
4063 return (PFN_vkVoidFunction)vkGetPhysicalDeviceImageFormatProperties;
4064 if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties"))
4065 return (PFN_vkVoidFunction)vkGetPhysicalDeviceSparseImageFormatProperties;
4066 if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties"))
4067 return (PFN_vkVoidFunction)vkGetPhysicalDeviceQueueFamilyProperties;
4068 if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties"))
4069 return (PFN_vkVoidFunction)vkGetPhysicalDeviceMemoryProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004070 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004071 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004072 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004073 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004074 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004075 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004076 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004077 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004078
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004079 if (instance == NULL) {
4080 return NULL;
4081 }
4082
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004083 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004084
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004085 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004086 if (fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004087 return fptr;
4088
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004089 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004090 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004091 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004092}