blob: d1d09b624370d5349d56fc166669f6ca65ac2683 [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 Lobodzinski1ed594e2016-02-03 09:57:14 -070078 fprintf(stderr, "MID: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -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 Lobodzinski1ed594e2016-02-03 09:57:14 -070090 fprintf(stderr, "MDD: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -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) {
1217 skipCall |=
1218 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1219 "%s: the specified queueFamilyIndex cannot be VK_QUEUE_FAMILY_IGNORED.", function_name);
1220 } 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(
1224 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1225 "VkGetDeviceQueue parameter, uint32_t queueFamilyIndex %d, must have been given when the device was created.",
1226 indices[i]);
1227 return false;
1228 }
1229 }
1230 }
1231 return skipCall;
1232}
1233
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001234static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001235 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001236 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001237 return false;
1238 }
1239
1240 return true;
1241}
1242
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001243static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1244 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001245 return "unrecognized enumerator";
1246 }
1247
1248 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001249 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001250 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001251 }
1252
1253 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001254 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001255 enumeratorString += string;
1256
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001257 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001258 enumeratorString += '|';
1259 }
1260 }
1261
1262 return enumeratorString;
1263}
1264
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001265static const int MaxParamCheckerStringLength = 256;
1266
Dustin Graves080069b2016-04-05 13:48:15 -06001267static bool validate_string(debug_report_data *report_data, const char *apiName, const char *stringName,
1268 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001269 assert(apiName != nullptr);
1270 assert(stringName != nullptr);
1271 assert(validateString != nullptr);
1272
Dustin Graves080069b2016-04-05 13:48:15 -06001273 bool skipCall = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001274
1275 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1276
1277 if (result == VK_STRING_ERROR_NONE) {
1278 return skipCall;
1279 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001280 skipCall = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1281 "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001282 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001283 skipCall = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1284 "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001285 }
1286 return skipCall;
1287}
1288
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001289VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1290vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001291 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001292
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001293 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001294 assert(chain_info != nullptr);
1295 assert(chain_info->u.pLayerInfo != nullptr);
1296
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001297 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1298 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001299 if (fpCreateInstance == NULL) {
1300 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001301 }
1302
Dustin Graves842621d2016-03-03 14:17:08 -07001303 // Advance the link info for the next element on the chain
1304 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1305
1306 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001307
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001308 if (result == VK_SUCCESS) {
1309 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1310 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001311
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001312 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001313
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001314 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1315 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001316
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001317 // Look for one or more debug report create info structures
1318 // and setup a callback(s) for each one found.
1319 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1320 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1321 if (my_instance_data->num_tmp_callbacks > 0) {
1322 // Setup the temporary callback(s) here to catch early issues:
1323 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1324 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1325 // Failure of setting up one or more of the callback.
1326 // Therefore, clean up and don't use those callbacks:
1327 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1328 my_instance_data->num_tmp_callbacks = 0;
1329 }
1330 }
1331 }
1332
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001333 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001334
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001335 // Ordinarily we'd check these before calling down the chain, but none of the layer
1336 // support is in place until now, if we survive we can report the issue now.
1337 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001338
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001339 if (pCreateInfo->pApplicationInfo) {
1340 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1341 validate_string(my_instance_data->report_data, "vkCreateInstance",
1342 "pCreateInfo->VkApplicationInfo->pApplicationName",
1343 pCreateInfo->pApplicationInfo->pApplicationName);
1344 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001345
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001346 if (pCreateInfo->pApplicationInfo->pEngineName) {
1347 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1348 pCreateInfo->pApplicationInfo->pEngineName);
1349 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001350 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001351
1352 // Disable the tmp callbacks:
1353 if (my_instance_data->num_tmp_callbacks > 0) {
1354 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1355 my_instance_data->tmp_callbacks);
1356 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001357 }
1358
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001359 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001360}
1361
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001362VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001363 // Grab the key before the instance is destroyed.
1364 dispatch_key key = get_dispatch_key(instance);
Dustin Graves080069b2016-04-05 13:48:15 -06001365 bool skipCall = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001366 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001367 assert(my_data != NULL);
1368
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001369 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1370 bool callback_setup = false;
1371 if (my_data->num_tmp_callbacks > 0) {
1372 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1373 my_data->tmp_callbacks)) {
1374 callback_setup = true;
1375 }
1376 }
1377
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001378 skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001379
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001380 // Disable and cleanup the temporary callback(s):
1381 if (callback_setup) {
1382 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1383 }
1384 if (my_data->num_tmp_callbacks > 0) {
1385 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1386 my_data->num_tmp_callbacks = 0;
1387 }
1388
Dustin Graves080069b2016-04-05 13:48:15 -06001389 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001390 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001391 pTable->DestroyInstance(instance, pAllocator);
1392
1393 // Clean up logging callback, if any
1394 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001395 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1396 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001397 my_data->logging_callback.pop_back();
1398 }
1399
1400 layer_debug_report_destroy_instance(mid(instance));
1401 layer_data_map.erase(pTable);
1402
1403 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001404 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001405 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001406}
1407
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001408VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1409vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) {
1410 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001411 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001412 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001413 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001414
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001415 skipCall |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001416
Dustin Graves080069b2016-04-05 13:48:15 -06001417 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001418 result = get_dispatch_table(pc_instance_table_map, instance)
1419 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001420
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001421 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001422 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001423
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001424 return result;
1425}
1426
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001427VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1428vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Dustin Graves080069b2016-04-05 13:48:15 -06001429 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001430 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001431 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001432
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001433 skipCall |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001434
Dustin Graves080069b2016-04-05 13:48:15 -06001435 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001436 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001437 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001438}
1439
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001440VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1441vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001442 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001443 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001444 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001445
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001446 skipCall |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001447
Dustin Graves080069b2016-04-05 13:48:15 -06001448 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001449 get_dispatch_table(pc_instance_table_map, physicalDevice)
1450 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001451 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001452}
1453
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001454VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1455vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1456 VkImageUsageFlags usage, VkImageCreateFlags flags,
1457 VkImageFormatProperties *pImageFormatProperties) {
1458 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001459 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001460 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001461 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001462
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001463 skipCall |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001464 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001465
Dustin Graves080069b2016-04-05 13:48:15 -06001466 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001467 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1468 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1469 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001470
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001471 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001472 }
Chia-I Wu17241042015-10-31 00:31:16 +08001473
1474 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001475}
1476
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001477VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1478vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001479 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001480 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001481 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001482
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001483 skipCall |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001484
Dustin Graves080069b2016-04-05 13:48:15 -06001485 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001486 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001487 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001488}
1489
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001490VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1491vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1492 VkQueueFamilyProperties *pQueueFamilyProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001493 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001494 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001495 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001496
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001497 skipCall |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001498 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001499
Dustin Graves080069b2016-04-05 13:48:15 -06001500 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001501 get_dispatch_table(pc_instance_table_map, physicalDevice)
1502 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001503 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001504}
1505
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001506VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1507vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001508 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001509 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001510 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001511
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001512 skipCall |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001513
Dustin Graves080069b2016-04-05 13:48:15 -06001514 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001515 get_dispatch_table(pc_instance_table_map, physicalDevice)
1516 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001517 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001518}
1519
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001520void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1521 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001522 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001523
1524 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1525 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1526 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001527 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001528 "PARAMCHECK",
1529 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1530 "structure.",
1531 i);
1532 } else {
1533 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001534 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001535
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001536 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1537 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1538 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1539 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
1540 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1541 "PARAMCHECK",
1542 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1543 "between 0 and 1. Actual value is %f",
1544 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1545 }
1546 }
1547 }
1548
1549 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1550 log_msg(
1551 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001552 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1553 "of queue families.",
1554 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001555 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1556 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1557 log_msg(
1558 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001559 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1560 "queues for the given family index.",
1561 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001562 }
Michael Lentine774704f2016-01-27 13:36:46 -06001563 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001564 }
1565}
1566
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001567void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001568 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001569
1570 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1571 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1572 my_device_data->queueFamilyIndexMap.insert(
1573 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1574 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001575 }
1576}
1577
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001578VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice,
1579 const VkDeviceCreateInfo *pCreateInfo,
1580 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001581 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001582 * NOTE: We do not validate physicalDevice or any dispatchable
1583 * object as the first parameter. We couldn't get here if it was wrong!
1584 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001585
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001586 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001587 bool skipCall = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001588 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001589 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001590
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001591 skipCall |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001592
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001593 if (pCreateInfo != NULL) {
1594 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001595 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001596 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1597 pCreateInfo->ppEnabledLayerNames[i]);
1598 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001599 }
Michael Lentine774704f2016-01-27 13:36:46 -06001600
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001601 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001602 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001603 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1604 pCreateInfo->ppEnabledExtensionNames[i]);
1605 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001606 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001607 }
1608
Dustin Graves080069b2016-04-05 13:48:15 -06001609 if (!skipCall) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001610 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001611 assert(chain_info != nullptr);
1612 assert(chain_info->u.pLayerInfo != nullptr);
1613
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001614 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1615 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001616 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001617 if (fpCreateDevice == NULL) {
1618 return VK_ERROR_INITIALIZATION_FAILED;
1619 }
1620
1621 // Advance the link info for the next element on the chain
1622 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1623
1624 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001625
1626 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1627
1628 if (result == VK_SUCCESS) {
1629 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1630 assert(my_device_data != nullptr);
1631
1632 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1633 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1634
1635 uint32_t count;
1636 get_dispatch_table(pc_instance_table_map, physicalDevice)
1637 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
1638 std::vector<VkQueueFamilyProperties> properties(count);
1639 get_dispatch_table(pc_instance_table_map, physicalDevice)
1640 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
1641
1642 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1643 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001644 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001645 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001646
Jeremy Hayes99a96322015-06-26 12:48:09 -06001647 return result;
1648}
1649
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001650VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001651 dispatch_key key = get_dispatch_key(device);
Dustin Graves080069b2016-04-05 13:48:15 -06001652 bool skipCall = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001653 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1654 assert(my_data != NULL);
1655
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001656 skipCall |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001657
Dustin Graves080069b2016-04-05 13:48:15 -06001658 if (!skipCall) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001659 layer_debug_report_destroy_device(device);
1660
Jeremy Hayes99a96322015-06-26 12:48:09 -06001661#if DISPATCH_MAP_DEBUG
Dustin Graves27a912a2016-03-07 17:52:14 -07001662 fprintf(stderr, "Device: %p, key: %p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001663#endif
1664
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001665 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001666 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001667 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001668 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001669}
1670
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001671bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001672 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001673 assert(my_device_data != nullptr);
1674
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001675 validate_queue_family_indices(device, "vkGetDeviceQueue", 1, &queueFamilyIndex);
1676
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001677 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001678 if (queue_data->second <= queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001679 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001680 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1681 "was created.",
1682 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001683 return false;
1684 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001685
Michael Lentinebdf744f2016-01-27 15:43:43 -06001686 return true;
1687}
1688
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001689VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1690vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001691 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001692 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001693 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001694
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001695 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001696
Dustin Graves080069b2016-04-05 13:48:15 -06001697 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001698 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1699
1700 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001701 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001702}
1703
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001704VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1705vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
1706 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001707 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001708 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001709 assert(my_data != NULL);
1710
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001711 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001712
Dustin Graves080069b2016-04-05 13:48:15 -06001713 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001714 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1715
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001716 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001717 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001718
Jeremy Hayes99a96322015-06-26 12:48:09 -06001719 return result;
1720}
1721
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001722VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001723 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1724 assert(my_data != NULL);
1725
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001726 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001727
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001728 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001729
1730 return result;
1731}
1732
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001733VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001734 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1735 assert(my_data != NULL);
1736
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001737 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001738
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001739 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001740
1741 return result;
1742}
1743
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001744VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1745 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1746 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001747 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001748 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001749 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001750
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001751 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001752
Dustin Graves080069b2016-04-05 13:48:15 -06001753 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001754 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1755
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001756 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001757 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001758
1759 return result;
1760}
1761
Dustin Graves27a912a2016-03-07 17:52:14 -07001762VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001763vkFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001764 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001765 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001766 assert(my_data != NULL);
1767
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001768 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001769
Dustin Graves080069b2016-04-05 13:48:15 -06001770 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001771 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001772 }
1773}
1774
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001775VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1776vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
1777 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001778 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001779 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001780 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001781
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001782 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001783
Dustin Graves080069b2016-04-05 13:48:15 -06001784 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001785 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1786
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001787 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001788 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001789
1790 return result;
1791}
1792
Dustin Graves20fd66f2016-04-18 18:33:21 -06001793VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUnmapMemory(VkDevice device, VkDeviceMemory memory) {
1794 bool skipCall = false;
1795 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1796 assert(my_data != NULL);
1797
1798 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1799
1800 if (!skipCall) {
1801 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1802 }
1803}
1804
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001805VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1806vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1807 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001808 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001809 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001810 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001811
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001812 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001813
Dustin Graves080069b2016-04-05 13:48:15 -06001814 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001815 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1816
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001817 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001818 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001819
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001820 return result;
1821}
1822
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001823VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1824vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1825 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001826 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001827 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001828 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001829
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001830 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001831
Dustin Graves080069b2016-04-05 13:48:15 -06001832 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001833 result =
1834 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001835
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001836 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001837 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001838
Tony Barbourb1250542015-04-16 19:23:13 -06001839 return result;
1840}
1841
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001842VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1843vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001844 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001845 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001846 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001847
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001848 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001849
Dustin Graves080069b2016-04-05 13:48:15 -06001850 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001851 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001852 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001853}
1854
Dustin Graves20fd66f2016-04-18 18:33:21 -06001855VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1856 VkDeviceSize memoryOffset) {
1857 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1858 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001859 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1860 assert(my_data != NULL);
1861
Dustin Graves20fd66f2016-04-18 18:33:21 -06001862 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001863
Dustin Graves20fd66f2016-04-18 18:33:21 -06001864 if (!skipCall) {
1865 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1866
1867 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1868 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001869
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001870 return result;
1871}
1872
Dustin Graves20fd66f2016-04-18 18:33:21 -06001873VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1874 VkDeviceSize memoryOffset) {
1875 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1876 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001877 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1878 assert(my_data != NULL);
1879
Dustin Graves20fd66f2016-04-18 18:33:21 -06001880 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001881
Dustin Graves20fd66f2016-04-18 18:33:21 -06001882 if (!skipCall) {
1883 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1884
1885 validate_result(my_data->report_data, "vkBindImageMemory", result);
1886 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001887
1888 return result;
1889}
1890
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001891VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1892vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001893 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001894 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001895 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001896
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001897 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001898
Dustin Graves080069b2016-04-05 13:48:15 -06001899 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001900 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001901 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001902}
1903
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001904VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1905vkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001906 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001907 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001908 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001909
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001910 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001911
Dustin Graves080069b2016-04-05 13:48:15 -06001912 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001913 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001914 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001915}
1916
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001917bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1918 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1919 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001920 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001921 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1922 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001923 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001924 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1925 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001926 return false;
1927 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001928 }
1929
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001930 return true;
1931}
1932
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001933VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1934vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1935 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001936 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001937 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001938 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001939
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001940 skipCall |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001941 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001942
Dustin Graves080069b2016-04-05 13:48:15 -06001943 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001944 get_dispatch_table(pc_device_table_map, device)
1945 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001946
1947 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1948 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001949}
1950
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001951bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1952 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1953 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001954 if (pProperties != nullptr) {
1955 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1956 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001957 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001958 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
1959 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001960 return false;
1961 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001962 }
1963
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001964 return true;
1965}
1966
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001967VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1968vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1969 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1970 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001971 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001972 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001973 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001974
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001975 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001976 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001977
Dustin Graves080069b2016-04-05 13:48:15 -06001978 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001979 get_dispatch_table(pc_instance_table_map, physicalDevice)
1980 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
1981 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001982
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001983 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
1984 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001985 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001986}
1987
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001988VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1989vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
1990 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001991 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001992 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001993 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001994
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001995 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001996
Dustin Graves080069b2016-04-05 13:48:15 -06001997 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001998 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
1999
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002000 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002001 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002002
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002003 return result;
2004}
2005
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002006VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2007vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
2008 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002009 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002010 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002011 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002012
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002013 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002014
Dustin Graves080069b2016-04-05 13:48:15 -06002015 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002016 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2017
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002018 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002019 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002020
2021 return result;
2022}
2023
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002024VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002025 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002026 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002027 assert(my_data != NULL);
2028
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002029 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002030
Dustin Graves080069b2016-04-05 13:48:15 -06002031 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002032 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002033 }
2034}
2035
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002036VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
2037 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002038 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002039 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002040 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002041
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002042 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002043
Dustin Graves080069b2016-04-05 13:48:15 -06002044 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002045 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2046
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002047 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002048 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002049
2050 return result;
2051}
2052
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002053VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002054 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2055 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002056 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2057 assert(my_data != NULL);
2058
Dustin Graves20fd66f2016-04-18 18:33:21 -06002059 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002060
Dustin Graves20fd66f2016-04-18 18:33:21 -06002061 if (!skipCall) {
2062 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2063
2064 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2065 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002066
2067 return result;
2068}
2069
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002070VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2071vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
2072 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002073 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002074 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002075 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002076
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002077 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002078
Dustin Graves080069b2016-04-05 13:48:15 -06002079 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002080 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2081
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002082 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002083 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002084
2085 return result;
2086}
2087
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002088VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
2089 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2090 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002091 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002092 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002093 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002094
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002095 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002096
Dustin Graves080069b2016-04-05 13:48:15 -06002097 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002098 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2099
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002100 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002101 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002102
2103 return result;
2104}
2105
Dustin Graves27a912a2016-03-07 17:52:14 -07002106VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002107vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002108 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002109 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002110 assert(my_data != NULL);
2111
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002112 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002113
Dustin Graves080069b2016-04-05 13:48:15 -06002114 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002115 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002116 }
2117}
2118
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002119VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2120vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
2121 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002122 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002123 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002124 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002125
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002126 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002127
Dustin Graves080069b2016-04-05 13:48:15 -06002128 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002129 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2130
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002131 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002132 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002133
2134 return result;
2135}
2136
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002137VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002138 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002139 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002140 assert(my_data != NULL);
2141
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002142 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002143
Dustin Graves080069b2016-04-05 13:48:15 -06002144 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002145 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002146 }
2147}
2148
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002149VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002150 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2151 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002152 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2153 assert(my_data != NULL);
2154
Dustin Graves20fd66f2016-04-18 18:33:21 -06002155 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002156
Dustin Graves20fd66f2016-04-18 18:33:21 -06002157 if (!skipCall) {
2158 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2159
2160 validate_result(my_data->report_data, "vkGetEventStatus", result);
2161 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002162
2163 return result;
2164}
2165
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002166VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002167 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2168 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002169 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2170 assert(my_data != NULL);
2171
Dustin Graves20fd66f2016-04-18 18:33:21 -06002172 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002173
Dustin Graves20fd66f2016-04-18 18:33:21 -06002174 if (!skipCall) {
2175 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2176
2177 validate_result(my_data->report_data, "vkSetEvent", result);
2178 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002179
2180 return result;
2181}
2182
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002183VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002184 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2185 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002186 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2187 assert(my_data != NULL);
2188
Dustin Graves20fd66f2016-04-18 18:33:21 -06002189 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002190
Dustin Graves20fd66f2016-04-18 18:33:21 -06002191 if (!skipCall) {
2192 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2193
2194 validate_result(my_data->report_data, "vkResetEvent", result);
2195 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002196
2197 return result;
2198}
2199
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002200VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2201 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
2202 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002203 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002204 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002205 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002206
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002207 skipCall |= parameter_validation_vkCreateQueryPool(my_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002208
Dustin Graves080069b2016-04-05 13:48:15 -06002209 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002210 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2211
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002212 validate_result(my_data->report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002213 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002214
2215 return result;
2216}
2217
Dustin Graves27a912a2016-03-07 17:52:14 -07002218VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002219vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002220 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002221 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002222 assert(my_data != NULL);
2223
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002224 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002225
Dustin Graves080069b2016-04-05 13:48:15 -06002226 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002227 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002228 }
2229}
2230
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002231VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2232 uint32_t queryCount, size_t dataSize, void *pData,
2233 VkDeviceSize stride, VkQueryResultFlags flags) {
2234 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002235 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002236 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002237 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002238
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002239 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002240 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002241
Dustin Graves080069b2016-04-05 13:48:15 -06002242 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002243 result = get_dispatch_table(pc_device_table_map, device)
2244 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002245
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002246 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002247 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002248
2249 return result;
2250}
2251
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002252bool PreCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo) {
2253 if (pCreateInfo != nullptr) {
Dustin Graves29148ff2016-03-23 19:44:00 -06002254 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002255 validate_queue_family_indices(device, "vkCreateBuffer", pCreateInfo->queueFamilyIndexCount,
2256 pCreateInfo->pQueueFamilyIndices);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002257 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002258 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002259
2260 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002261}
2262
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002263VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2264vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
2265 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002266 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002267 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002268 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002269
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002270 skipCall |= parameter_validation_vkCreateBuffer(my_data->report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002271
Dustin Graves080069b2016-04-05 13:48:15 -06002272 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002273 PreCreateBuffer(device, pCreateInfo);
2274
2275 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2276
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002277 validate_result(my_data->report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002278 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002279
2280 return result;
2281}
2282
Dustin Graves27a912a2016-03-07 17:52:14 -07002283VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002284vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002285 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002286 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002287 assert(my_data != NULL);
2288
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002289 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002290
Dustin Graves080069b2016-04-05 13:48:15 -06002291 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002292 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002293 }
2294}
2295
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002296VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2297 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
2298 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002299 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002300 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002301 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002302
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002303 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002304
Dustin Graves080069b2016-04-05 13:48:15 -06002305 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002306 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2307
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002308 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002309 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002310
2311 return result;
2312}
2313
Dustin Graves27a912a2016-03-07 17:52:14 -07002314VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002315vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002316 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002317 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002318 assert(my_data != NULL);
2319
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002320 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002321
Dustin Graves080069b2016-04-05 13:48:15 -06002322 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002323 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002324 }
2325}
2326
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002327bool PreCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo) {
2328 if (pCreateInfo != nullptr) {
Dustin Graves29148ff2016-03-23 19:44:00 -06002329 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002330 validate_queue_family_indices(device, "vkCreateImage", pCreateInfo->queueFamilyIndexCount,
2331 pCreateInfo->pQueueFamilyIndices);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002332 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002333 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002334
2335 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002336}
2337
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002338VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2339vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
2340 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002341 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002342 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002343 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002344
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002345 skipCall |= parameter_validation_vkCreateImage(my_data->report_data, pCreateInfo, pAllocator, pImage);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002346
Dustin Graves080069b2016-04-05 13:48:15 -06002347 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002348 PreCreateImage(device, pCreateInfo);
2349
2350 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2351
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002352 validate_result(my_data->report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002353 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002354
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002355 return result;
2356}
2357
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002358VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002359 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002360 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002361 assert(my_data != NULL);
2362
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002363 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002364
Dustin Graves080069b2016-04-05 13:48:15 -06002365 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002366 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002367 }
2368}
2369
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002370bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2371 if (pSubresource != nullptr) {
2372 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2373 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
2374 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2375 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2376 return false;
2377 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002378 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002379
2380 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002381}
2382
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002383VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2384vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002385 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002386 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002387 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002388
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002389 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002390
Dustin Graves080069b2016-04-05 13:48:15 -06002391 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002392 PreGetImageSubresourceLayout(device, pSubresource);
2393
2394 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002395 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002396}
2397
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002398VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2399 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
2400 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002401 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002402 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002403 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002404
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002405 skipCall |= parameter_validation_vkCreateImageView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002406
Dustin Graves080069b2016-04-05 13:48:15 -06002407 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002408 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2409
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002410 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002411 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002412
2413 return result;
2414}
2415
Dustin Graves27a912a2016-03-07 17:52:14 -07002416VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002417vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002418 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002419 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002420 assert(my_data != NULL);
2421
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002422 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002423
Dustin Graves080069b2016-04-05 13:48:15 -06002424 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002425 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002426 }
2427}
2428
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002429VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2430 const VkAllocationCallbacks *pAllocator,
2431 VkShaderModule *pShaderModule) {
2432 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002433 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002434 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002435 assert(my_data != NULL);
2436
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002437 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002438
Dustin Graves080069b2016-04-05 13:48:15 -06002439 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002440 result =
2441 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002442
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002443 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002444 }
2445
Michael Lentine03d8e572015-09-15 14:59:14 -05002446 return result;
2447}
2448
Dustin Graves27a912a2016-03-07 17:52:14 -07002449VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002450vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002451 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002452 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002453 assert(my_data != NULL);
2454
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002455 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002456
Dustin Graves080069b2016-04-05 13:48:15 -06002457 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002458 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002459 }
2460}
2461
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002462VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2463 const VkAllocationCallbacks *pAllocator,
2464 VkPipelineCache *pPipelineCache) {
2465 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002466 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002467 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002468 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002469
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002470 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002471
Dustin Graves080069b2016-04-05 13:48:15 -06002472 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002473 result =
2474 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002475
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002476 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002477 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002478
2479 return result;
2480}
2481
Dustin Graves27a912a2016-03-07 17:52:14 -07002482VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002483vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002484 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002485 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002486 assert(my_data != NULL);
2487
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002488 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002489
Dustin Graves080069b2016-04-05 13:48:15 -06002490 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002491 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002492 }
2493}
2494
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002495VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2496vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
2497 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002498 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002499 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002500 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002501
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002502 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002503
Dustin Graves080069b2016-04-05 13:48:15 -06002504 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002505 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2506
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002507 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002508 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002509
2510 return result;
2511}
2512
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002513VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2514vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
2515 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002516 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002517 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002518 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002519
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002520 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002521
Dustin Graves080069b2016-04-05 13:48:15 -06002522 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002523 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2524
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002525 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002526 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002527
2528 return result;
2529}
2530
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002531bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002532 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2533
2534 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002535 if (pCreateInfos != nullptr) {
2536 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2537 if (pCreateInfos->basePipelineIndex != -1) {
2538 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2539 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2540 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2541 "pCreateInfos->flags "
2542 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2543 return false;
2544 }
2545 }
2546
2547 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2548 if (pCreateInfos->basePipelineIndex != -1) {
2549 log_msg(
2550 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2551 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2552 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2553 "VK_NULL_HANDLE");
2554 return false;
2555 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002556 }
2557 }
2558
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002559 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002560 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
2561 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2562 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2563 "unrecognized enumerator");
2564 return false;
2565 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002566 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002567
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002568 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002569 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002570 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002571 pCreateInfos[i].pStages[j].pName);
2572 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002573 }
2574
2575 return true;
2576}
2577
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002578VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2579vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2580 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2581 VkPipeline *pPipelines) {
2582 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002583 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002584 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002585 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002586
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002587 skipCall |= parameter_validation_vkCreateGraphicsPipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002588 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002589
Dustin Graves080069b2016-04-05 13:48:15 -06002590 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002591 PreCreateGraphicsPipelines(device, pCreateInfos);
2592
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002593 result = get_dispatch_table(pc_device_table_map, device)
2594 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002595
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002596 validate_result(my_data->report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002597 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002598
2599 return result;
2600}
2601
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002602bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002603 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2604
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002605 if (pCreateInfos != nullptr) {
2606 // TODO: Handle count!
2607 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002608 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002609 }
2610
2611 return true;
2612}
2613
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002614VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2615vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2616 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2617 VkPipeline *pPipelines) {
2618 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002619 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002620 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002621 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002622
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002623 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002624 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002625
Dustin Graves080069b2016-04-05 13:48:15 -06002626 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002627 PreCreateComputePipelines(device, pCreateInfos);
2628
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002629 result = get_dispatch_table(pc_device_table_map, device)
2630 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002631
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002632 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002633 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002634
2635 return result;
2636}
2637
Dustin Graves27a912a2016-03-07 17:52:14 -07002638VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002639vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002640 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002641 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002642 assert(my_data != NULL);
2643
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002644 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002645
Dustin Graves080069b2016-04-05 13:48:15 -06002646 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002647 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002648 }
2649}
2650
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002651VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2652vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2653 VkPipelineLayout *pPipelineLayout) {
2654 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002655 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002656 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002657 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002658
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002659 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002660
Dustin Graves080069b2016-04-05 13:48:15 -06002661 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002662 result =
2663 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002664
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002665 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002666 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002667
2668 return result;
2669}
2670
Dustin Graves27a912a2016-03-07 17:52:14 -07002671VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002672vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002673 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002674 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002675 assert(my_data != NULL);
2676
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002677 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002678
Dustin Graves080069b2016-04-05 13:48:15 -06002679 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002680 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002681 }
2682}
2683
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002684VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2685 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
2686 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002687 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002688 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002689 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002690
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002691 skipCall |= parameter_validation_vkCreateSampler(my_data->report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002692
Dustin Graves080069b2016-04-05 13:48:15 -06002693 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002694 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
2695
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002696 validate_result(my_data->report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002697 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002698
2699 return result;
2700}
2701
Dustin Graves27a912a2016-03-07 17:52:14 -07002702VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002703vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002704 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002705 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002706 assert(my_data != NULL);
2707
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002708 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002709
Dustin Graves080069b2016-04-05 13:48:15 -06002710 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002711 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002712 }
2713}
2714
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002715VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2716vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2717 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
2718 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002719 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002720 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002721 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002722
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002723 skipCall |= parameter_validation_vkCreateDescriptorSetLayout(my_data->report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002724
Dustin Graves080069b2016-04-05 13:48:15 -06002725 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002726 result =
2727 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002728
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002729 validate_result(my_data->report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002730 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002731
2732 return result;
2733}
2734
Dustin Graves27a912a2016-03-07 17:52:14 -07002735VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002736vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002737 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002738 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002739 assert(my_data != NULL);
2740
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002741 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002742
Dustin Graves080069b2016-04-05 13:48:15 -06002743 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002744 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002745 }
2746}
2747
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002748VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2749vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2750 VkDescriptorPool *pDescriptorPool) {
2751 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002752 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002753 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002754 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002755
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002756 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002757
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002758 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
2759
Dustin Graves080069b2016-04-05 13:48:15 -06002760 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002761 result =
2762 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002763
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002764 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002765 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002766
2767 return result;
2768}
2769
Dustin Graves27a912a2016-03-07 17:52:14 -07002770VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002771vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002772 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002773 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002774 assert(my_data != NULL);
2775
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002776 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002777
Dustin Graves080069b2016-04-05 13:48:15 -06002778 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002779 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002780 }
2781}
2782
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002783VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2784vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002785 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2786 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002787 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2788 assert(my_data != NULL);
2789
Dustin Graves20fd66f2016-04-18 18:33:21 -06002790 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002791
Dustin Graves20fd66f2016-04-18 18:33:21 -06002792 if (!skipCall) {
2793 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
2794
2795 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
2796 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002797
2798 return result;
2799}
2800
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002801VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2802vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
2803 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002804 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002805 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002806 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002807
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002808 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002809
Dustin Graves080069b2016-04-05 13:48:15 -06002810 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002811 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
2812
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002813 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002814 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002815
2816 return result;
2817}
2818
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002819VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
2820 uint32_t descriptorSetCount,
2821 const VkDescriptorSet *pDescriptorSets) {
2822 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002823 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002824 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002825 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002826
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002827 skipCall |= parameter_validation_vkFreeDescriptorSets(my_data->report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002828
Dustin Graves080069b2016-04-05 13:48:15 -06002829 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002830 result = get_dispatch_table(pc_device_table_map, device)
2831 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002832
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002833 validate_result(my_data->report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002834 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002835
2836 return result;
2837}
2838
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002839VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2840vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
2841 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Graves080069b2016-04-05 13:48:15 -06002842 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002843 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002844 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002845
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002846 skipCall |= parameter_validation_vkUpdateDescriptorSets(my_data->report_data, descriptorWriteCount, pDescriptorWrites,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002847 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002848
Dustin Graves080069b2016-04-05 13:48:15 -06002849 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002850 get_dispatch_table(pc_device_table_map, device)
2851 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002852 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002853}
2854
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002855VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2856 const VkAllocationCallbacks *pAllocator,
2857 VkFramebuffer *pFramebuffer) {
2858 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002859 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002860 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002861 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002862
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002863 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002864
Dustin Graves080069b2016-04-05 13:48:15 -06002865 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002866 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
2867
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002868 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002869 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002870
2871 return result;
2872}
2873
Dustin Graves27a912a2016-03-07 17:52:14 -07002874VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002875vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002876 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002877 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002878 assert(my_data != NULL);
2879
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002880 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002881
Dustin Graves080069b2016-04-05 13:48:15 -06002882 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002883 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002884 }
2885}
2886
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002887VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2888 const VkAllocationCallbacks *pAllocator,
2889 VkRenderPass *pRenderPass) {
2890 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002891 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002892 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002893 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002894
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002895 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002896
Dustin Graves080069b2016-04-05 13:48:15 -06002897 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002898 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
2899
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002900 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002901 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002902
2903 return result;
2904}
2905
Dustin Graves27a912a2016-03-07 17:52:14 -07002906VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002907vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002908 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002909 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002910 assert(my_data != NULL);
2911
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002912 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002913
Dustin Graves080069b2016-04-05 13:48:15 -06002914 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002915 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002916 }
2917}
2918
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002919VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2920vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06002921 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002922 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002923 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002924
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002925 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002926
Dustin Graves080069b2016-04-05 13:48:15 -06002927 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002928 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002929 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002930}
2931
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002932VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
2933 const VkAllocationCallbacks *pAllocator,
2934 VkCommandPool *pCommandPool) {
2935 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002936 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002937 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002938 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002939
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06002940 skipCall |= validate_queue_family_indices(device, "vkCreateCommandPool", 1, &(pCreateInfo->queueFamilyIndex));
2941
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002942 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002943
Dustin Graves080069b2016-04-05 13:48:15 -06002944 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002945 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
2946
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002947 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002948 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002949
2950 return result;
2951}
2952
Dustin Graves27a912a2016-03-07 17:52:14 -07002953VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002954vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002955 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002956 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002957 assert(my_data != NULL);
2958
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002959 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002960
Dustin Graves080069b2016-04-05 13:48:15 -06002961 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002962 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002963 }
2964}
2965
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002966VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2967vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002968 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2969 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002970 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2971 assert(my_data != NULL);
2972
Dustin Graves20fd66f2016-04-18 18:33:21 -06002973 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002974
Dustin Graves20fd66f2016-04-18 18:33:21 -06002975 if (!skipCall) {
2976 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
2977
2978 validate_result(my_data->report_data, "vkResetCommandPool", result);
2979 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002980
2981 return result;
2982}
2983
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002984VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2985vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
2986 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002987 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002988 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002989 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002990
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002991 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002992
Dustin Graves080069b2016-04-05 13:48:15 -06002993 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002994 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
2995
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002996 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002997 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002998
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002999 return result;
3000}
3001
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003002VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3003 uint32_t commandBufferCount,
3004 const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003005 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003006 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003007 assert(my_data != NULL);
3008
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003009 skipCall |= parameter_validation_vkFreeCommandBuffers(my_data->report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003010
Dustin Graves080069b2016-04-05 13:48:15 -06003011 if (!skipCall) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003012 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003013 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003014 }
3015}
3016
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003017VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3018vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3019 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003020 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003021 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003022 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003023
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003024 skipCall |= parameter_validation_vkBeginCommandBuffer(my_data->report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003025
Dustin Graves080069b2016-04-05 13:48:15 -06003026 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003027 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3028
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003029 validate_result(my_data->report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003030 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003031
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003032 return result;
3033}
3034
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003035VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003036 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3037 assert(my_data != NULL);
3038
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003039 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003040
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003041 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003042
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003043 return result;
3044}
3045
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003046VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3047vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
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)->ResetCommandBuffer(commandBuffer, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003052
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003053 validate_result(my_data->report_data, "vkResetCommandBuffer", 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 void VKAPI_CALL
3059vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003060 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003061 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3062 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003063
Dustin Graves29148ff2016-03-23 19:44:00 -06003064 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3065
Dustin Graves080069b2016-04-05 13:48:15 -06003066 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003067 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3068 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003069}
3070
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003071VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3072vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003073 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003074 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003075 assert(my_data != NULL);
3076
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003077 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003078
Dustin Graves080069b2016-04-05 13:48:15 -06003079 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003080 get_dispatch_table(pc_device_table_map, commandBuffer)
3081 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003082 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003083}
3084
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003085VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3086vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003087 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003088 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003089 assert(my_data != NULL);
3090
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003091 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003092
Dustin Graves080069b2016-04-05 13:48:15 -06003093 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003094 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3095 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003096}
3097
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003098VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003099 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003100}
3101
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003102VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3103vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
3104 get_dispatch_table(pc_device_table_map, commandBuffer)
3105 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003106}
3107
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003108VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003109 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003110 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003111 assert(my_data != NULL);
3112
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003113 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003114
Dustin Graves080069b2016-04-05 13:48:15 -06003115 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003116 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3117 }
Cody Northrop12365112015-08-17 11:10:49 -06003118}
3119
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003120VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3121vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003122 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003123}
3124
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003125VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3126vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003127 bool skipCall = false;
3128 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3129 assert(my_data != NULL);
3130
3131 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3132
3133 if (!skipCall) {
3134 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3135 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003136}
3137
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003138VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3139vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003140 bool skipCall = false;
3141 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3142 assert(my_data != NULL);
3143
3144 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3145
3146 if (!skipCall) {
3147 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3148 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003149}
3150
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003151VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3152vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003153 bool skipCall = false;
3154 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3155 assert(my_data != NULL);
3156
3157 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3158
3159 if (!skipCall) {
3160 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3161 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003162}
3163
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003164VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3165vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3166 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3167 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003168 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003169 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003170 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003171
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003172 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003173 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003174
Dustin Graves080069b2016-04-05 13:48:15 -06003175 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003176 get_dispatch_table(pc_device_table_map, commandBuffer)
3177 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3178 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003179 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003180}
3181
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003182VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3183vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003184 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003185 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3186 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003187
Dustin Graves29148ff2016-03-23 19:44:00 -06003188 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3189
Dustin Graves080069b2016-04-05 13:48:15 -06003190 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003191 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3192 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003193}
3194
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003195VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3196 uint32_t bindingCount, const VkBuffer *pBuffers,
3197 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003198 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003199 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003200 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003201
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003202 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003203
Dustin Graves080069b2016-04-05 13:48:15 -06003204 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003205 get_dispatch_table(pc_device_table_map, commandBuffer)
3206 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003207 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003208}
3209
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003210bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3211 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003212 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003213 // 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 -07003214 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003215 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003216 "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003217 return false;
3218 }
3219
3220 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003221 // 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 -07003222 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003223 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003224 "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003225 return false;
3226 }
3227
3228 return true;
3229}
3230
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003231VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3232 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003233 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06003234
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003235 get_dispatch_table(pc_device_table_map, commandBuffer)
3236 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003237}
3238
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003239VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3240 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3241 uint32_t firstInstance) {
3242 get_dispatch_table(pc_device_table_map, commandBuffer)
3243 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003244}
3245
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003246VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3247vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003248 bool skipCall = false;
3249 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3250 assert(my_data != NULL);
3251
3252 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
3253
3254 if (!skipCall) {
3255 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
3256 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003257}
3258
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003259VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3260vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003261 bool skipCall = false;
3262 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3263 assert(my_data != NULL);
3264
3265 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
3266
3267 if (!skipCall) {
3268 get_dispatch_table(pc_device_table_map, commandBuffer)
3269 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
3270 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003271}
3272
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003273VK_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 -07003274 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003275}
3276
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003277VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3278vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003279 bool skipCall = false;
3280 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3281 assert(my_data != NULL);
3282
3283 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
3284
3285 if (!skipCall) {
3286 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
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 vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
3291 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003292 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003293 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003294 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003295
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003296 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003297
Dustin Graves080069b2016-04-05 13:48:15 -06003298 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003299 get_dispatch_table(pc_device_table_map, commandBuffer)
3300 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003301 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003302}
3303
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003304bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
3305 if (pRegions != nullptr) {
3306 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3307 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3308 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3309 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3310 return false;
3311 }
3312 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3313 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3314 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3315 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3316 return false;
3317 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003318 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003319
3320 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003321}
3322
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003323VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3324vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3325 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003326 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003327 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003328 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003329
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003330 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003331 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003332
Dustin Graves080069b2016-04-05 13:48:15 -06003333 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003334 PreCmdCopyImage(commandBuffer, pRegions);
3335
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003336 get_dispatch_table(pc_device_table_map, commandBuffer)
3337 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003338 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003339}
3340
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003341bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
3342 if (pRegions != nullptr) {
3343 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3344 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3345 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3346 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3347 return false;
3348 }
3349 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3350 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3351 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3352 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3353 return false;
3354 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003355 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003356
3357 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003358}
3359
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003360VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3361vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3362 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06003363 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003364 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003365 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003366
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003367 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003368 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003369
Dustin Graves080069b2016-04-05 13:48:15 -06003370 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003371 PreCmdBlitImage(commandBuffer, pRegions);
3372
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003373 get_dispatch_table(pc_device_table_map, commandBuffer)
3374 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003375 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003376}
3377
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003378bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3379 if (pRegions != nullptr) {
3380 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3381 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3382 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3383 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3384 "enumerator");
3385 return false;
3386 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003387 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003388
3389 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003390}
3391
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003392VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
3393 VkImage dstImage, VkImageLayout dstImageLayout,
3394 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003395 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003396 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003397 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003398
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003399 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003400 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003401
Dustin Graves080069b2016-04-05 13:48:15 -06003402 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003403 PreCmdCopyBufferToImage(commandBuffer, pRegions);
3404
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003405 get_dispatch_table(pc_device_table_map, commandBuffer)
3406 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003407 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003408}
3409
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003410bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3411 if (pRegions != nullptr) {
3412 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3413 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3414 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3415 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3416 "enumerator");
3417 return false;
3418 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003419 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003420
3421 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003422}
3423
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003424VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
3425 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
3426 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003427 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003428 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003429 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003430
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003431 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003432 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003433
Dustin Graves080069b2016-04-05 13:48:15 -06003434 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003435 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
3436
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003437 get_dispatch_table(pc_device_table_map, commandBuffer)
3438 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003439 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003440}
3441
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003442VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
3443 VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) {
Dustin Graves080069b2016-04-05 13:48:15 -06003444 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003445 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003446 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003447
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003448 skipCall |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003449
Dustin Graves080069b2016-04-05 13:48:15 -06003450 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003451 get_dispatch_table(pc_device_table_map, commandBuffer)
3452 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003453 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003454}
3455
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003456VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3457vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003458 bool skipCall = false;
3459 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3460 assert(my_data != NULL);
3461
3462 skipCall |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
3463
3464 if (!skipCall) {
3465 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
3466 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003467}
3468
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003469VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
3470 VkImageLayout imageLayout, const VkClearColorValue *pColor,
3471 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003472 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003473 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003474 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003475
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003476 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003477
Dustin Graves080069b2016-04-05 13:48:15 -06003478 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003479 get_dispatch_table(pc_device_table_map, commandBuffer)
3480 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003481 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003482}
3483
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003484VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3485vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
3486 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
3487 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003488 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003489 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003490 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003491
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003492 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003493 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003494
Dustin Graves080069b2016-04-05 13:48:15 -06003495 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003496 get_dispatch_table(pc_device_table_map, commandBuffer)
3497 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003498 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003499}
3500
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003501VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
3502 const VkClearAttachment *pAttachments, uint32_t rectCount,
3503 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06003504 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003505 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003506 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003507
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003508 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003509
Dustin Graves080069b2016-04-05 13:48:15 -06003510 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003511 get_dispatch_table(pc_device_table_map, commandBuffer)
3512 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003513 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003514}
3515
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003516bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
3517 if (pRegions != nullptr) {
3518 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3519 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3520 log_msg(
3521 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3522 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3523 return false;
3524 }
3525 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3526 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3527 log_msg(
3528 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3529 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3530 return false;
3531 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003532 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003533
3534 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003535}
3536
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003537VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3538vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3539 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003540 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003541 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003542 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003543
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003544 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003545 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003546
Dustin Graves080069b2016-04-05 13:48:15 -06003547 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003548 PreCmdResolveImage(commandBuffer, pRegions);
3549
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003550 get_dispatch_table(pc_device_table_map, commandBuffer)
3551 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003552 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003553}
3554
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003555VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3556vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003557 bool skipCall = false;
3558 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3559 assert(my_data != NULL);
3560
3561 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
3562
3563 if (!skipCall) {
3564 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
3565 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003566}
3567
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003568VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3569vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003570 bool skipCall = false;
3571 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3572 assert(my_data != NULL);
3573
3574 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
3575
3576 if (!skipCall) {
3577 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
3578 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003579}
3580
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003581VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3582vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
3583 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3584 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3585 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003586 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003587 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003588 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003589
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003590 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003591 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
3592 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003593
Dustin Graves080069b2016-04-05 13:48:15 -06003594 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003595 get_dispatch_table(pc_device_table_map, commandBuffer)
3596 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
3597 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003598 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003599}
3600
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003601VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3602vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
3603 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3604 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3605 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003606 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003607 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003608 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003609
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003610 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003611 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
3612 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003613
Dustin Graves080069b2016-04-05 13:48:15 -06003614 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003615 get_dispatch_table(pc_device_table_map, commandBuffer)
3616 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
3617 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003618 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003619}
3620
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003621VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3622vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003623 bool skipCall = false;
3624 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3625 assert(my_data != NULL);
3626
3627 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
3628
3629 if (!skipCall) {
3630 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
3631 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003632}
3633
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003634VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003635 bool skipCall = false;
3636 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3637 assert(my_data != NULL);
3638
3639 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
3640
3641 if (!skipCall) {
3642 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
3643 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003644}
3645
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003646VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3647vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
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_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
3653
3654 if (!skipCall) {
3655 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
3656 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003657}
3658
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003659bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
3660 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003661
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08003662 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003663
3664 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003665}
3666
Dustin Graves20fd66f2016-04-18 18:33:21 -06003667VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
3668 VkQueryPool queryPool, uint32_t query) {
3669 bool skipCall = false;
3670 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3671 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003672
Dustin Graves20fd66f2016-04-18 18:33:21 -06003673 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
3674
3675 if (!skipCall) {
3676 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3677
3678 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3679 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003680}
3681
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003682VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3683vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
3684 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003685 bool skipCall = false;
3686 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3687 assert(my_data != NULL);
3688
3689 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
3690 dstOffset, stride, flags);
3691
3692 if (!skipCall) {
3693 get_dispatch_table(pc_device_table_map, commandBuffer)
3694 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
3695 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003696}
3697
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003698VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
3699 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
3700 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06003701 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003702 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003703 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003704
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003705 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003706
Dustin Graves080069b2016-04-05 13:48:15 -06003707 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003708 get_dispatch_table(pc_device_table_map, commandBuffer)
3709 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003710 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003711}
3712
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003713VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3714vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003715 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003716 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003717 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003718
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003719 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003720
Dustin Graves080069b2016-04-05 13:48:15 -06003721 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003722 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003723 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003724}
3725
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003726VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003727 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003728 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3729 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08003730
Dustin Graves29148ff2016-03-23 19:44:00 -06003731 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
3732
Dustin Graves080069b2016-04-05 13:48:15 -06003733 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003734 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
3735 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003736}
3737
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003738VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003739 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003740}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003741
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003742VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3743vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003744 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003745 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003746 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003747
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003748 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08003749
Dustin Graves080069b2016-04-05 13:48:15 -06003750 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003751 get_dispatch_table(pc_device_table_map, commandBuffer)
3752 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003753 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003754}
3755
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003756VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003757 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3758
Dustin Graves080069b2016-04-05 13:48:15 -06003759 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003760 return NULL;
3761 }
3762
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003763 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003764 return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003765 if (!strcmp(funcName, "vkDestroyDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003766 return (PFN_vkVoidFunction)vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003767 if (!strcmp(funcName, "vkGetDeviceQueue"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003768 return (PFN_vkVoidFunction)vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003769 if (!strcmp(funcName, "vkQueueSubmit"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003770 return (PFN_vkVoidFunction)vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003771 if (!strcmp(funcName, "vkQueueWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003772 return (PFN_vkVoidFunction)vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003773 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003774 return (PFN_vkVoidFunction)vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003775 if (!strcmp(funcName, "vkAllocateMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003776 return (PFN_vkVoidFunction)vkAllocateMemory;
Dustin Graves27a912a2016-03-07 17:52:14 -07003777 if (!strcmp(funcName, "vkFreeMemory"))
3778 return (PFN_vkVoidFunction)vkFreeMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003779 if (!strcmp(funcName, "vkMapMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003780 return (PFN_vkVoidFunction)vkMapMemory;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003781 if (!strcmp(funcName, "vkUnmapMemory"))
3782 return (PFN_vkVoidFunction)vkUnmapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003783 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003784 return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003785 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003786 return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003787 if (!strcmp(funcName, "vkGetDeviceMemoryCommitment"))
3788 return (PFN_vkVoidFunction)vkGetDeviceMemoryCommitment;
3789 if (!strcmp(funcName, "vkBindBufferMemory"))
3790 return (PFN_vkVoidFunction)vkBindBufferMemory;
3791 if (!strcmp(funcName, "vkBindImageMemory"))
3792 return (PFN_vkVoidFunction)vkBindImageMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003793 if (!strcmp(funcName, "vkCreateFence"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003794 return (PFN_vkVoidFunction)vkCreateFence;
Dustin Graves27a912a2016-03-07 17:52:14 -07003795 if (!strcmp(funcName, "vkDestroyFence"))
3796 return (PFN_vkVoidFunction)vkDestroyFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003797 if (!strcmp(funcName, "vkResetFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003798 return (PFN_vkVoidFunction)vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003799 if (!strcmp(funcName, "vkGetFenceStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003800 return (PFN_vkVoidFunction)vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003801 if (!strcmp(funcName, "vkWaitForFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003802 return (PFN_vkVoidFunction)vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003803 if (!strcmp(funcName, "vkCreateSemaphore"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003804 return (PFN_vkVoidFunction)vkCreateSemaphore;
Dustin Graves27a912a2016-03-07 17:52:14 -07003805 if (!strcmp(funcName, "vkDestroySemaphore"))
3806 return (PFN_vkVoidFunction)vkDestroySemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003807 if (!strcmp(funcName, "vkCreateEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003808 return (PFN_vkVoidFunction)vkCreateEvent;
Dustin Graves27a912a2016-03-07 17:52:14 -07003809 if (!strcmp(funcName, "vkDestroyEvent"))
3810 return (PFN_vkVoidFunction)vkDestroyEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003811 if (!strcmp(funcName, "vkGetEventStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003812 return (PFN_vkVoidFunction)vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003813 if (!strcmp(funcName, "vkSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003814 return (PFN_vkVoidFunction)vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003815 if (!strcmp(funcName, "vkResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003816 return (PFN_vkVoidFunction)vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003817 if (!strcmp(funcName, "vkCreateQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003818 return (PFN_vkVoidFunction)vkCreateQueryPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07003819 if (!strcmp(funcName, "vkDestroyQueryPool"))
3820 return (PFN_vkVoidFunction)vkDestroyQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003821 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003822 return (PFN_vkVoidFunction)vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003823 if (!strcmp(funcName, "vkCreateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003824 return (PFN_vkVoidFunction)vkCreateBuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07003825 if (!strcmp(funcName, "vkDestroyBuffer"))
3826 return (PFN_vkVoidFunction)vkDestroyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003827 if (!strcmp(funcName, "vkCreateBufferView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003828 return (PFN_vkVoidFunction)vkCreateBufferView;
Dustin Graves27a912a2016-03-07 17:52:14 -07003829 if (!strcmp(funcName, "vkDestroyBufferView"))
3830 return (PFN_vkVoidFunction)vkDestroyBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003831 if (!strcmp(funcName, "vkCreateImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003832 return (PFN_vkVoidFunction)vkCreateImage;
Dustin Graves27a912a2016-03-07 17:52:14 -07003833 if (!strcmp(funcName, "vkDestroyImage"))
3834 return (PFN_vkVoidFunction)vkDestroyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003835 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003836 return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003837 if (!strcmp(funcName, "vkCreateImageView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003838 return (PFN_vkVoidFunction)vkCreateImageView;
Dustin Graves27a912a2016-03-07 17:52:14 -07003839 if (!strcmp(funcName, "vkDestroyImageView"))
3840 return (PFN_vkVoidFunction)vkDestroyImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05003841 if (!strcmp(funcName, "vkCreateShaderModule"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003842 return (PFN_vkVoidFunction)vkCreateShaderModule;
Dustin Graves27a912a2016-03-07 17:52:14 -07003843 if (!strcmp(funcName, "vkDestroyShaderModule"))
3844 return (PFN_vkVoidFunction)vkDestroyShaderModule;
3845 if (!strcmp(funcName, "vkCreatePipelineCache"))
3846 return (PFN_vkVoidFunction)vkCreatePipelineCache;
3847 if (!strcmp(funcName, "vkDestroyPipelineCache"))
3848 return (PFN_vkVoidFunction)vkDestroyPipelineCache;
3849 if (!strcmp(funcName, "vkGetPipelineCacheData"))
3850 return (PFN_vkVoidFunction)vkGetPipelineCacheData;
3851 if (!strcmp(funcName, "vkMergePipelineCaches"))
3852 return (PFN_vkVoidFunction)vkMergePipelineCaches;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003853 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003854 return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003855 if (!strcmp(funcName, "vkCreateComputePipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003856 return (PFN_vkVoidFunction)vkCreateComputePipelines;
Dustin Graves27a912a2016-03-07 17:52:14 -07003857 if (!strcmp(funcName, "vkDestroyPipeline"))
3858 return (PFN_vkVoidFunction)vkDestroyPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003859 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003860 return (PFN_vkVoidFunction)vkCreatePipelineLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07003861 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
3862 return (PFN_vkVoidFunction)vkDestroyPipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003863 if (!strcmp(funcName, "vkCreateSampler"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003864 return (PFN_vkVoidFunction)vkCreateSampler;
Dustin Graves27a912a2016-03-07 17:52:14 -07003865 if (!strcmp(funcName, "vkDestroySampler"))
3866 return (PFN_vkVoidFunction)vkDestroySampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003867 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003868 return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07003869 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
3870 return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003871 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003872 return (PFN_vkVoidFunction)vkCreateDescriptorPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07003873 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
3874 return (PFN_vkVoidFunction)vkDestroyDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003875 if (!strcmp(funcName, "vkResetDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003876 return (PFN_vkVoidFunction)vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003877 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003878 return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003879 if (!strcmp(funcName, "vkCmdSetViewport"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003880 return (PFN_vkVoidFunction)vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003881 if (!strcmp(funcName, "vkCmdSetScissor"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003882 return (PFN_vkVoidFunction)vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003883 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003884 return (PFN_vkVoidFunction)vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003885 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003886 return (PFN_vkVoidFunction)vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003887 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003888 return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003889 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003890 return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003891 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003892 return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003893 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003894 return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003895 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003896 return (PFN_vkVoidFunction)vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003897 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003898 return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003899 if (!strcmp(funcName, "vkFreeCommandBuffers"))
3900 return (PFN_vkVoidFunction)vkFreeCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003901 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003902 return (PFN_vkVoidFunction)vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003903 if (!strcmp(funcName, "vkEndCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003904 return (PFN_vkVoidFunction)vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003905 if (!strcmp(funcName, "vkResetCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003906 return (PFN_vkVoidFunction)vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003907 if (!strcmp(funcName, "vkCmdBindPipeline"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003908 return (PFN_vkVoidFunction)vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003909 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003910 return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003911 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003912 return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003913 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003914 return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003915 if (!strcmp(funcName, "vkCmdDraw"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003916 return (PFN_vkVoidFunction)vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003917 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003918 return (PFN_vkVoidFunction)vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003919 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003920 return (PFN_vkVoidFunction)vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003921 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003922 return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003923 if (!strcmp(funcName, "vkCmdDispatch"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003924 return (PFN_vkVoidFunction)vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003925 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003926 return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003927 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003928 return (PFN_vkVoidFunction)vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003929 if (!strcmp(funcName, "vkCmdCopyImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003930 return (PFN_vkVoidFunction)vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003931 if (!strcmp(funcName, "vkCmdBlitImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003932 return (PFN_vkVoidFunction)vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003933 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003934 return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003935 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003936 return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003937 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003938 return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003939 if (!strcmp(funcName, "vkCmdFillBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003940 return (PFN_vkVoidFunction)vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003941 if (!strcmp(funcName, "vkCmdClearColorImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003942 return (PFN_vkVoidFunction)vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003943 if (!strcmp(funcName, "vkCmdResolveImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003944 return (PFN_vkVoidFunction)vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003945 if (!strcmp(funcName, "vkCmdSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003946 return (PFN_vkVoidFunction)vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003947 if (!strcmp(funcName, "vkCmdResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003948 return (PFN_vkVoidFunction)vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003949 if (!strcmp(funcName, "vkCmdWaitEvents"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003950 return (PFN_vkVoidFunction)vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003951 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003952 return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003953 if (!strcmp(funcName, "vkCmdBeginQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003954 return (PFN_vkVoidFunction)vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003955 if (!strcmp(funcName, "vkCmdEndQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003956 return (PFN_vkVoidFunction)vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003957 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003958 return (PFN_vkVoidFunction)vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003959 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003960 return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003961 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003962 return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003963 if (!strcmp(funcName, "vkCreateFramebuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003964 return (PFN_vkVoidFunction)vkCreateFramebuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07003965 if (!strcmp(funcName, "vkDestroyFramebuffer"))
3966 return (PFN_vkVoidFunction)vkDestroyFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003967 if (!strcmp(funcName, "vkCreateRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003968 return (PFN_vkVoidFunction)vkCreateRenderPass;
Dustin Graves27a912a2016-03-07 17:52:14 -07003969 if (!strcmp(funcName, "vkDestroyRenderPass"))
3970 return (PFN_vkVoidFunction)vkDestroyRenderPass;
3971 if (!strcmp(funcName, "vkGetRenderAreaGranularity"))
3972 return (PFN_vkVoidFunction)vkGetRenderAreaGranularity;
3973 if (!strcmp(funcName, "vkCreateCommandPool"))
3974 return (PFN_vkVoidFunction)vkCreateCommandPool;
3975 if (!strcmp(funcName, "vkDestroyCommandPool"))
3976 return (PFN_vkVoidFunction)vkDestroyCommandPool;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003977 if (!strcmp(funcName, "vkResetCommandPool"))
3978 return (PFN_vkVoidFunction)vkResetCommandPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003979 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003980 return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08003981 if (!strcmp(funcName, "vkCmdNextSubpass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003982 return (PFN_vkVoidFunction)vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06003983
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003984 if (device == NULL) {
3985 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003986 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003987
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003988 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003989 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003990 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003991}
3992
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003993VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003994 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003995 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003996 if (!strcmp(funcName, "vkCreateInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003997 return (PFN_vkVoidFunction)vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003998 if (!strcmp(funcName, "vkDestroyInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003999 return (PFN_vkVoidFunction)vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004000 if (!strcmp(funcName, "vkCreateDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004001 return (PFN_vkVoidFunction)vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004002 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004003 return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004004 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004005 return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004006 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004007 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06004008 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004009 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004010 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004011 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004012 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004013 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004014 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004015 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004016 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004017 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004018
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004019 if (instance == NULL) {
4020 return NULL;
4021 }
4022
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004023 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004024
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004025 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004026 if (fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004027 return fptr;
4028
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004029 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004030 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004031 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004032}