blob: eefa5c13326f62aa12891a22cbd69fafb00a670c [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
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001210static bool validate_queue_family_indices(VkDevice device, const char *function_name, const uint32_t count,
1211 const uint32_t *indices) {
1212 bool skipCall = false;
1213 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1214
1215 for (auto i = 0u; i < count; i++) {
1216 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001217 skipCall |= log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1218 INVALID_USAGE, "PARAMCHECK",
1219 "%s: the specified queueFamilyIndex cannot be VK_QUEUE_FAMILY_IGNORED.", function_name);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001220 } else {
1221 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(indices[i]);
1222 if (queue_data == my_device_data->queueFamilyIndexMap.end()) {
1223 skipCall |= log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001224 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1225 "PARAMCHECK",
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001226 "VkGetDeviceQueue parameter, uint32_t queueFamilyIndex %d, must have been given when the device was created.",
1227 indices[i]);
1228 return false;
1229 }
1230 }
1231 }
1232 return skipCall;
1233}
1234
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001235static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001236 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001237 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001238 return false;
1239 }
1240
1241 return true;
1242}
1243
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001244static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1245 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001246 return "unrecognized enumerator";
1247 }
1248
1249 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001250 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001251 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001252 }
1253
1254 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001255 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001256 enumeratorString += string;
1257
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001258 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001259 enumeratorString += '|';
1260 }
1261 }
1262
1263 return enumeratorString;
1264}
1265
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001266static const int MaxParamCheckerStringLength = 256;
1267
Dustin Graves080069b2016-04-05 13:48:15 -06001268static bool validate_string(debug_report_data *report_data, const char *apiName, const char *stringName,
1269 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001270 assert(apiName != nullptr);
1271 assert(stringName != nullptr);
1272 assert(validateString != nullptr);
1273
Dustin Graves080069b2016-04-05 13:48:15 -06001274 bool skipCall = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001275
1276 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1277
1278 if (result == VK_STRING_ERROR_NONE) {
1279 return skipCall;
1280 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001281 skipCall =
1282 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1283 "PARAMCHECK", "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001284 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001285 skipCall =
1286 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1287 "PARAMCHECK", "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001288 }
1289 return skipCall;
1290}
1291
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001292VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1293vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001294 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001295
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001296 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001297 assert(chain_info != nullptr);
1298 assert(chain_info->u.pLayerInfo != nullptr);
1299
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001300 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1301 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001302 if (fpCreateInstance == NULL) {
1303 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001304 }
1305
Dustin Graves842621d2016-03-03 14:17:08 -07001306 // Advance the link info for the next element on the chain
1307 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1308
1309 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001310
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001311 if (result == VK_SUCCESS) {
1312 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1313 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001314
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001315 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001316
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001317 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1318 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001319
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001320 // Look for one or more debug report create info structures
1321 // and setup a callback(s) for each one found.
1322 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1323 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1324 if (my_instance_data->num_tmp_callbacks > 0) {
1325 // Setup the temporary callback(s) here to catch early issues:
1326 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1327 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1328 // Failure of setting up one or more of the callback.
1329 // Therefore, clean up and don't use those callbacks:
1330 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1331 my_instance_data->num_tmp_callbacks = 0;
1332 }
1333 }
1334 }
1335
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001336 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001337
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001338 // Ordinarily we'd check these before calling down the chain, but none of the layer
1339 // support is in place until now, if we survive we can report the issue now.
1340 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001341
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001342 if (pCreateInfo->pApplicationInfo) {
1343 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1344 validate_string(my_instance_data->report_data, "vkCreateInstance",
1345 "pCreateInfo->VkApplicationInfo->pApplicationName",
1346 pCreateInfo->pApplicationInfo->pApplicationName);
1347 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001348
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001349 if (pCreateInfo->pApplicationInfo->pEngineName) {
1350 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1351 pCreateInfo->pApplicationInfo->pEngineName);
1352 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001353 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001354
1355 // Disable the tmp callbacks:
1356 if (my_instance_data->num_tmp_callbacks > 0) {
1357 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1358 my_instance_data->tmp_callbacks);
1359 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001360 }
1361
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001362 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001363}
1364
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001365VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001366 // Grab the key before the instance is destroyed.
1367 dispatch_key key = get_dispatch_key(instance);
Dustin Graves080069b2016-04-05 13:48:15 -06001368 bool skipCall = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001369 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001370 assert(my_data != NULL);
1371
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001372 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1373 bool callback_setup = false;
1374 if (my_data->num_tmp_callbacks > 0) {
1375 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1376 my_data->tmp_callbacks)) {
1377 callback_setup = true;
1378 }
1379 }
1380
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001381 skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001382
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001383 // Disable and cleanup the temporary callback(s):
1384 if (callback_setup) {
1385 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1386 }
1387 if (my_data->num_tmp_callbacks > 0) {
1388 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1389 my_data->num_tmp_callbacks = 0;
1390 }
1391
Dustin Graves080069b2016-04-05 13:48:15 -06001392 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001393 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001394 pTable->DestroyInstance(instance, pAllocator);
1395
1396 // Clean up logging callback, if any
1397 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001398 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1399 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001400 my_data->logging_callback.pop_back();
1401 }
1402
1403 layer_debug_report_destroy_instance(mid(instance));
1404 layer_data_map.erase(pTable);
1405
1406 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001407 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001408 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001409}
1410
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001411VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1412vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) {
1413 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001414 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001415 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001416 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001417
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001418 skipCall |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001419
Dustin Graves080069b2016-04-05 13:48:15 -06001420 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001421 result = get_dispatch_table(pc_instance_table_map, instance)
1422 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001423
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001424 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001425 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001426
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001427 return result;
1428}
1429
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001430VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1431vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Dustin Graves080069b2016-04-05 13:48:15 -06001432 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001433 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001434 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001435
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001436 skipCall |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001437
Dustin Graves080069b2016-04-05 13:48:15 -06001438 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001439 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001440 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001441}
1442
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001443VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1444vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001445 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001446 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001447 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001448
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001449 skipCall |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001450
Dustin Graves080069b2016-04-05 13:48:15 -06001451 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001452 get_dispatch_table(pc_instance_table_map, physicalDevice)
1453 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001454 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001455}
1456
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001457VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1458vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1459 VkImageUsageFlags usage, VkImageCreateFlags flags,
1460 VkImageFormatProperties *pImageFormatProperties) {
1461 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001462 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001463 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001464 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001465
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001466 skipCall |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001467 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001468
Dustin Graves080069b2016-04-05 13:48:15 -06001469 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001470 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1471 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1472 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001473
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001474 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001475 }
Chia-I Wu17241042015-10-31 00:31:16 +08001476
1477 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001478}
1479
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001480VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1481vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001482 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001483 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001484 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001485
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001486 skipCall |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001487
Dustin Graves080069b2016-04-05 13:48:15 -06001488 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001489 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001490 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001491}
1492
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001493VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1494vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1495 VkQueueFamilyProperties *pQueueFamilyProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001496 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001497 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001498 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001499
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001500 skipCall |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001501 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001502
Dustin Graves080069b2016-04-05 13:48:15 -06001503 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001504 get_dispatch_table(pc_instance_table_map, physicalDevice)
1505 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001506 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001507}
1508
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001509VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1510vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001511 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001512 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001513 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001514
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001515 skipCall |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001516
Dustin Graves080069b2016-04-05 13:48:15 -06001517 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001518 get_dispatch_table(pc_instance_table_map, physicalDevice)
1519 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001520 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001521}
1522
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001523void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1524 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001525 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001526
1527 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1528 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1529 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001530 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1531 INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001532 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1533 "structure.",
1534 i);
1535 } else {
1536 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001537 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001538
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001539 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1540 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1541 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1542 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001543 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
1544 __LINE__, INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001545 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1546 "between 0 and 1. Actual value is %f",
1547 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1548 }
1549 }
1550 }
1551
1552 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1553 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001554 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1555 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001556 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1557 "of queue families.",
1558 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001559 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1560 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1561 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001562 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1563 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001564 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1565 "queues for the given family index.",
1566 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001567 }
Michael Lentine774704f2016-01-27 13:36:46 -06001568 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001569 }
1570}
1571
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001572void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001573 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001574
1575 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1576 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1577 my_device_data->queueFamilyIndexMap.insert(
1578 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1579 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001580 }
1581}
1582
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001583VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice,
1584 const VkDeviceCreateInfo *pCreateInfo,
1585 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001586 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001587 * NOTE: We do not validate physicalDevice or any dispatchable
1588 * object as the first parameter. We couldn't get here if it was wrong!
1589 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001590
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001591 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001592 bool skipCall = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001593 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001594 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001595
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001596 skipCall |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001597
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001598 if (pCreateInfo != NULL) {
1599 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001600 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001601 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1602 pCreateInfo->ppEnabledLayerNames[i]);
1603 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001604 }
Michael Lentine774704f2016-01-27 13:36:46 -06001605
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001606 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001607 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001608 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1609 pCreateInfo->ppEnabledExtensionNames[i]);
1610 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001611 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001612 }
1613
Dustin Graves080069b2016-04-05 13:48:15 -06001614 if (!skipCall) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001615 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001616 assert(chain_info != nullptr);
1617 assert(chain_info->u.pLayerInfo != nullptr);
1618
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001619 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1620 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001621 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001622 if (fpCreateDevice == NULL) {
1623 return VK_ERROR_INITIALIZATION_FAILED;
1624 }
1625
1626 // Advance the link info for the next element on the chain
1627 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1628
1629 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001630
1631 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1632
1633 if (result == VK_SUCCESS) {
1634 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1635 assert(my_device_data != nullptr);
1636
1637 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1638 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1639
1640 uint32_t count;
1641 get_dispatch_table(pc_instance_table_map, physicalDevice)
1642 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
1643 std::vector<VkQueueFamilyProperties> properties(count);
1644 get_dispatch_table(pc_instance_table_map, physicalDevice)
1645 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
1646
1647 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1648 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001649 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001650 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001651
Jeremy Hayes99a96322015-06-26 12:48:09 -06001652 return result;
1653}
1654
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001655VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001656 dispatch_key key = get_dispatch_key(device);
Dustin Graves080069b2016-04-05 13:48:15 -06001657 bool skipCall = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001658 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1659 assert(my_data != NULL);
1660
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001661 skipCall |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001662
Dustin Graves080069b2016-04-05 13:48:15 -06001663 if (!skipCall) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001664 layer_debug_report_destroy_device(device);
1665
Jeremy Hayes99a96322015-06-26 12:48:09 -06001666#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001667 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001668#endif
1669
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001670 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001671 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001672 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001673 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001674}
1675
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001676bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001677 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001678 assert(my_device_data != nullptr);
1679
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001680 validate_queue_family_indices(device, "vkGetDeviceQueue", 1, &queueFamilyIndex);
1681
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001682 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001683 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001684 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1685 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001686 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1687 "was created.",
1688 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001689 return false;
1690 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001691
Michael Lentinebdf744f2016-01-27 15:43:43 -06001692 return true;
1693}
1694
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001695VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1696vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001697 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001698 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001699 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001700
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001701 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001702
Dustin Graves080069b2016-04-05 13:48:15 -06001703 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001704 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1705
1706 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001707 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001708}
1709
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001710VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1711vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
1712 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001713 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001714 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001715 assert(my_data != NULL);
1716
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001717 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001718
Dustin Graves080069b2016-04-05 13:48:15 -06001719 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001720 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1721
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001722 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001723 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001724
Jeremy Hayes99a96322015-06-26 12:48:09 -06001725 return result;
1726}
1727
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001728VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001729 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1730 assert(my_data != NULL);
1731
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001732 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001733
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001734 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001735
1736 return result;
1737}
1738
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001739VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001740 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1741 assert(my_data != NULL);
1742
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001743 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001744
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001745 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001746
1747 return result;
1748}
1749
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001750VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1751 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1752 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001753 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001754 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001755 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001756
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001757 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001758
Dustin Graves080069b2016-04-05 13:48:15 -06001759 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001760 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1761
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001762 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001763 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001764
1765 return result;
1766}
1767
Dustin Graves27a912a2016-03-07 17:52:14 -07001768VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001769vkFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001770 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001771 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001772 assert(my_data != NULL);
1773
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001774 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001775
Dustin Graves080069b2016-04-05 13:48:15 -06001776 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001777 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001778 }
1779}
1780
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001781VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1782vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
1783 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001784 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001785 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001786 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001787
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001788 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001789
Dustin Graves080069b2016-04-05 13:48:15 -06001790 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001791 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1792
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001793 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001794 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001795
1796 return result;
1797}
1798
Dustin Graves20fd66f2016-04-18 18:33:21 -06001799VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUnmapMemory(VkDevice device, VkDeviceMemory memory) {
1800 bool skipCall = false;
1801 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1802 assert(my_data != NULL);
1803
1804 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1805
1806 if (!skipCall) {
1807 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1808 }
1809}
1810
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001811VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1812vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1813 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001814 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001815 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001816 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001817
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001818 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001819
Dustin Graves080069b2016-04-05 13:48:15 -06001820 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001821 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1822
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001823 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001824 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001825
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001826 return result;
1827}
1828
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001829VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1830vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1831 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001832 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001833 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001834 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001835
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001836 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001837
Dustin Graves080069b2016-04-05 13:48:15 -06001838 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001839 result =
1840 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001841
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001842 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001843 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001844
Tony Barbourb1250542015-04-16 19:23:13 -06001845 return result;
1846}
1847
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001848VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1849vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001850 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001851 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001852 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001853
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001854 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001855
Dustin Graves080069b2016-04-05 13:48:15 -06001856 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001857 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001858 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001859}
1860
Dustin Graves20fd66f2016-04-18 18:33:21 -06001861VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1862 VkDeviceSize memoryOffset) {
1863 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1864 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001865 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1866 assert(my_data != NULL);
1867
Dustin Graves20fd66f2016-04-18 18:33:21 -06001868 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001869
Dustin Graves20fd66f2016-04-18 18:33:21 -06001870 if (!skipCall) {
1871 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1872
1873 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1874 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001875
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001876 return result;
1877}
1878
Dustin Graves20fd66f2016-04-18 18:33:21 -06001879VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1880 VkDeviceSize memoryOffset) {
1881 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1882 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001883 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1884 assert(my_data != NULL);
1885
Dustin Graves20fd66f2016-04-18 18:33:21 -06001886 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001887
Dustin Graves20fd66f2016-04-18 18:33:21 -06001888 if (!skipCall) {
1889 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1890
1891 validate_result(my_data->report_data, "vkBindImageMemory", result);
1892 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001893
1894 return result;
1895}
1896
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001897VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1898vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001899 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001900 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001901 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001902
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001903 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001904
Dustin Graves080069b2016-04-05 13:48:15 -06001905 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001906 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001907 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001908}
1909
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001910VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1911vkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001912 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001913 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001914 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001915
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001916 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001917
Dustin Graves080069b2016-04-05 13:48:15 -06001918 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001919 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001920 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001921}
1922
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001923bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1924 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1925 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001926 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001927 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1928 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001929 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1930 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001931 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1932 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001933 return false;
1934 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001935 }
1936
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001937 return true;
1938}
1939
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001940VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1941vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1942 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001943 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001944 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001945 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001946
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001947 skipCall |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001948 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001949
Dustin Graves080069b2016-04-05 13:48:15 -06001950 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001951 get_dispatch_table(pc_device_table_map, device)
1952 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001953
1954 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1955 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001956}
1957
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001958bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1959 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1960 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001961 if (pProperties != nullptr) {
1962 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1963 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001964 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
1965 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001966 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
1967 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001968 return false;
1969 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001970 }
1971
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001972 return true;
1973}
1974
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001975VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1976vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1977 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1978 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001979 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001980 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001981 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001982
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001983 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001984 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001985
Dustin Graves080069b2016-04-05 13:48:15 -06001986 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001987 get_dispatch_table(pc_instance_table_map, physicalDevice)
1988 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
1989 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001990
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001991 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
1992 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001993 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001994}
1995
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001996VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1997vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
1998 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001999 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002000 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002001 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002002
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002003 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002004
Dustin Graves080069b2016-04-05 13:48:15 -06002005 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002006 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2007
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002008 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002009 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002010
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002011 return result;
2012}
2013
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002014VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2015vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
2016 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002017 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002018 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002019 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002020
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002021 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002022
Dustin Graves080069b2016-04-05 13:48:15 -06002023 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002024 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2025
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002026 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002027 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002028
2029 return result;
2030}
2031
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002032VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002033 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002034 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002035 assert(my_data != NULL);
2036
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002037 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002038
Dustin Graves080069b2016-04-05 13:48:15 -06002039 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002040 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002041 }
2042}
2043
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002044VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
2045 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002046 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002047 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002048 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002049
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002050 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002051
Dustin Graves080069b2016-04-05 13:48:15 -06002052 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002053 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2054
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002055 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002056 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002057
2058 return result;
2059}
2060
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002061VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002062 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2063 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002064 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2065 assert(my_data != NULL);
2066
Dustin Graves20fd66f2016-04-18 18:33:21 -06002067 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002068
Dustin Graves20fd66f2016-04-18 18:33:21 -06002069 if (!skipCall) {
2070 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2071
2072 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2073 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002074
2075 return result;
2076}
2077
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002078VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2079vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
2080 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002081 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002082 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002083 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002084
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002085 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002086
Dustin Graves080069b2016-04-05 13:48:15 -06002087 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002088 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2089
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002090 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002091 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002092
2093 return result;
2094}
2095
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002096VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
2097 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2098 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002099 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002100 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002101 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002102
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002103 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002104
Dustin Graves080069b2016-04-05 13:48:15 -06002105 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002106 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2107
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002108 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002109 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002110
2111 return result;
2112}
2113
Dustin Graves27a912a2016-03-07 17:52:14 -07002114VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002115vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002116 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002117 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002118 assert(my_data != NULL);
2119
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002120 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002121
Dustin Graves080069b2016-04-05 13:48:15 -06002122 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002123 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002124 }
2125}
2126
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002127VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2128vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
2129 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002130 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002131 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002132 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002133
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002134 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002135
Dustin Graves080069b2016-04-05 13:48:15 -06002136 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002137 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2138
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002139 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002140 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002141
2142 return result;
2143}
2144
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002145VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002146 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002147 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002148 assert(my_data != NULL);
2149
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002150 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002151
Dustin Graves080069b2016-04-05 13:48:15 -06002152 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002153 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002154 }
2155}
2156
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002157VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002158 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2159 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002160 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2161 assert(my_data != NULL);
2162
Dustin Graves20fd66f2016-04-18 18:33:21 -06002163 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002164
Dustin Graves20fd66f2016-04-18 18:33:21 -06002165 if (!skipCall) {
2166 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2167
2168 validate_result(my_data->report_data, "vkGetEventStatus", result);
2169 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002170
2171 return result;
2172}
2173
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002174VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002175 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2176 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002177 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2178 assert(my_data != NULL);
2179
Dustin Graves20fd66f2016-04-18 18:33:21 -06002180 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002181
Dustin Graves20fd66f2016-04-18 18:33:21 -06002182 if (!skipCall) {
2183 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2184
2185 validate_result(my_data->report_data, "vkSetEvent", result);
2186 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002187
2188 return result;
2189}
2190
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002191VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002192 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2193 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002194 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2195 assert(my_data != NULL);
2196
Dustin Graves20fd66f2016-04-18 18:33:21 -06002197 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002198
Dustin Graves20fd66f2016-04-18 18:33:21 -06002199 if (!skipCall) {
2200 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2201
2202 validate_result(my_data->report_data, "vkResetEvent", result);
2203 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002204
2205 return result;
2206}
2207
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002208VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2209 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
2210 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002211 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002212 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002213 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002214
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002215 skipCall |= parameter_validation_vkCreateQueryPool(my_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002216
Dustin Graves080069b2016-04-05 13:48:15 -06002217 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002218 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2219
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002220 validate_result(my_data->report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002221 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002222
2223 return result;
2224}
2225
Dustin Graves27a912a2016-03-07 17:52:14 -07002226VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002227vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002228 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002229 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002230 assert(my_data != NULL);
2231
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002232 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002233
Dustin Graves080069b2016-04-05 13:48:15 -06002234 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002235 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002236 }
2237}
2238
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002239VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2240 uint32_t queryCount, size_t dataSize, void *pData,
2241 VkDeviceSize stride, VkQueryResultFlags flags) {
2242 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002243 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002244 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002245 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002246
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002247 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002248 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002249
Dustin Graves080069b2016-04-05 13:48:15 -06002250 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002251 result = get_dispatch_table(pc_device_table_map, device)
2252 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002253
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002254 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002255 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002256
2257 return result;
2258}
2259
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002260bool PreCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo) {
2261 if (pCreateInfo != nullptr) {
Dustin Graves29148ff2016-03-23 19:44:00 -06002262 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002263 validate_queue_family_indices(device, "vkCreateBuffer", pCreateInfo->queueFamilyIndexCount,
2264 pCreateInfo->pQueueFamilyIndices);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002265 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002266 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002267
2268 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002269}
2270
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002271VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2272vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
2273 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002274 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002275 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002276 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002277
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002278 skipCall |= parameter_validation_vkCreateBuffer(my_data->report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002279
Dustin Graves080069b2016-04-05 13:48:15 -06002280 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002281 PreCreateBuffer(device, pCreateInfo);
2282
2283 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2284
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002285 validate_result(my_data->report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002286 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002287
2288 return result;
2289}
2290
Dustin Graves27a912a2016-03-07 17:52:14 -07002291VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002292vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002293 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002294 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002295 assert(my_data != NULL);
2296
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002297 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002298
Dustin Graves080069b2016-04-05 13:48:15 -06002299 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002300 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002301 }
2302}
2303
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002304VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2305 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
2306 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002307 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002308 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002309 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002310
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002311 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002312
Dustin Graves080069b2016-04-05 13:48:15 -06002313 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002314 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2315
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002316 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002317 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002318
2319 return result;
2320}
2321
Dustin Graves27a912a2016-03-07 17:52:14 -07002322VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002323vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002324 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002325 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002326 assert(my_data != NULL);
2327
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002328 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002329
Dustin Graves080069b2016-04-05 13:48:15 -06002330 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002331 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002332 }
2333}
2334
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002335bool PreCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo) {
2336 if (pCreateInfo != nullptr) {
Dustin Graves29148ff2016-03-23 19:44:00 -06002337 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002338 validate_queue_family_indices(device, "vkCreateImage", pCreateInfo->queueFamilyIndexCount,
2339 pCreateInfo->pQueueFamilyIndices);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002340 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002341 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002342
2343 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002344}
2345
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002346VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2347vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
2348 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002349 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002350 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002351 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002352
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002353 skipCall |= parameter_validation_vkCreateImage(my_data->report_data, pCreateInfo, pAllocator, pImage);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002354
Dustin Graves080069b2016-04-05 13:48:15 -06002355 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002356 PreCreateImage(device, pCreateInfo);
2357
2358 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2359
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002360 validate_result(my_data->report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002361 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002362
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002363 return result;
2364}
2365
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002366VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002367 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002368 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002369 assert(my_data != NULL);
2370
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002371 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002372
Dustin Graves080069b2016-04-05 13:48:15 -06002373 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002374 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002375 }
2376}
2377
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002378bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2379 if (pSubresource != nullptr) {
2380 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2381 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002382 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2383 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002384 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2385 return false;
2386 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002387 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002388
2389 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002390}
2391
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002392VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2393vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002394 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002395 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002396 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002397
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002398 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002399
Dustin Graves080069b2016-04-05 13:48:15 -06002400 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002401 PreGetImageSubresourceLayout(device, pSubresource);
2402
2403 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002404 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002405}
2406
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002407VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2408 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
2409 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002410 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002411 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002412 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002413
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002414 skipCall |= parameter_validation_vkCreateImageView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002415
Dustin Graves080069b2016-04-05 13:48:15 -06002416 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002417 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2418
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002419 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002420 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002421
2422 return result;
2423}
2424
Dustin Graves27a912a2016-03-07 17:52:14 -07002425VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002426vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002427 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002428 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002429 assert(my_data != NULL);
2430
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002431 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002432
Dustin Graves080069b2016-04-05 13:48:15 -06002433 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002434 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002435 }
2436}
2437
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002438VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2439 const VkAllocationCallbacks *pAllocator,
2440 VkShaderModule *pShaderModule) {
2441 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002442 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002443 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002444 assert(my_data != NULL);
2445
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002446 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002447
Dustin Graves080069b2016-04-05 13:48:15 -06002448 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002449 result =
2450 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002451
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002452 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002453 }
2454
Michael Lentine03d8e572015-09-15 14:59:14 -05002455 return result;
2456}
2457
Dustin Graves27a912a2016-03-07 17:52:14 -07002458VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002459vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002460 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002461 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002462 assert(my_data != NULL);
2463
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002464 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002465
Dustin Graves080069b2016-04-05 13:48:15 -06002466 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002467 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002468 }
2469}
2470
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002471VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2472 const VkAllocationCallbacks *pAllocator,
2473 VkPipelineCache *pPipelineCache) {
2474 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002475 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002476 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002477 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002478
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002479 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002480
Dustin Graves080069b2016-04-05 13:48:15 -06002481 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002482 result =
2483 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002484
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002485 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002486 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002487
2488 return result;
2489}
2490
Dustin Graves27a912a2016-03-07 17:52:14 -07002491VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002492vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002493 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002494 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002495 assert(my_data != NULL);
2496
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002497 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002498
Dustin Graves080069b2016-04-05 13:48:15 -06002499 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002500 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002501 }
2502}
2503
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002504VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2505vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
2506 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002507 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002508 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002509 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002510
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002511 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002512
Dustin Graves080069b2016-04-05 13:48:15 -06002513 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002514 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2515
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002516 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002517 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002518
2519 return result;
2520}
2521
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002522VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2523vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
2524 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002525 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002526 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002527 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002528
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002529 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002530
Dustin Graves080069b2016-04-05 13:48:15 -06002531 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002532 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2533
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002534 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002535 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002536
2537 return result;
2538}
2539
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002540bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002541 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2542
2543 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002544 if (pCreateInfos != nullptr) {
2545 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2546 if (pCreateInfos->basePipelineIndex != -1) {
2547 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002548 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2549 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002550 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2551 "pCreateInfos->flags "
2552 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2553 return false;
2554 }
2555 }
2556
2557 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2558 if (pCreateInfos->basePipelineIndex != -1) {
2559 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002560 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2561 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002562 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2563 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2564 "VK_NULL_HANDLE");
2565 return false;
2566 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002567 }
2568 }
2569
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002570 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002571 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002572 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2573 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002574 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2575 "unrecognized enumerator");
2576 return false;
2577 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002578 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002579
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002580 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002581 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002582 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002583 pCreateInfos[i].pStages[j].pName);
2584 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002585 }
2586
2587 return true;
2588}
2589
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002590VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2591vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2592 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2593 VkPipeline *pPipelines) {
2594 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002595 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002596 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002597 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002598
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002599 skipCall |= parameter_validation_vkCreateGraphicsPipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002600 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002601
Dustin Graves080069b2016-04-05 13:48:15 -06002602 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002603 PreCreateGraphicsPipelines(device, pCreateInfos);
2604
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002605 result = get_dispatch_table(pc_device_table_map, device)
2606 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002607
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002608 validate_result(my_data->report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002609 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002610
2611 return result;
2612}
2613
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002614bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002615 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2616
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002617 if (pCreateInfos != nullptr) {
2618 // TODO: Handle count!
2619 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002620 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002621 }
2622
2623 return true;
2624}
2625
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002626VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2627vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2628 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2629 VkPipeline *pPipelines) {
2630 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002631 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002632 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002633 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002634
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002635 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002636 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002637
Dustin Graves080069b2016-04-05 13:48:15 -06002638 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002639 PreCreateComputePipelines(device, pCreateInfos);
2640
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002641 result = get_dispatch_table(pc_device_table_map, device)
2642 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002643
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002644 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002645 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002646
2647 return result;
2648}
2649
Dustin Graves27a912a2016-03-07 17:52:14 -07002650VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002651vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002652 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002653 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002654 assert(my_data != NULL);
2655
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002656 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002657
Dustin Graves080069b2016-04-05 13:48:15 -06002658 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002659 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002660 }
2661}
2662
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002663VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2664vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2665 VkPipelineLayout *pPipelineLayout) {
2666 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002667 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002668 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002669 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002670
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002671 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002672
Dustin Graves080069b2016-04-05 13:48:15 -06002673 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002674 result =
2675 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002676
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002677 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002678 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002679
2680 return result;
2681}
2682
Dustin Graves27a912a2016-03-07 17:52:14 -07002683VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002684vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002685 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002686 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002687 assert(my_data != NULL);
2688
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002689 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002690
Dustin Graves080069b2016-04-05 13:48:15 -06002691 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002692 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002693 }
2694}
2695
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002696VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2697 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
2698 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002699 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002700 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002701 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002702
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002703 skipCall |= parameter_validation_vkCreateSampler(my_data->report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002704
Dustin Graves080069b2016-04-05 13:48:15 -06002705 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002706 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
2707
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002708 validate_result(my_data->report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002709 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002710
2711 return result;
2712}
2713
Dustin Graves27a912a2016-03-07 17:52:14 -07002714VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002715vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002716 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002717 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002718 assert(my_data != NULL);
2719
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002720 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002721
Dustin Graves080069b2016-04-05 13:48:15 -06002722 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002723 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002724 }
2725}
2726
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002727VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2728vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2729 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
2730 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002731 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002732 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002733 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002734
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002735 skipCall |= parameter_validation_vkCreateDescriptorSetLayout(my_data->report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002736
Dustin Graves080069b2016-04-05 13:48:15 -06002737 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002738 result =
2739 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002740
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002741 validate_result(my_data->report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002742 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002743
2744 return result;
2745}
2746
Dustin Graves27a912a2016-03-07 17:52:14 -07002747VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002748vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002749 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002750 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002751 assert(my_data != NULL);
2752
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002753 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002754
Dustin Graves080069b2016-04-05 13:48:15 -06002755 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002756 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002757 }
2758}
2759
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002760VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2761vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2762 VkDescriptorPool *pDescriptorPool) {
2763 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002764 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002765 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002766 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002767
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002768 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002769
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002770 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
2771
Dustin Graves080069b2016-04-05 13:48:15 -06002772 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002773 result =
2774 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002775
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002776 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002777 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002778
2779 return result;
2780}
2781
Dustin Graves27a912a2016-03-07 17:52:14 -07002782VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002783vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002784 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002785 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002786 assert(my_data != NULL);
2787
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002788 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002789
Dustin Graves080069b2016-04-05 13:48:15 -06002790 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002791 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002792 }
2793}
2794
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002795VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2796vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002797 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2798 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002799 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2800 assert(my_data != NULL);
2801
Dustin Graves20fd66f2016-04-18 18:33:21 -06002802 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002803
Dustin Graves20fd66f2016-04-18 18:33:21 -06002804 if (!skipCall) {
2805 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
2806
2807 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
2808 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002809
2810 return result;
2811}
2812
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002813VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2814vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
2815 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002816 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002817 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002818 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002819
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002820 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002821
Dustin Graves080069b2016-04-05 13:48:15 -06002822 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002823 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
2824
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002825 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002826 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002827
2828 return result;
2829}
2830
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002831VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
2832 uint32_t descriptorSetCount,
2833 const VkDescriptorSet *pDescriptorSets) {
2834 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002835 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002836 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002837 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002838
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002839 skipCall |= parameter_validation_vkFreeDescriptorSets(my_data->report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002840
Dustin Graves080069b2016-04-05 13:48:15 -06002841 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002842 result = get_dispatch_table(pc_device_table_map, device)
2843 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002844
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002845 validate_result(my_data->report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002846 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002847
2848 return result;
2849}
2850
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002851VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2852vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
2853 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Graves080069b2016-04-05 13:48:15 -06002854 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002855 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002856 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002857
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002858 skipCall |= parameter_validation_vkUpdateDescriptorSets(my_data->report_data, descriptorWriteCount, pDescriptorWrites,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002859 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002860
Dustin Graves080069b2016-04-05 13:48:15 -06002861 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002862 get_dispatch_table(pc_device_table_map, device)
2863 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002864 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002865}
2866
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002867VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2868 const VkAllocationCallbacks *pAllocator,
2869 VkFramebuffer *pFramebuffer) {
2870 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002871 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002872 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002873 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002874
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002875 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002876
Dustin Graves080069b2016-04-05 13:48:15 -06002877 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002878 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
2879
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002880 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002881 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002882
2883 return result;
2884}
2885
Dustin Graves27a912a2016-03-07 17:52:14 -07002886VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002887vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002888 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002889 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002890 assert(my_data != NULL);
2891
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002892 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002893
Dustin Graves080069b2016-04-05 13:48:15 -06002894 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002895 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002896 }
2897}
2898
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002899VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2900 const VkAllocationCallbacks *pAllocator,
2901 VkRenderPass *pRenderPass) {
2902 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002903 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002904 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002905 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002906
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002907 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002908
Dustin Graves080069b2016-04-05 13:48:15 -06002909 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002910 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
2911
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002912 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002913 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002914
2915 return result;
2916}
2917
Dustin Graves27a912a2016-03-07 17:52:14 -07002918VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002919vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002920 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002921 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002922 assert(my_data != NULL);
2923
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002924 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002925
Dustin Graves080069b2016-04-05 13:48:15 -06002926 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002927 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002928 }
2929}
2930
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002931VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2932vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06002933 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002934 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002935 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002936
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002937 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002938
Dustin Graves080069b2016-04-05 13:48:15 -06002939 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002940 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002941 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002942}
2943
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002944VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
2945 const VkAllocationCallbacks *pAllocator,
2946 VkCommandPool *pCommandPool) {
2947 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002948 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002949 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002950 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002951
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002952 skipCall |= validate_queue_family_indices(device, "vkCreateCommandPool", 1, &(pCreateInfo->queueFamilyIndex));
2953
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002954 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002955
Dustin Graves080069b2016-04-05 13:48:15 -06002956 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002957 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
2958
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002959 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002960 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002961
2962 return result;
2963}
2964
Dustin Graves27a912a2016-03-07 17:52:14 -07002965VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002966vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002967 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002968 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002969 assert(my_data != NULL);
2970
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002971 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002972
Dustin Graves080069b2016-04-05 13:48:15 -06002973 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002974 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002975 }
2976}
2977
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002978VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2979vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002980 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2981 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002982 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2983 assert(my_data != NULL);
2984
Dustin Graves20fd66f2016-04-18 18:33:21 -06002985 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002986
Dustin Graves20fd66f2016-04-18 18:33:21 -06002987 if (!skipCall) {
2988 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
2989
2990 validate_result(my_data->report_data, "vkResetCommandPool", result);
2991 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002992
2993 return result;
2994}
2995
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002996VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2997vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
2998 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002999 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003000 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003001 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003002
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003003 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003004
Dustin Graves080069b2016-04-05 13:48:15 -06003005 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003006 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3007
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003008 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003009 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003010
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003011 return result;
3012}
3013
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003014VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3015 uint32_t commandBufferCount,
3016 const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003017 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003018 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003019 assert(my_data != NULL);
3020
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003021 skipCall |= parameter_validation_vkFreeCommandBuffers(my_data->report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003022
Dustin Graves080069b2016-04-05 13:48:15 -06003023 if (!skipCall) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003024 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003025 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003026 }
3027}
3028
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003029VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3030vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3031 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003032 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003033 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003034 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003035
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003036 skipCall |= parameter_validation_vkBeginCommandBuffer(my_data->report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003037
Dustin Graves080069b2016-04-05 13:48:15 -06003038 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003039 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3040
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003041 validate_result(my_data->report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003042 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003043
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003044 return result;
3045}
3046
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003047VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003048 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3049 assert(my_data != NULL);
3050
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003051 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003052
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003053 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003054
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003055 return result;
3056}
3057
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003058VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3059vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003060 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003061 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3062 assert(my_data != NULL);
3063
Dustin Graves16d18972016-05-09 17:36:57 -06003064 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003065
Dustin Graves16d18972016-05-09 17:36:57 -06003066 if (!skip_call) {
3067 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3068
3069 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3070 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003071
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003072 return result;
3073}
3074
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003075VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3076vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003077 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003078 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3079 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003080
Dustin Graves29148ff2016-03-23 19:44:00 -06003081 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3082
Dustin Graves080069b2016-04-05 13:48:15 -06003083 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003084 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3085 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003086}
3087
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003088VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3089vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003090 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003091 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003092 assert(my_data != NULL);
3093
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003094 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003095
Dustin Graves080069b2016-04-05 13:48:15 -06003096 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003097 get_dispatch_table(pc_device_table_map, commandBuffer)
3098 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003099 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003100}
3101
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003102VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3103vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003104 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003105 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003106 assert(my_data != NULL);
3107
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003108 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003109
Dustin Graves080069b2016-04-05 13:48:15 -06003110 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003111 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
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 vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003116 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003117}
3118
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003119VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3120vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
3121 get_dispatch_table(pc_device_table_map, commandBuffer)
3122 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003123}
3124
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003125VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003126 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003127 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003128 assert(my_data != NULL);
3129
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003130 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003131
Dustin Graves080069b2016-04-05 13:48:15 -06003132 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003133 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3134 }
Cody Northrop12365112015-08-17 11:10:49 -06003135}
3136
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003137VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3138vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003139 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003140}
3141
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003142VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3143vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003144 bool skipCall = false;
3145 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3146 assert(my_data != NULL);
3147
3148 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3149
3150 if (!skipCall) {
3151 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3152 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003153}
3154
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003155VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3156vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003157 bool skipCall = false;
3158 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3159 assert(my_data != NULL);
3160
3161 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3162
3163 if (!skipCall) {
3164 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3165 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003166}
3167
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003168VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3169vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003170 bool skipCall = false;
3171 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3172 assert(my_data != NULL);
3173
3174 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3175
3176 if (!skipCall) {
3177 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3178 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003179}
3180
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003181VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3182vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3183 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3184 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003185 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003186 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003187 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003188
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003189 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003190 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003191
Dustin Graves080069b2016-04-05 13:48:15 -06003192 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003193 get_dispatch_table(pc_device_table_map, commandBuffer)
3194 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3195 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003196 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003197}
3198
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003199VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3200vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003201 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003202 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3203 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003204
Dustin Graves29148ff2016-03-23 19:44:00 -06003205 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3206
Dustin Graves080069b2016-04-05 13:48:15 -06003207 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003208 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3209 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003210}
3211
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003212VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3213 uint32_t bindingCount, const VkBuffer *pBuffers,
3214 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003215 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003216 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003217 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003218
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003219 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003220
Dustin Graves080069b2016-04-05 13:48:15 -06003221 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003222 get_dispatch_table(pc_device_table_map, commandBuffer)
3223 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003224 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003225}
3226
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003227bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3228 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003229 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003230 // 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 -07003231 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003232 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3233 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003234 return false;
3235 }
3236
3237 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003238 // 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 -07003239 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003240 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3241 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003242 return false;
3243 }
3244
3245 return true;
3246}
3247
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003248VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3249 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003250 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06003251
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003252 get_dispatch_table(pc_device_table_map, commandBuffer)
3253 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003254}
3255
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003256VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3257 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3258 uint32_t firstInstance) {
3259 get_dispatch_table(pc_device_table_map, commandBuffer)
3260 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003261}
3262
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003263VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3264vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003265 bool skipCall = false;
3266 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3267 assert(my_data != NULL);
3268
3269 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
3270
3271 if (!skipCall) {
3272 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
3273 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003274}
3275
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003276VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3277vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003278 bool skipCall = false;
3279 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3280 assert(my_data != NULL);
3281
3282 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
3283
3284 if (!skipCall) {
3285 get_dispatch_table(pc_device_table_map, commandBuffer)
3286 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
3287 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003288}
3289
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003290VK_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 -07003291 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003292}
3293
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003294VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3295vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003296 bool skipCall = false;
3297 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3298 assert(my_data != NULL);
3299
3300 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
3301
3302 if (!skipCall) {
3303 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
3304 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003305}
3306
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003307VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
3308 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003309 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003310 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003311 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003312
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003313 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003314
Dustin Graves080069b2016-04-05 13:48:15 -06003315 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003316 get_dispatch_table(pc_device_table_map, commandBuffer)
3317 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003318 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003319}
3320
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003321bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
3322 if (pRegions != nullptr) {
3323 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3324 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003325 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3326 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003327 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3328 return false;
3329 }
3330 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3331 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003332 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3333 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003334 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3335 return false;
3336 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003337 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003338
3339 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003340}
3341
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003342VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3343vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3344 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003345 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003346 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003347 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003348
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003349 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003350 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003351
Dustin Graves080069b2016-04-05 13:48:15 -06003352 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003353 PreCmdCopyImage(commandBuffer, pRegions);
3354
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003355 get_dispatch_table(pc_device_table_map, commandBuffer)
3356 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003357 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003358}
3359
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003360bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
3361 if (pRegions != nullptr) {
3362 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3363 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003364 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3365 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003366 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3367 return false;
3368 }
3369 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3370 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003371 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3372 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003373 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3374 return false;
3375 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003376 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003377
3378 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003379}
3380
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003381VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3382vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3383 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06003384 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003385 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003386 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003387
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003388 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003389 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003390
Dustin Graves080069b2016-04-05 13:48:15 -06003391 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003392 PreCmdBlitImage(commandBuffer, pRegions);
3393
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003394 get_dispatch_table(pc_device_table_map, commandBuffer)
3395 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003396 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003397}
3398
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003399bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3400 if (pRegions != nullptr) {
3401 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3402 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003403 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3404 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003405 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3406 "enumerator");
3407 return false;
3408 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003409 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003410
3411 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003412}
3413
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003414VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
3415 VkImage dstImage, VkImageLayout dstImageLayout,
3416 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003417 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003418 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003419 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003420
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003421 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003422 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003423
Dustin Graves080069b2016-04-05 13:48:15 -06003424 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003425 PreCmdCopyBufferToImage(commandBuffer, pRegions);
3426
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003427 get_dispatch_table(pc_device_table_map, commandBuffer)
3428 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003429 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003430}
3431
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003432bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3433 if (pRegions != nullptr) {
3434 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3435 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003436 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3437 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003438 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3439 "enumerator");
3440 return false;
3441 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003442 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003443
3444 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003445}
3446
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003447VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
3448 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
3449 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003450 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003451 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003452 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003453
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003454 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003455 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003456
Dustin Graves080069b2016-04-05 13:48:15 -06003457 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003458 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
3459
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003460 get_dispatch_table(pc_device_table_map, commandBuffer)
3461 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003462 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003463}
3464
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003465VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
3466 VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) {
Dustin Graves080069b2016-04-05 13:48:15 -06003467 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003468 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003469 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003470
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003471 skipCall |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003472
Dustin Graves080069b2016-04-05 13:48:15 -06003473 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003474 get_dispatch_table(pc_device_table_map, commandBuffer)
3475 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003476 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003477}
3478
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003479VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3480vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003481 bool skipCall = false;
3482 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3483 assert(my_data != NULL);
3484
3485 skipCall |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
3486
3487 if (!skipCall) {
3488 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
3489 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003490}
3491
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003492VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
3493 VkImageLayout imageLayout, const VkClearColorValue *pColor,
3494 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003495 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003496 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003497 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003498
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003499 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003500
Dustin Graves080069b2016-04-05 13:48:15 -06003501 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003502 get_dispatch_table(pc_device_table_map, commandBuffer)
3503 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003504 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003505}
3506
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003507VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3508vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
3509 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
3510 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003511 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003512 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003513 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003514
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003515 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003516 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003517
Dustin Graves080069b2016-04-05 13:48:15 -06003518 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003519 get_dispatch_table(pc_device_table_map, commandBuffer)
3520 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003521 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003522}
3523
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003524VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
3525 const VkClearAttachment *pAttachments, uint32_t rectCount,
3526 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06003527 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003528 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003529 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003530
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003531 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003532
Dustin Graves080069b2016-04-05 13:48:15 -06003533 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003534 get_dispatch_table(pc_device_table_map, commandBuffer)
3535 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003536 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003537}
3538
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003539bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
3540 if (pRegions != nullptr) {
3541 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3542 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3543 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06003544 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3545 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003546 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3547 return false;
3548 }
3549 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3550 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3551 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06003552 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3553 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003554 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3555 return false;
3556 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003557 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003558
3559 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003560}
3561
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003562VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3563vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3564 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003565 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003566 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003567 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003568
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003569 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003570 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003571
Dustin Graves080069b2016-04-05 13:48:15 -06003572 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003573 PreCmdResolveImage(commandBuffer, pRegions);
3574
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003575 get_dispatch_table(pc_device_table_map, commandBuffer)
3576 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003577 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003578}
3579
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003580VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3581vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003582 bool skipCall = false;
3583 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3584 assert(my_data != NULL);
3585
3586 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
3587
3588 if (!skipCall) {
3589 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
3590 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003591}
3592
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003593VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3594vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003595 bool skipCall = false;
3596 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3597 assert(my_data != NULL);
3598
3599 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
3600
3601 if (!skipCall) {
3602 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
3603 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003604}
3605
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003606VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3607vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
3608 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3609 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3610 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003611 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003612 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003613 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003614
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003615 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003616 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
3617 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003618
Dustin Graves080069b2016-04-05 13:48:15 -06003619 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003620 get_dispatch_table(pc_device_table_map, commandBuffer)
3621 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
3622 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003623 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003624}
3625
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003626VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3627vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
3628 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3629 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3630 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003631 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003632 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003633 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003634
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003635 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003636 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
3637 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003638
Dustin Graves080069b2016-04-05 13:48:15 -06003639 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003640 get_dispatch_table(pc_device_table_map, commandBuffer)
3641 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
3642 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003643 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003644}
3645
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003646VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3647vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003648 bool skipCall = false;
3649 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3650 assert(my_data != NULL);
3651
3652 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
3653
3654 if (!skipCall) {
3655 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
3656 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003657}
3658
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003659VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003660 bool skipCall = false;
3661 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3662 assert(my_data != NULL);
3663
3664 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
3665
3666 if (!skipCall) {
3667 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
3668 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003669}
3670
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003671VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3672vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003673 bool skipCall = false;
3674 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3675 assert(my_data != NULL);
3676
3677 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
3678
3679 if (!skipCall) {
3680 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
3681 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003682}
3683
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003684bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
3685 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003686
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08003687 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003688
3689 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003690}
3691
Dustin Graves20fd66f2016-04-18 18:33:21 -06003692VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
3693 VkQueryPool queryPool, uint32_t query) {
3694 bool skipCall = false;
3695 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3696 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003697
Dustin Graves20fd66f2016-04-18 18:33:21 -06003698 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
3699
3700 if (!skipCall) {
3701 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3702
3703 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3704 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003705}
3706
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003707VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3708vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
3709 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003710 bool skipCall = false;
3711 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3712 assert(my_data != NULL);
3713
3714 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
3715 dstOffset, stride, flags);
3716
3717 if (!skipCall) {
3718 get_dispatch_table(pc_device_table_map, commandBuffer)
3719 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
3720 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003721}
3722
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003723VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
3724 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
3725 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06003726 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003727 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003728 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003729
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003730 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003731
Dustin Graves080069b2016-04-05 13:48:15 -06003732 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003733 get_dispatch_table(pc_device_table_map, commandBuffer)
3734 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003735 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003736}
3737
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003738VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3739vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003740 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003741 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003742 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003743
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003744 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003745
Dustin Graves080069b2016-04-05 13:48:15 -06003746 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003747 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003748 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003749}
3750
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003751VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003752 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003753 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3754 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08003755
Dustin Graves29148ff2016-03-23 19:44:00 -06003756 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
3757
Dustin Graves080069b2016-04-05 13:48:15 -06003758 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003759 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
3760 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003761}
3762
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003763VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003764 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003765}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003766
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003767VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3768vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003769 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003770 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003771 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003772
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003773 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08003774
Dustin Graves080069b2016-04-05 13:48:15 -06003775 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003776 get_dispatch_table(pc_device_table_map, commandBuffer)
3777 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003778 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003779}
3780
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003781VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003782 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3783
Dustin Graves080069b2016-04-05 13:48:15 -06003784 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003785 return NULL;
3786 }
3787
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003788 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003789 return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003790 if (!strcmp(funcName, "vkDestroyDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003791 return (PFN_vkVoidFunction)vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003792 if (!strcmp(funcName, "vkGetDeviceQueue"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003793 return (PFN_vkVoidFunction)vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003794 if (!strcmp(funcName, "vkQueueSubmit"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003795 return (PFN_vkVoidFunction)vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003796 if (!strcmp(funcName, "vkQueueWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003797 return (PFN_vkVoidFunction)vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003798 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003799 return (PFN_vkVoidFunction)vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003800 if (!strcmp(funcName, "vkAllocateMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003801 return (PFN_vkVoidFunction)vkAllocateMemory;
Dustin Graves27a912a2016-03-07 17:52:14 -07003802 if (!strcmp(funcName, "vkFreeMemory"))
3803 return (PFN_vkVoidFunction)vkFreeMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003804 if (!strcmp(funcName, "vkMapMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003805 return (PFN_vkVoidFunction)vkMapMemory;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003806 if (!strcmp(funcName, "vkUnmapMemory"))
3807 return (PFN_vkVoidFunction)vkUnmapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003808 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003809 return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003810 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003811 return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003812 if (!strcmp(funcName, "vkGetDeviceMemoryCommitment"))
3813 return (PFN_vkVoidFunction)vkGetDeviceMemoryCommitment;
3814 if (!strcmp(funcName, "vkBindBufferMemory"))
3815 return (PFN_vkVoidFunction)vkBindBufferMemory;
3816 if (!strcmp(funcName, "vkBindImageMemory"))
3817 return (PFN_vkVoidFunction)vkBindImageMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003818 if (!strcmp(funcName, "vkCreateFence"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003819 return (PFN_vkVoidFunction)vkCreateFence;
Dustin Graves27a912a2016-03-07 17:52:14 -07003820 if (!strcmp(funcName, "vkDestroyFence"))
3821 return (PFN_vkVoidFunction)vkDestroyFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003822 if (!strcmp(funcName, "vkResetFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003823 return (PFN_vkVoidFunction)vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003824 if (!strcmp(funcName, "vkGetFenceStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003825 return (PFN_vkVoidFunction)vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003826 if (!strcmp(funcName, "vkWaitForFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003827 return (PFN_vkVoidFunction)vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003828 if (!strcmp(funcName, "vkCreateSemaphore"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003829 return (PFN_vkVoidFunction)vkCreateSemaphore;
Dustin Graves27a912a2016-03-07 17:52:14 -07003830 if (!strcmp(funcName, "vkDestroySemaphore"))
3831 return (PFN_vkVoidFunction)vkDestroySemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003832 if (!strcmp(funcName, "vkCreateEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003833 return (PFN_vkVoidFunction)vkCreateEvent;
Dustin Graves27a912a2016-03-07 17:52:14 -07003834 if (!strcmp(funcName, "vkDestroyEvent"))
3835 return (PFN_vkVoidFunction)vkDestroyEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003836 if (!strcmp(funcName, "vkGetEventStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003837 return (PFN_vkVoidFunction)vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003838 if (!strcmp(funcName, "vkSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003839 return (PFN_vkVoidFunction)vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003840 if (!strcmp(funcName, "vkResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003841 return (PFN_vkVoidFunction)vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003842 if (!strcmp(funcName, "vkCreateQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003843 return (PFN_vkVoidFunction)vkCreateQueryPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07003844 if (!strcmp(funcName, "vkDestroyQueryPool"))
3845 return (PFN_vkVoidFunction)vkDestroyQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003846 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003847 return (PFN_vkVoidFunction)vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003848 if (!strcmp(funcName, "vkCreateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003849 return (PFN_vkVoidFunction)vkCreateBuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07003850 if (!strcmp(funcName, "vkDestroyBuffer"))
3851 return (PFN_vkVoidFunction)vkDestroyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003852 if (!strcmp(funcName, "vkCreateBufferView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003853 return (PFN_vkVoidFunction)vkCreateBufferView;
Dustin Graves27a912a2016-03-07 17:52:14 -07003854 if (!strcmp(funcName, "vkDestroyBufferView"))
3855 return (PFN_vkVoidFunction)vkDestroyBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003856 if (!strcmp(funcName, "vkCreateImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003857 return (PFN_vkVoidFunction)vkCreateImage;
Dustin Graves27a912a2016-03-07 17:52:14 -07003858 if (!strcmp(funcName, "vkDestroyImage"))
3859 return (PFN_vkVoidFunction)vkDestroyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003860 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003861 return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003862 if (!strcmp(funcName, "vkCreateImageView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003863 return (PFN_vkVoidFunction)vkCreateImageView;
Dustin Graves27a912a2016-03-07 17:52:14 -07003864 if (!strcmp(funcName, "vkDestroyImageView"))
3865 return (PFN_vkVoidFunction)vkDestroyImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05003866 if (!strcmp(funcName, "vkCreateShaderModule"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003867 return (PFN_vkVoidFunction)vkCreateShaderModule;
Dustin Graves27a912a2016-03-07 17:52:14 -07003868 if (!strcmp(funcName, "vkDestroyShaderModule"))
3869 return (PFN_vkVoidFunction)vkDestroyShaderModule;
3870 if (!strcmp(funcName, "vkCreatePipelineCache"))
3871 return (PFN_vkVoidFunction)vkCreatePipelineCache;
3872 if (!strcmp(funcName, "vkDestroyPipelineCache"))
3873 return (PFN_vkVoidFunction)vkDestroyPipelineCache;
3874 if (!strcmp(funcName, "vkGetPipelineCacheData"))
3875 return (PFN_vkVoidFunction)vkGetPipelineCacheData;
3876 if (!strcmp(funcName, "vkMergePipelineCaches"))
3877 return (PFN_vkVoidFunction)vkMergePipelineCaches;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003878 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003879 return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003880 if (!strcmp(funcName, "vkCreateComputePipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003881 return (PFN_vkVoidFunction)vkCreateComputePipelines;
Dustin Graves27a912a2016-03-07 17:52:14 -07003882 if (!strcmp(funcName, "vkDestroyPipeline"))
3883 return (PFN_vkVoidFunction)vkDestroyPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003884 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003885 return (PFN_vkVoidFunction)vkCreatePipelineLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07003886 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
3887 return (PFN_vkVoidFunction)vkDestroyPipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003888 if (!strcmp(funcName, "vkCreateSampler"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003889 return (PFN_vkVoidFunction)vkCreateSampler;
Dustin Graves27a912a2016-03-07 17:52:14 -07003890 if (!strcmp(funcName, "vkDestroySampler"))
3891 return (PFN_vkVoidFunction)vkDestroySampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003892 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003893 return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07003894 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
3895 return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003896 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003897 return (PFN_vkVoidFunction)vkCreateDescriptorPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07003898 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
3899 return (PFN_vkVoidFunction)vkDestroyDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003900 if (!strcmp(funcName, "vkResetDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003901 return (PFN_vkVoidFunction)vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003902 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003903 return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003904 if (!strcmp(funcName, "vkCmdSetViewport"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003905 return (PFN_vkVoidFunction)vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003906 if (!strcmp(funcName, "vkCmdSetScissor"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003907 return (PFN_vkVoidFunction)vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003908 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003909 return (PFN_vkVoidFunction)vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003910 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003911 return (PFN_vkVoidFunction)vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003912 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003913 return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003914 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003915 return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003916 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003917 return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003918 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003919 return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003920 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003921 return (PFN_vkVoidFunction)vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003922 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003923 return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003924 if (!strcmp(funcName, "vkFreeCommandBuffers"))
3925 return (PFN_vkVoidFunction)vkFreeCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003926 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003927 return (PFN_vkVoidFunction)vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003928 if (!strcmp(funcName, "vkEndCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003929 return (PFN_vkVoidFunction)vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003930 if (!strcmp(funcName, "vkResetCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003931 return (PFN_vkVoidFunction)vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003932 if (!strcmp(funcName, "vkCmdBindPipeline"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003933 return (PFN_vkVoidFunction)vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003934 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003935 return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003936 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003937 return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003938 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003939 return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003940 if (!strcmp(funcName, "vkCmdDraw"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003941 return (PFN_vkVoidFunction)vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003942 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003943 return (PFN_vkVoidFunction)vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003944 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003945 return (PFN_vkVoidFunction)vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003946 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003947 return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003948 if (!strcmp(funcName, "vkCmdDispatch"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003949 return (PFN_vkVoidFunction)vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003950 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003951 return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003952 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003953 return (PFN_vkVoidFunction)vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003954 if (!strcmp(funcName, "vkCmdCopyImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003955 return (PFN_vkVoidFunction)vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003956 if (!strcmp(funcName, "vkCmdBlitImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003957 return (PFN_vkVoidFunction)vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003958 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003959 return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003960 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003961 return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003962 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003963 return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003964 if (!strcmp(funcName, "vkCmdFillBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003965 return (PFN_vkVoidFunction)vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003966 if (!strcmp(funcName, "vkCmdClearColorImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003967 return (PFN_vkVoidFunction)vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003968 if (!strcmp(funcName, "vkCmdResolveImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003969 return (PFN_vkVoidFunction)vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003970 if (!strcmp(funcName, "vkCmdSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003971 return (PFN_vkVoidFunction)vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003972 if (!strcmp(funcName, "vkCmdResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003973 return (PFN_vkVoidFunction)vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003974 if (!strcmp(funcName, "vkCmdWaitEvents"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003975 return (PFN_vkVoidFunction)vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003976 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003977 return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003978 if (!strcmp(funcName, "vkCmdBeginQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003979 return (PFN_vkVoidFunction)vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003980 if (!strcmp(funcName, "vkCmdEndQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003981 return (PFN_vkVoidFunction)vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003982 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003983 return (PFN_vkVoidFunction)vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003984 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003985 return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003986 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003987 return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003988 if (!strcmp(funcName, "vkCreateFramebuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003989 return (PFN_vkVoidFunction)vkCreateFramebuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07003990 if (!strcmp(funcName, "vkDestroyFramebuffer"))
3991 return (PFN_vkVoidFunction)vkDestroyFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003992 if (!strcmp(funcName, "vkCreateRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003993 return (PFN_vkVoidFunction)vkCreateRenderPass;
Dustin Graves27a912a2016-03-07 17:52:14 -07003994 if (!strcmp(funcName, "vkDestroyRenderPass"))
3995 return (PFN_vkVoidFunction)vkDestroyRenderPass;
3996 if (!strcmp(funcName, "vkGetRenderAreaGranularity"))
3997 return (PFN_vkVoidFunction)vkGetRenderAreaGranularity;
3998 if (!strcmp(funcName, "vkCreateCommandPool"))
3999 return (PFN_vkVoidFunction)vkCreateCommandPool;
4000 if (!strcmp(funcName, "vkDestroyCommandPool"))
4001 return (PFN_vkVoidFunction)vkDestroyCommandPool;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004002 if (!strcmp(funcName, "vkResetCommandPool"))
4003 return (PFN_vkVoidFunction)vkResetCommandPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004004 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004005 return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08004006 if (!strcmp(funcName, "vkCmdNextSubpass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004007 return (PFN_vkVoidFunction)vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06004008
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004009 if (device == NULL) {
4010 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004011 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004012
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004013 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004014 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004015 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004016}
4017
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004018VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004019 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004020 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004021 if (!strcmp(funcName, "vkCreateInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004022 return (PFN_vkVoidFunction)vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004023 if (!strcmp(funcName, "vkDestroyInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004024 return (PFN_vkVoidFunction)vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004025 if (!strcmp(funcName, "vkCreateDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004026 return (PFN_vkVoidFunction)vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004027 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004028 return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004029 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004030 return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004031 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004032 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06004033 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004034 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
Dustin Graves16d18972016-05-09 17:36:57 -06004035 if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties"))
4036 return (PFN_vkVoidFunction)vkGetPhysicalDeviceImageFormatProperties;
4037 if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties"))
4038 return (PFN_vkVoidFunction)vkGetPhysicalDeviceSparseImageFormatProperties;
4039 if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties"))
4040 return (PFN_vkVoidFunction)vkGetPhysicalDeviceQueueFamilyProperties;
4041 if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties"))
4042 return (PFN_vkVoidFunction)vkGetPhysicalDeviceMemoryProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004043 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004044 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004045 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004046 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004047 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004048 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004049 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004050 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004051
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004052 if (instance == NULL) {
4053 return NULL;
4054 }
4055
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004056 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004057
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004058 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004059 if (fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004060 return fptr;
4061
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004062 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004063 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004064 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004065}