blob: c8b7040685f18d7d0263f4e93106473d29a11fe3 [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
Dustin Gravesf8032f22016-05-11 18:31:44 -060024#define NOMINMAX
25
26#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060027#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30
31#include <iostream>
32#include <string>
33#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050034#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060035#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060036#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060037
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060038#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070039#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060040#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060041#include "vk_enum_validate_helper.h"
42#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060043
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060044#include "vk_layer_table.h"
45#include "vk_layer_data.h"
46#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060047#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070048#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060049
Mark Lobodzinski739391a2016-03-17 15:08:18 -060050#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070051
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060052using namespace parameter_validation;
53
Cody Northrop55443ef2015-09-28 15:09:32 -060054struct layer_data {
Jeremy Hayes99a96322015-06-26 12:48:09 -060055 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070056 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060057
Ian Elliotted6b5ac2016-04-28 09:08:13 -060058 // The following are for keeping track of the temporary callbacks that can
59 // be used in vkCreateInstance and vkDestroyInstance:
60 uint32_t num_tmp_callbacks;
61 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
62 VkDebugReportCallbackEXT *tmp_callbacks;
63
Jon Ashburn5484e0c2016-03-08 17:48:44 -070064 // TODO: Split instance/device structs
65 // Device Data
66 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060067 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
68
Ian Elliotted6b5ac2016-04-28 09:08:13 -060069 layer_data() : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr){};
Cody Northrop55443ef2015-09-28 15:09:32 -060070};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050071
Jon Ashburn5484e0c2016-03-08 17:48:44 -070072static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060073static device_table_map pc_device_table_map;
74static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060075
Jeremy Hayes99a96322015-06-26 12:48:09 -060076// "my instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070077debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060078 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060079 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060080#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060081 fprintf(stderr, "MID: map: 0x%p, object: 0x%p, key: 0x%p, data: 0x%p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060082#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060083 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060084
85 return data->report_data;
86}
87
88// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070089debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060090 dispatch_key key = get_dispatch_key(object);
91 layer_data *data = get_my_data_ptr(key, layer_data_map);
92#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060093 fprintf(stderr, "MDD: map: 0x%p, object: 0x%p, key: 0x%p, data: 0x%p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060094#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060095 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060096 return data->report_data;
97}
98
Mark Lobodzinski739391a2016-03-17 15:08:18 -060099static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600100
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600101 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600102}
103
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700104VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
105vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
106 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700107 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700108 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600109
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700110 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700111 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
112 result = layer_create_msg_callback(data->report_data, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600113 }
114
115 return result;
116}
117
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700118VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,
119 VkDebugReportCallbackEXT msgCallback,
120 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700121 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700122 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600123
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700124 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700125 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600126}
127
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700128VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
129vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,
130 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700131 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
132 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700133}
134
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700135static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600136
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700137VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
138vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700139 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600140}
141
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700142static const VkLayerProperties pc_global_layers[] = {{
Jon Ashburndc9111c2016-03-22 12:57:13 -0600143 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700144}};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700145
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700146VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
147vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
148 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600149}
150
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700151VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
152 const char *pLayerName, uint32_t *pCount,
153 VkExtensionProperties *pProperties) {
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600154 /* parameter_validation does not have any physical device extensions */
Jon Ashburn751c4842015-11-02 17:37:20 -0700155 if (pLayerName == NULL) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700156 return get_dispatch_table(pc_instance_table_map, physicalDevice)
157 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Jon Ashburn751c4842015-11-02 17:37:20 -0700158 } else {
159 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
160 }
Jeremy Hayesad367152015-04-17 10:36:53 -0600161}
162
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700163VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
164vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -0700165
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600166 /* parameter_validation's physical device layers are the same as global */
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600168}
Jeremy Hayes99a96322015-06-26 12:48:09 -0600169
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700170static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600171 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700172 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
173 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
174 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
175 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
176 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 -0700177 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700178 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600179 return false;
180 }
181
182 return true;
183}
184
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700185static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
186 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600187 return "unrecognized enumerator";
188 }
189
190 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700191 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600192 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
193 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700194 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600195 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
196 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700197 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600198 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
199 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700200 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600201 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
202 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700203 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600204 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
205 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700206 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600207 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
208 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700209 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600210 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
211 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700212 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600213 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
214 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700215 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600216 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
217 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700218 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600219 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
220 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700221 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800222 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600223 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700224 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800225 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600226 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700227 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700228 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
229 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600230
231 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700232 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600233 enumeratorString += string;
234
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700235 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600236 enumeratorString += '|';
237 }
238 }
239
240 return enumeratorString;
241}
242
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700243static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
244 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
245 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
246 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
247 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
248 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 return false;
250 }
251
252 return true;
253}
254
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700255static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
256 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600257 return "unrecognized enumerator";
258 }
259
260 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700261 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600262 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
263 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700264 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600265 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600266 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700267 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600268 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
269 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700270 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600271 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
272 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700273 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600274 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
275 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700276 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800277 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600278 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700279 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600280 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
281 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700282 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800283 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600284 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600285
286 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700287 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600288 enumeratorString += string;
289
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700290 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600291 enumeratorString += '|';
292 }
293 }
294
295 return enumeratorString;
296}
297
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700298static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
299 VkQueueFlagBits allFlags =
300 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
301 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600302 return false;
303 }
304
305 return true;
306}
307
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700308static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
309 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600310 return "unrecognized enumerator";
311 }
312
313 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700314 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800315 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600316 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700317 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600318 strings.push_back("VK_QUEUE_COMPUTE_BIT");
319 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700320 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800321 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600322 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700323 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600324 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
325 }
326
327 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700328 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600329 enumeratorString += string;
330
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700331 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600332 enumeratorString += '|';
333 }
334 }
335
336 return enumeratorString;
337}
338
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700339static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
340 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
341 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
342 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
343 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600344 return false;
345 }
346
347 return true;
348}
349
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700350static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
351 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600352 return "unrecognized enumerator";
353 }
354
355 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700356 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600357 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
358 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700359 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800360 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600361 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700362 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600363 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
364 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700365 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800366 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600367 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700368 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800369 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600370 }
371
372 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700373 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600374 enumeratorString += string;
375
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700376 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600377 enumeratorString += '|';
378 }
379 }
380
381 return enumeratorString;
382}
383
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700384static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700385 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700386 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600387 return false;
388 }
389
390 return true;
391}
392
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700393static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
394 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600395 return "unrecognized enumerator";
396 }
397
398 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700399 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800400 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600401 }
402
403 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700404 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600405 enumeratorString += string;
406
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700407 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600408 enumeratorString += '|';
409 }
410 }
411
412 return enumeratorString;
413}
414
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700415static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
416 VkSparseImageFormatFlagBits allFlags =
417 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
418 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
419 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600420 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600421 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600422
423 return true;
424}
425
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700426static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
427 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600428 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600429 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600430
431 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700432 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800433 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600434 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700435 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800436 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600437 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700438 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800439 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600440 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600441
442 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700443 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600444 enumeratorString += string;
445
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700446 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600447 enumeratorString += '|';
448 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600449 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600450
451 return enumeratorString;
452}
453
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700454static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700455 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700456 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600457 return false;
458 }
459
460 return true;
461}
462
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700463static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
464 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600465 return "unrecognized enumerator";
466 }
467
468 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700469 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600470 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
471 }
472
473 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700474 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600475 enumeratorString += string;
476
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700477 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600478 enumeratorString += '|';
479 }
480 }
481
482 return enumeratorString;
483}
484
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700485static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
486 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
487 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
488 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
489 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
490 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600491 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
492 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
493 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700494 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600495 return false;
496 }
497
498 return true;
499}
500
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700501static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
502 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600503 return "unrecognized enumerator";
504 }
505
506 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700507 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700508 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_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_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700511 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600512 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700513 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700514 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600515 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700516 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700517 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600518 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700519 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700520 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600521 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700522 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700523 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600524 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700525 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700526 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600527 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700528 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700529 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600530 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700531 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700532 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600533 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700534 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700535 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600536 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700537 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700538 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600539 }
540
541 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700542 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600543 enumeratorString += string;
544
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700545 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600546 enumeratorString += '|';
547 }
548 }
549
550 return enumeratorString;
551}
552
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700553static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
554 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
555 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
556 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600557 return false;
558 }
559
560 return true;
561}
562
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700563static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
564 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600565 return "unrecognized enumerator";
566 }
567
568 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700569 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600570 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
571 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700572 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600573 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
574 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700575 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600576 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
577 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700578 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600579 strings.push_back("VK_QUERY_RESULT_64_BIT");
580 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600581
582 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700583 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600584 enumeratorString += string;
585
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700586 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600587 enumeratorString += '|';
588 }
589 }
590
591 return enumeratorString;
592}
593
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700594static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
595 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
596 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
597 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
598 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
599 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600 return false;
601 }
602
603 return true;
604}
605
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700606static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
607 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600608 return "unrecognized enumerator";
609 }
610
611 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700612 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600613 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
614 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700615 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600616 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
617 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700618 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600619 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
620 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700621 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600622 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
623 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700624 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600625 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
626 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700627 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800628 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600629 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700630 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600631 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
632 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700633 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800634 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600635 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700636 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600637 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
638 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600639
640 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700641 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600642 enumeratorString += string;
643
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700644 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600645 enumeratorString += '|';
646 }
647 }
648
649 return enumeratorString;
650}
651
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700652static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
653 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
654 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
655 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600656 return false;
657 }
658
659 return true;
660}
661
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700662static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
663 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600664 return "unrecognized enumerator";
665 }
666
667 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700668 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600669 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
670 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700671 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600672 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
673 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700674 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600675 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600676 }
677
678 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700679 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600680 enumeratorString += string;
681
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700682 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600683 enumeratorString += '|';
684 }
685 }
686
687 return enumeratorString;
688}
689
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700690static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
691 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
692 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
693 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
694 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600695 return false;
696 }
697
698 return true;
699}
700
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700701static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
702 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600703 return "unrecognized enumerator";
704 }
705
706 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700707 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600708 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
709 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700710 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600711 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
712 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700713 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600714 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
715 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700716 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600717 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
718 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700719 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600720 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600721 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600722
723 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700724 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600725 enumeratorString += string;
726
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700727 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600728 enumeratorString += '|';
729 }
730 }
731
732 return enumeratorString;
733}
734
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700735static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
736 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
737 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
738 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600739 return false;
740 }
741
742 return true;
743}
744
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700745static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
746 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600747 return "unrecognized enumerator";
748 }
749
750 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700751 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800752 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600753 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700754 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800755 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600756 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700757 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800758 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600759 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700760 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800761 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600762 }
763
764 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700765 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600766 enumeratorString += string;
767
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700768 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600769 enumeratorString += '|';
770 }
771 }
772
773 return enumeratorString;
774}
775
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700776static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
777 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
778 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
779 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600780 return false;
781 }
782
783 return true;
784}
785
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700786static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
787 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600788 return "unrecognized enumerator";
789 }
790
791 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700792 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600793 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
794 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700795 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600796 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
797 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700798 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600799 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600800 }
801
802 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700803 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600804 enumeratorString += string;
805
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700806 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600807 enumeratorString += '|';
808 }
809 }
810
811 return enumeratorString;
812}
813
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700814static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
815 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
816 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
817 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
818 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600819 return false;
820 }
821
822 return true;
823}
824
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700825static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
826 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600827 return "unrecognized enumerator";
828 }
829
830 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700831 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600832 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600833 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700834 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600835 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600836 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700837 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600838 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
839 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700840 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600841 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
842 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700843 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600844 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600845 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700846 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600847 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600848 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700849 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600850 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600851 }
852
853 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700854 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600855 enumeratorString += string;
856
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700857 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600858 enumeratorString += '|';
859 }
860 }
861
862 return enumeratorString;
863}
864
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700865static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800866 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700867 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
868 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
869 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
870 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
871 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
872 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 -0700873 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700874 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600875 return false;
876 }
877
878 return true;
879}
880
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700881static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
882 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600883 return "unrecognized enumerator";
884 }
885
886 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700887 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800888 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
889 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700890 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800891 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600892 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700893 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600894 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600895 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700896 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600897 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600898 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700899 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600900 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600901 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700902 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700903 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600904 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700905 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600906 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600907 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700908 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600909 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600910 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700911 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600912 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600913 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700914 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600915 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600916 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700917 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600918 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
919 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700920 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600921 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
922 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700923 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700924 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600925 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700926 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600927 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
928 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700929 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600930 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
931 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700932 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600933 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
934 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700935 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600936 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600937 }
938
939 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700940 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600941 enumeratorString += string;
942
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700943 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600944 enumeratorString += '|';
945 }
946 }
947
948 return enumeratorString;
949}
950
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700951static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800952 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700953 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
954 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
955 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
956 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
957 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 +0800958
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700959 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600960 return false;
961 }
962
963 return true;
964}
965
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700966static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
967 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600968 return "unrecognized enumerator";
969 }
970
971 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700972 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800973 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600974 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700975 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800976 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600977 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700978 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800979 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600980 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700981 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800982 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600983 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700984 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800985 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600986 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700987 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800988 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600989 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700990 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800991 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600992 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700993 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800994 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600995 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700996 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800997 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600998 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700999 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001000 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001001 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001002 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001003 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001004 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001005 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001006 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001007 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001008 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001009 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001010 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001011 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001012 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001013 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001014 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001015 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001016 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001017 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001018 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001019 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001020 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001021 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001022 }
1023
1024 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001025 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001026 enumeratorString += string;
1027
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001028 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001029 enumeratorString += '|';
1030 }
1031 }
1032
1033 return enumeratorString;
1034}
1035
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001036static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1037 VkCommandPoolCreateFlagBits allFlags =
1038 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1039 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001040 return false;
1041 }
1042
1043 return true;
1044}
1045
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001046static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1047 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001048 return "unrecognized enumerator";
1049 }
1050
1051 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001052 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001053 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001054 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001055 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001056 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001057 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001058
1059 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001060 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001061 enumeratorString += string;
1062
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001063 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001064 enumeratorString += '|';
1065 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001066 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001067
1068 return enumeratorString;
1069}
1070
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001071static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001072 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001073 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001074 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001075 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001076
1077 return true;
1078}
1079
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001080static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1081 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001082 return "unrecognized enumerator";
1083 }
1084
1085 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001086 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001087 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001088 }
1089
1090 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001091 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001092 enumeratorString += string;
1093
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001094 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001095 enumeratorString += '|';
1096 }
1097 }
1098
1099 return enumeratorString;
1100}
1101
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001102static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1103 VkCommandBufferUsageFlags allFlags =
1104 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1105 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1106 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001107 return false;
1108 }
1109
1110 return true;
1111}
1112
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001113static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1114 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001115 return "unrecognized enumerator";
1116 }
1117
1118 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001119 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001120 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001121 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001122 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001123 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001124 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001125 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001126 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001127 }
1128
1129 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001130 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001131 enumeratorString += string;
1132
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001133 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001134 enumeratorString += '|';
1135 }
1136 }
1137
1138 return enumeratorString;
1139}
1140
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001141static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001142 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001143 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001144 return false;
1145 }
1146
1147 return true;
1148}
1149
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001150static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1151 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001152 return "unrecognized enumerator";
1153 }
1154
1155 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001156 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001157 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001158 }
1159
1160 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001161 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001162 enumeratorString += string;
1163
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001164 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001165 enumeratorString += '|';
1166 }
1167 }
1168
1169 return enumeratorString;
1170}
1171
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001172static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1173 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1174 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1175 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001176 return false;
1177 }
1178
1179 return true;
1180}
1181
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001182static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1183 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001184 return "unrecognized enumerator";
1185 }
1186
1187 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001188 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001189 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1190 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001191 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001192 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1193 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001194 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001195 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1196 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001197 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001198 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1199 }
1200
1201 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001202 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001203 enumeratorString += string;
1204
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001205 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001206 enumeratorString += '|';
1207 }
1208 }
1209
1210 return enumeratorString;
1211}
1212
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001213static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001214 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001215 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001216 return false;
1217 }
1218
1219 return true;
1220}
1221
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001222static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1223 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001224 return "unrecognized enumerator";
1225 }
1226
1227 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001228 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001229 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001230 }
1231
1232 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001233 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001234 enumeratorString += string;
1235
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001236 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001237 enumeratorString += '|';
1238 }
1239 }
1240
1241 return enumeratorString;
1242}
1243
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001244static const int MaxParamCheckerStringLength = 256;
1245
Dustin Graves080069b2016-04-05 13:48:15 -06001246static bool validate_string(debug_report_data *report_data, const char *apiName, const char *stringName,
1247 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001248 assert(apiName != nullptr);
1249 assert(stringName != nullptr);
1250 assert(validateString != nullptr);
1251
Dustin Graves080069b2016-04-05 13:48:15 -06001252 bool skipCall = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001253
1254 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1255
1256 if (result == VK_STRING_ERROR_NONE) {
1257 return skipCall;
1258 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001259 skipCall =
1260 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1261 "PARAMCHECK", "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001262 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001263 skipCall =
1264 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1265 "PARAMCHECK", "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001266 }
1267 return skipCall;
1268}
1269
Dustin Gravesde628532016-04-21 16:30:17 -06001270static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1271 uint32_t index) {
1272 assert(device_data != nullptr);
1273 debug_report_data *report_data = device_data->report_data;
1274 bool skip_call = false;
1275
1276 if (index == VK_QUEUE_FAMILY_IGNORED) {
1277 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1278 "PARAMCHECK", "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
1279 } else {
1280 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1281 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1282 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1283 "PARAMCHECK", "%s: %s (%d) must be one of the indices specified when the device was created, via "
1284 "the VkDeviceQueueCreateInfo structure.",
1285 function_name, parameter_name, index);
1286 return false;
1287 }
1288 }
1289
1290 return skip_call;
1291}
1292
1293static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1294 const uint32_t count, const uint32_t *indices) {
1295 assert(device_data != nullptr);
1296 debug_report_data *report_data = device_data->report_data;
1297 bool skip_call = false;
1298
1299 if (indices != nullptr) {
1300 for (uint32_t i = 0; i < count; i++) {
1301 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
1302 skip_call |=
1303 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1304 "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
1305 } else {
1306 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1307 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1308 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1309 "PARAMCHECK", "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1310 "created, via the VkDeviceQueueCreateInfo structure.",
1311 function_name, parameter_name, i, indices[i]);
1312 return false;
1313 }
1314 }
1315 }
1316 }
1317
1318 return skip_call;
1319}
1320
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001321VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1322vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001323 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001324
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001325 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001326 assert(chain_info != nullptr);
1327 assert(chain_info->u.pLayerInfo != nullptr);
1328
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001329 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1330 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001331 if (fpCreateInstance == NULL) {
1332 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001333 }
1334
Dustin Graves842621d2016-03-03 14:17:08 -07001335 // Advance the link info for the next element on the chain
1336 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1337
1338 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001339
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001340 if (result == VK_SUCCESS) {
1341 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1342 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001343
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001344 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001345
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001346 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1347 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001348
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001349 // Look for one or more debug report create info structures
1350 // and setup a callback(s) for each one found.
1351 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1352 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1353 if (my_instance_data->num_tmp_callbacks > 0) {
1354 // Setup the temporary callback(s) here to catch early issues:
1355 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1356 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1357 // Failure of setting up one or more of the callback.
1358 // Therefore, clean up and don't use those callbacks:
1359 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1360 my_instance_data->num_tmp_callbacks = 0;
1361 }
1362 }
1363 }
1364
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001365 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001366
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001367 // Ordinarily we'd check these before calling down the chain, but none of the layer
1368 // support is in place until now, if we survive we can report the issue now.
1369 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001370
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001371 if (pCreateInfo->pApplicationInfo) {
1372 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1373 validate_string(my_instance_data->report_data, "vkCreateInstance",
1374 "pCreateInfo->VkApplicationInfo->pApplicationName",
1375 pCreateInfo->pApplicationInfo->pApplicationName);
1376 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001377
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001378 if (pCreateInfo->pApplicationInfo->pEngineName) {
1379 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1380 pCreateInfo->pApplicationInfo->pEngineName);
1381 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001382 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001383
1384 // Disable the tmp callbacks:
1385 if (my_instance_data->num_tmp_callbacks > 0) {
1386 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1387 my_instance_data->tmp_callbacks);
1388 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001389 }
1390
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001391 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001392}
1393
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001394VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001395 // Grab the key before the instance is destroyed.
1396 dispatch_key key = get_dispatch_key(instance);
Dustin Graves080069b2016-04-05 13:48:15 -06001397 bool skipCall = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001398 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001399 assert(my_data != NULL);
1400
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001401 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1402 bool callback_setup = false;
1403 if (my_data->num_tmp_callbacks > 0) {
1404 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1405 my_data->tmp_callbacks)) {
1406 callback_setup = true;
1407 }
1408 }
1409
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001410 skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001411
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001412 // Disable and cleanup the temporary callback(s):
1413 if (callback_setup) {
1414 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1415 }
1416 if (my_data->num_tmp_callbacks > 0) {
1417 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1418 my_data->num_tmp_callbacks = 0;
1419 }
1420
Dustin Graves080069b2016-04-05 13:48:15 -06001421 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001422 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001423 pTable->DestroyInstance(instance, pAllocator);
1424
1425 // Clean up logging callback, if any
1426 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001427 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1428 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001429 my_data->logging_callback.pop_back();
1430 }
1431
1432 layer_debug_report_destroy_instance(mid(instance));
1433 layer_data_map.erase(pTable);
1434
1435 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001436 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001437 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001438}
1439
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001440VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1441vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) {
1442 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001443 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001444 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001445 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001446
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001447 skipCall |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001448
Dustin Graves080069b2016-04-05 13:48:15 -06001449 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001450 result = get_dispatch_table(pc_instance_table_map, instance)
1451 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001452
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001453 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001454 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001455
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001456 return result;
1457}
1458
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001459VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1460vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Dustin Graves080069b2016-04-05 13:48:15 -06001461 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001462 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001463 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001464
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001465 skipCall |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001466
Dustin Graves080069b2016-04-05 13:48:15 -06001467 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001468 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001469 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001470}
1471
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001472VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1473vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001474 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001475 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001476 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001477
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001478 skipCall |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001479
Dustin Graves080069b2016-04-05 13:48:15 -06001480 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001481 get_dispatch_table(pc_instance_table_map, physicalDevice)
1482 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001483 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001484}
1485
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001486VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1487vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1488 VkImageUsageFlags usage, VkImageCreateFlags flags,
1489 VkImageFormatProperties *pImageFormatProperties) {
1490 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001491 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001492 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001493 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001494
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001495 skipCall |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001496 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001497
Dustin Graves080069b2016-04-05 13:48:15 -06001498 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001499 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1500 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1501 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001502
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001503 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001504 }
Chia-I Wu17241042015-10-31 00:31:16 +08001505
1506 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001507}
1508
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001509VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1510vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001511 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001512 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001513 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001514
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001515 skipCall |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001516
Dustin Graves080069b2016-04-05 13:48:15 -06001517 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001518 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001519 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001520}
1521
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001522VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1523vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1524 VkQueueFamilyProperties *pQueueFamilyProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001525 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001526 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001527 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001528
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001529 skipCall |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001530 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001531
Dustin Graves080069b2016-04-05 13:48:15 -06001532 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001533 get_dispatch_table(pc_instance_table_map, physicalDevice)
1534 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001535 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001536}
1537
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001538VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1539vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001540 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001541 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001542 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001543
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001544 skipCall |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001545
Dustin Graves080069b2016-04-05 13:48:15 -06001546 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001547 get_dispatch_table(pc_instance_table_map, physicalDevice)
1548 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001549 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001550}
1551
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001552void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1553 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001554 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001555
1556 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1557 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1558 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001559 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1560 INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001561 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1562 "structure.",
1563 i);
1564 } else {
1565 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001566 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001567
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001568 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1569 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1570 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1571 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001572 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
1573 __LINE__, INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001574 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1575 "between 0 and 1. Actual value is %f",
1576 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1577 }
1578 }
1579 }
1580
1581 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1582 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001583 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1584 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001585 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1586 "of queue families.",
1587 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001588 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1589 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1590 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001591 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1592 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001593 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1594 "queues for the given family index.",
1595 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001596 }
Michael Lentine774704f2016-01-27 13:36:46 -06001597 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001598 }
1599}
1600
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001601void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001602 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001603
1604 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1605 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1606 my_device_data->queueFamilyIndexMap.insert(
1607 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1608 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001609 }
1610}
1611
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001612VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice,
1613 const VkDeviceCreateInfo *pCreateInfo,
1614 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001615 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001616 * NOTE: We do not validate physicalDevice or any dispatchable
1617 * object as the first parameter. We couldn't get here if it was wrong!
1618 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001619
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001620 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001621 bool skipCall = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001622 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001623 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001624
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001625 skipCall |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001626
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001627 if (pCreateInfo != NULL) {
1628 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001629 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001630 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1631 pCreateInfo->ppEnabledLayerNames[i]);
1632 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001633 }
Michael Lentine774704f2016-01-27 13:36:46 -06001634
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001635 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001636 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001637 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1638 pCreateInfo->ppEnabledExtensionNames[i]);
1639 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001640 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001641 }
1642
Dustin Graves080069b2016-04-05 13:48:15 -06001643 if (!skipCall) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001644 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001645 assert(chain_info != nullptr);
1646 assert(chain_info->u.pLayerInfo != nullptr);
1647
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001648 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1649 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001650 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001651 if (fpCreateDevice == NULL) {
1652 return VK_ERROR_INITIALIZATION_FAILED;
1653 }
1654
1655 // Advance the link info for the next element on the chain
1656 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1657
1658 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001659
1660 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1661
1662 if (result == VK_SUCCESS) {
1663 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1664 assert(my_device_data != nullptr);
1665
1666 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1667 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1668
1669 uint32_t count;
1670 get_dispatch_table(pc_instance_table_map, physicalDevice)
1671 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
1672 std::vector<VkQueueFamilyProperties> properties(count);
1673 get_dispatch_table(pc_instance_table_map, physicalDevice)
1674 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
1675
1676 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1677 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001678 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001679 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001680
Jeremy Hayes99a96322015-06-26 12:48:09 -06001681 return result;
1682}
1683
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001684VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001685 dispatch_key key = get_dispatch_key(device);
Dustin Graves080069b2016-04-05 13:48:15 -06001686 bool skipCall = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001687 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1688 assert(my_data != NULL);
1689
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001690 skipCall |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001691
Dustin Graves080069b2016-04-05 13:48:15 -06001692 if (!skipCall) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001693 layer_debug_report_destroy_device(device);
1694
Jeremy Hayes99a96322015-06-26 12:48:09 -06001695#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001696 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001697#endif
1698
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001699 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001700 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001701 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001702 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001703}
1704
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001705bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001706 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001707 assert(my_device_data != nullptr);
1708
Dustin Gravesde628532016-04-21 16:30:17 -06001709 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001710
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001711 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001712 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001713 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1714 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001715 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1716 "was created.",
1717 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001718 return false;
1719 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001720
Michael Lentinebdf744f2016-01-27 15:43:43 -06001721 return true;
1722}
1723
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001724VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1725vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001726 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001727 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001728 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001729
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001730 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001731
Dustin Graves080069b2016-04-05 13:48:15 -06001732 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001733 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1734
1735 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001736 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001737}
1738
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001739VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1740vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
1741 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001742 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001743 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001744 assert(my_data != NULL);
1745
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001746 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001747
Dustin Graves080069b2016-04-05 13:48:15 -06001748 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001749 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1750
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001751 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001752 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001753
Jeremy Hayes99a96322015-06-26 12:48:09 -06001754 return result;
1755}
1756
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001757VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001758 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1759 assert(my_data != NULL);
1760
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001761 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001762
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001763 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001764
1765 return result;
1766}
1767
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001768VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001769 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1770 assert(my_data != NULL);
1771
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001772 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001773
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001774 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001775
1776 return result;
1777}
1778
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001779VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1780 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1781 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001782 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001783 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001784 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001785
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001786 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001787
Dustin Graves080069b2016-04-05 13:48:15 -06001788 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001789 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1790
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001791 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001792 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001793
1794 return result;
1795}
1796
Dustin Graves27a912a2016-03-07 17:52:14 -07001797VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001798vkFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001799 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001800 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001801 assert(my_data != NULL);
1802
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001803 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001804
Dustin Graves080069b2016-04-05 13:48:15 -06001805 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001806 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001807 }
1808}
1809
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001810VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1811vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
1812 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001813 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001814 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001815 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001816
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001817 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001818
Dustin Graves080069b2016-04-05 13:48:15 -06001819 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001820 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1821
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001822 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001823 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001824
1825 return result;
1826}
1827
Dustin Graves20fd66f2016-04-18 18:33:21 -06001828VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUnmapMemory(VkDevice device, VkDeviceMemory memory) {
1829 bool skipCall = false;
1830 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1831 assert(my_data != NULL);
1832
1833 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1834
1835 if (!skipCall) {
1836 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1837 }
1838}
1839
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001840VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1841vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1842 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001843 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001844 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001845 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001846
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001847 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001848
Dustin Graves080069b2016-04-05 13:48:15 -06001849 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001850 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1851
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001852 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001853 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001854
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001855 return result;
1856}
1857
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001858VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1859vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1860 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001861 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001862 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001863 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001864
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001865 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001866
Dustin Graves080069b2016-04-05 13:48:15 -06001867 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001868 result =
1869 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001870
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001871 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001872 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001873
Tony Barbourb1250542015-04-16 19:23:13 -06001874 return result;
1875}
1876
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001877VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1878vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001879 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001880 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001881 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001882
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001883 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001884
Dustin Graves080069b2016-04-05 13:48:15 -06001885 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001886 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001887 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001888}
1889
Dustin Graves20fd66f2016-04-18 18:33:21 -06001890VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1891 VkDeviceSize memoryOffset) {
1892 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1893 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001894 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1895 assert(my_data != NULL);
1896
Dustin Graves20fd66f2016-04-18 18:33:21 -06001897 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001898
Dustin Graves20fd66f2016-04-18 18:33:21 -06001899 if (!skipCall) {
1900 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1901
1902 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1903 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001904
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001905 return result;
1906}
1907
Dustin Graves20fd66f2016-04-18 18:33:21 -06001908VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1909 VkDeviceSize memoryOffset) {
1910 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1911 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001912 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1913 assert(my_data != NULL);
1914
Dustin Graves20fd66f2016-04-18 18:33:21 -06001915 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001916
Dustin Graves20fd66f2016-04-18 18:33:21 -06001917 if (!skipCall) {
1918 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1919
1920 validate_result(my_data->report_data, "vkBindImageMemory", result);
1921 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001922
1923 return result;
1924}
1925
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001926VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1927vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001928 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001929 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001930 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001931
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001932 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001933
Dustin Graves080069b2016-04-05 13:48:15 -06001934 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001935 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001936 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001937}
1938
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001939VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1940vkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001941 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001942 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001943 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001944
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001945 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001946
Dustin Graves080069b2016-04-05 13:48:15 -06001947 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001948 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001949 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001950}
1951
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001952bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1953 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1954 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001955 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001956 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1957 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001958 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1959 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001960 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1961 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001962 return false;
1963 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001964 }
1965
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001966 return true;
1967}
1968
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001969VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1970vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1971 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001972 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001973 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001974 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001975
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001976 skipCall |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001977 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001978
Dustin Graves080069b2016-04-05 13:48:15 -06001979 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001980 get_dispatch_table(pc_device_table_map, device)
1981 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001982
1983 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1984 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001985}
1986
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001987bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1988 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1989 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001990 if (pProperties != nullptr) {
1991 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1992 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001993 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
1994 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001995 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
1996 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001997 return false;
1998 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001999 }
2000
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002001 return true;
2002}
2003
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002004VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2005vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2006 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2007 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06002008 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002009 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002010 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002011
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002012 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002013 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002014
Dustin Graves080069b2016-04-05 13:48:15 -06002015 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002016 get_dispatch_table(pc_instance_table_map, physicalDevice)
2017 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2018 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002019
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002020 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2021 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002022 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002023}
2024
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002025VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2026vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
2027 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002028 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002029 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002030 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002031
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002032 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002033
Dustin Graves080069b2016-04-05 13:48:15 -06002034 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002035 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2036
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002037 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002038 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002039
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002040 return result;
2041}
2042
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002043VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2044vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
2045 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002046 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002047 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002048 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002049
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002050 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002051
Dustin Graves080069b2016-04-05 13:48:15 -06002052 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002053 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2054
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002055 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002056 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002057
2058 return result;
2059}
2060
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002061VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002062 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002063 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002064 assert(my_data != NULL);
2065
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002066 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002067
Dustin Graves080069b2016-04-05 13:48:15 -06002068 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002069 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002070 }
2071}
2072
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002073VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
2074 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002075 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002076 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002077 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002078
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002079 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002080
Dustin Graves080069b2016-04-05 13:48:15 -06002081 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002082 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2083
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002084 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002085 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002086
2087 return result;
2088}
2089
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002090VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002091 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2092 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002093 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2094 assert(my_data != NULL);
2095
Dustin Graves20fd66f2016-04-18 18:33:21 -06002096 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002097
Dustin Graves20fd66f2016-04-18 18:33:21 -06002098 if (!skipCall) {
2099 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2100
2101 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2102 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002103
2104 return result;
2105}
2106
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002107VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2108vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
2109 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002110 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002111 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002112 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002113
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002114 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002115
Dustin Graves080069b2016-04-05 13:48:15 -06002116 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002117 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2118
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002119 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002120 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002121
2122 return result;
2123}
2124
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002125VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
2126 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2127 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002128 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002129 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002130 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002131
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002132 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002133
Dustin Graves080069b2016-04-05 13:48:15 -06002134 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002135 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2136
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002137 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002138 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002139
2140 return result;
2141}
2142
Dustin Graves27a912a2016-03-07 17:52:14 -07002143VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002144vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002145 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002146 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002147 assert(my_data != NULL);
2148
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002149 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002150
Dustin Graves080069b2016-04-05 13:48:15 -06002151 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002152 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002153 }
2154}
2155
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002156VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2157vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
2158 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002159 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002160 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002161 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002162
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002163 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002164
Dustin Graves080069b2016-04-05 13:48:15 -06002165 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002166 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2167
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002168 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002169 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002170
2171 return result;
2172}
2173
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002174VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002175 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002176 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002177 assert(my_data != NULL);
2178
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002179 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002180
Dustin Graves080069b2016-04-05 13:48:15 -06002181 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002182 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002183 }
2184}
2185
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002186VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002187 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2188 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002189 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2190 assert(my_data != NULL);
2191
Dustin Graves20fd66f2016-04-18 18:33:21 -06002192 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002193
Dustin Graves20fd66f2016-04-18 18:33:21 -06002194 if (!skipCall) {
2195 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2196
2197 validate_result(my_data->report_data, "vkGetEventStatus", result);
2198 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002199
2200 return result;
2201}
2202
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002203VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002204 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2205 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002206 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2207 assert(my_data != NULL);
2208
Dustin Graves20fd66f2016-04-18 18:33:21 -06002209 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002210
Dustin Graves20fd66f2016-04-18 18:33:21 -06002211 if (!skipCall) {
2212 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2213
2214 validate_result(my_data->report_data, "vkSetEvent", result);
2215 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002216
2217 return result;
2218}
2219
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002220VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002221 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2222 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002223 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2224 assert(my_data != NULL);
2225
Dustin Graves20fd66f2016-04-18 18:33:21 -06002226 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002227
Dustin Graves20fd66f2016-04-18 18:33:21 -06002228 if (!skipCall) {
2229 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2230
2231 validate_result(my_data->report_data, "vkResetEvent", result);
2232 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002233
2234 return result;
2235}
2236
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002237VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2238 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
2239 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002240 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002241 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002242 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002243
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002244 skipCall |= parameter_validation_vkCreateQueryPool(my_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002245
Dustin Graves080069b2016-04-05 13:48:15 -06002246 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002247 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2248
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002249 validate_result(my_data->report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002250 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002251
2252 return result;
2253}
2254
Dustin Graves27a912a2016-03-07 17:52:14 -07002255VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002256vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002257 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002258 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002259 assert(my_data != NULL);
2260
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002261 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002262
Dustin Graves080069b2016-04-05 13:48:15 -06002263 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002264 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002265 }
2266}
2267
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002268VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2269 uint32_t queryCount, size_t dataSize, void *pData,
2270 VkDeviceSize stride, VkQueryResultFlags flags) {
2271 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002272 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002273 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002274 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002275
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002276 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002277 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002278
Dustin Graves080069b2016-04-05 13:48:15 -06002279 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002280 result = get_dispatch_table(pc_device_table_map, device)
2281 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002282
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002283 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002284 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002285
2286 return result;
2287}
2288
Dustin Gravesde628532016-04-21 16:30:17 -06002289bool PreCreateBuffer(layer_data *device_data, const VkBufferCreateInfo *pCreateInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002290 if (pCreateInfo != nullptr) {
Dustin Graves29148ff2016-03-23 19:44:00 -06002291 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesde628532016-04-21 16:30:17 -06002292 validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2293 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002294 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002295 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002296
2297 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002298}
2299
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002300VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2301vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
2302 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002303 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002304 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002305 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002306
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002307 skipCall |= parameter_validation_vkCreateBuffer(my_data->report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002308
Dustin Graves080069b2016-04-05 13:48:15 -06002309 if (!skipCall) {
Dustin Gravesde628532016-04-21 16:30:17 -06002310 PreCreateBuffer(my_data, pCreateInfo);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002311
2312 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2313
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002314 validate_result(my_data->report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002315 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002316
2317 return result;
2318}
2319
Dustin Graves27a912a2016-03-07 17:52:14 -07002320VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002321vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002322 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002323 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002324 assert(my_data != NULL);
2325
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002326 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002327
Dustin Graves080069b2016-04-05 13:48:15 -06002328 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002329 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002330 }
2331}
2332
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002333VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2334 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
2335 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002336 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002337 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002338 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002339
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002340 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002341
Dustin Graves080069b2016-04-05 13:48:15 -06002342 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002343 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2344
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002345 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002346 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002347
2348 return result;
2349}
2350
Dustin Graves27a912a2016-03-07 17:52:14 -07002351VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002352vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002353 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002354 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002355 assert(my_data != NULL);
2356
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002357 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002358
Dustin Graves080069b2016-04-05 13:48:15 -06002359 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002360 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002361 }
2362}
2363
Dustin Gravesf8032f22016-05-11 18:31:44 -06002364VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2365 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
2366 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2367 bool skip_call = false;
2368 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2369 assert(device_data != NULL);
2370 debug_report_data *report_data = device_data->report_data;
2371
2372 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2373
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002374 if (pCreateInfo != nullptr) {
Dustin Graves29148ff2016-03-23 19:44:00 -06002375 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002376 // pQueueFamilyIndices must not be NULL
2377 skip_call |= validate_required_pointer(report_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2378 pCreateInfo->pQueueFamilyIndices);
2379
2380 // queueFamilyIndexCount must be greater than 1
2381 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2382 pCreateInfo->queueFamilyIndexCount, 1u);
2383
2384 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2385 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2386 }
2387
2388 // width, height, and depth members of extent must be greater than 0
2389 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width,
2390 0u);
2391 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height,
2392 0u);
2393 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth,
2394 0u);
2395
2396 // mipLevels must be greater than 0
2397 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels,
2398 0u);
2399
2400 // arrayLayers must be greater than 0
2401 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers,
2402 0u);
2403
2404 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2405 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2406 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2407 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
2408 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
2409 }
2410
2411 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2412 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2413 // extent.height must be equal
2414 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2415 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
2416 skip_call |=
2417 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2418 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2419 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2420 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
2421 }
2422
2423 if (pCreateInfo->extent.depth != 1) {
2424 skip_call |=
2425 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2426 LayerName,
2427 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2428 }
2429 }
2430
2431 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2432 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2433 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
2434 skip_call |= log_msg(
2435 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2436 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2437 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
2438 }
2439
2440 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2441 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2442 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2443 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
2444 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2445 LayerName,
2446 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2447 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002448 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002449 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002450
Dustin Gravesf8032f22016-05-11 18:31:44 -06002451 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002452 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2453
Dustin Gravesf8032f22016-05-11 18:31:44 -06002454 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002455 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002456
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002457 return result;
2458}
2459
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002460VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002461 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002462 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002463 assert(my_data != NULL);
2464
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002465 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002466
Dustin Graves080069b2016-04-05 13:48:15 -06002467 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002468 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002469 }
2470}
2471
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002472bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2473 if (pSubresource != nullptr) {
2474 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2475 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002476 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2477 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002478 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2479 return false;
2480 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002481 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002482
2483 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002484}
2485
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002486VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2487vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002488 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002489 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002490 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002491
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002492 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002493
Dustin Graves080069b2016-04-05 13:48:15 -06002494 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002495 PreGetImageSubresourceLayout(device, pSubresource);
2496
2497 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002498 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002499}
2500
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002501VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2502 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
2503 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002504 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002505 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002506 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002507
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002508 skipCall |= parameter_validation_vkCreateImageView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002509
Dustin Graves080069b2016-04-05 13:48:15 -06002510 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002511 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2512
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002513 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002514 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002515
2516 return result;
2517}
2518
Dustin Graves27a912a2016-03-07 17:52:14 -07002519VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002520vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002521 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002522 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002523 assert(my_data != NULL);
2524
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002525 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002526
Dustin Graves080069b2016-04-05 13:48:15 -06002527 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002528 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002529 }
2530}
2531
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002532VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2533 const VkAllocationCallbacks *pAllocator,
2534 VkShaderModule *pShaderModule) {
2535 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002536 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002537 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002538 assert(my_data != NULL);
2539
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002540 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002541
Dustin Graves080069b2016-04-05 13:48:15 -06002542 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002543 result =
2544 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002545
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002546 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002547 }
2548
Michael Lentine03d8e572015-09-15 14:59:14 -05002549 return result;
2550}
2551
Dustin Graves27a912a2016-03-07 17:52:14 -07002552VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002553vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002554 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002555 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002556 assert(my_data != NULL);
2557
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002558 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002559
Dustin Graves080069b2016-04-05 13:48:15 -06002560 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002561 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002562 }
2563}
2564
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002565VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2566 const VkAllocationCallbacks *pAllocator,
2567 VkPipelineCache *pPipelineCache) {
2568 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002569 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002570 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002571 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002572
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002573 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002574
Dustin Graves080069b2016-04-05 13:48:15 -06002575 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002576 result =
2577 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002578
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002579 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002580 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002581
2582 return result;
2583}
2584
Dustin Graves27a912a2016-03-07 17:52:14 -07002585VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002586vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002587 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002588 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002589 assert(my_data != NULL);
2590
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002591 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002592
Dustin Graves080069b2016-04-05 13:48:15 -06002593 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002594 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002595 }
2596}
2597
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002598VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2599vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
2600 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002601 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002602 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002603 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002604
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002605 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002606
Dustin Graves080069b2016-04-05 13:48:15 -06002607 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002608 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2609
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002610 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002611 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002612
2613 return result;
2614}
2615
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002616VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2617vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
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_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002624
Dustin Graves080069b2016-04-05 13:48:15 -06002625 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002626 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2627
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002628 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002629 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002630
2631 return result;
2632}
2633
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002634bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002635 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2636
2637 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002638 if (pCreateInfos != nullptr) {
2639 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2640 if (pCreateInfos->basePipelineIndex != -1) {
2641 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002642 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2643 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002644 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2645 "pCreateInfos->flags "
2646 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2647 return false;
2648 }
2649 }
2650
2651 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2652 if (pCreateInfos->basePipelineIndex != -1) {
2653 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002654 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2655 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002656 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2657 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2658 "VK_NULL_HANDLE");
2659 return false;
2660 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002661 }
2662 }
2663
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002664 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002665 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002666 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2667 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002668 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2669 "unrecognized enumerator");
2670 return false;
2671 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002672 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002673
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002674 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002675 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002676 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002677 pCreateInfos[i].pStages[j].pName);
2678 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002679 }
2680
2681 return true;
2682}
2683
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002684VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2685vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2686 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2687 VkPipeline *pPipelines) {
2688 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002689 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002690 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002691 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002692
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002693 skipCall |= parameter_validation_vkCreateGraphicsPipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002694 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002695
Dustin Graves080069b2016-04-05 13:48:15 -06002696 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002697 PreCreateGraphicsPipelines(device, pCreateInfos);
2698
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002699 result = get_dispatch_table(pc_device_table_map, device)
2700 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002701
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002702 validate_result(my_data->report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002703 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002704
2705 return result;
2706}
2707
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002708bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002709 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2710
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002711 if (pCreateInfos != nullptr) {
2712 // TODO: Handle count!
2713 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002714 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002715 }
2716
2717 return true;
2718}
2719
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002720VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2721vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2722 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2723 VkPipeline *pPipelines) {
2724 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002725 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002726 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002727 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002728
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002729 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002730 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002731
Dustin Graves080069b2016-04-05 13:48:15 -06002732 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002733 PreCreateComputePipelines(device, pCreateInfos);
2734
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002735 result = get_dispatch_table(pc_device_table_map, device)
2736 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002737
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002738 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002739 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002740
2741 return result;
2742}
2743
Dustin Graves27a912a2016-03-07 17:52:14 -07002744VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002745vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002746 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002747 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002748 assert(my_data != NULL);
2749
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002750 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002751
Dustin Graves080069b2016-04-05 13:48:15 -06002752 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002753 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002754 }
2755}
2756
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002757VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2758vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2759 VkPipelineLayout *pPipelineLayout) {
2760 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002761 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002762 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002763 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002764
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002765 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002766
Dustin Graves080069b2016-04-05 13:48:15 -06002767 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002768 result =
2769 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002770
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002771 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002772 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002773
2774 return result;
2775}
2776
Dustin Graves27a912a2016-03-07 17:52:14 -07002777VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002778vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002779 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002780 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002781 assert(my_data != NULL);
2782
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002783 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002784
Dustin Graves080069b2016-04-05 13:48:15 -06002785 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002786 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002787 }
2788}
2789
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002790VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2791 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
2792 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002793 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002794 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002795 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002796
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002797 skipCall |= parameter_validation_vkCreateSampler(my_data->report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002798
Dustin Graves080069b2016-04-05 13:48:15 -06002799 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002800 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
2801
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002802 validate_result(my_data->report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002803 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002804
2805 return result;
2806}
2807
Dustin Graves27a912a2016-03-07 17:52:14 -07002808VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002809vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002810 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002811 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002812 assert(my_data != NULL);
2813
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002814 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002815
Dustin Graves080069b2016-04-05 13:48:15 -06002816 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002817 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002818 }
2819}
2820
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002821VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2822vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2823 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
2824 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002825 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002826 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002827 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002828
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002829 skipCall |= parameter_validation_vkCreateDescriptorSetLayout(my_data->report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002830
Dustin Graves080069b2016-04-05 13:48:15 -06002831 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002832 result =
2833 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002834
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002835 validate_result(my_data->report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002836 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002837
2838 return result;
2839}
2840
Dustin Graves27a912a2016-03-07 17:52:14 -07002841VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002842vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002843 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002844 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002845 assert(my_data != NULL);
2846
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002847 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -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)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002851 }
2852}
2853
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002854VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2855vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2856 VkDescriptorPool *pDescriptorPool) {
2857 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002858 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002859 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002860 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002861
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002862 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002863
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002864 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
2865
Dustin Graves080069b2016-04-05 13:48:15 -06002866 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002867 result =
2868 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002869
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002870 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002871 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002872
2873 return result;
2874}
2875
Dustin Graves27a912a2016-03-07 17:52:14 -07002876VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002877vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002878 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002879 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002880 assert(my_data != NULL);
2881
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002882 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002883
Dustin Graves080069b2016-04-05 13:48:15 -06002884 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002885 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002886 }
2887}
2888
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002889VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2890vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002891 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2892 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002893 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2894 assert(my_data != NULL);
2895
Dustin Graves20fd66f2016-04-18 18:33:21 -06002896 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002897
Dustin Graves20fd66f2016-04-18 18:33:21 -06002898 if (!skipCall) {
2899 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
2900
2901 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
2902 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002903
2904 return result;
2905}
2906
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002907VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2908vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
2909 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002910 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002911 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002912 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002913
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002914 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002915
Dustin Graves080069b2016-04-05 13:48:15 -06002916 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002917 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
2918
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002919 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002920 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002921
2922 return result;
2923}
2924
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002925VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
2926 uint32_t descriptorSetCount,
2927 const VkDescriptorSet *pDescriptorSets) {
2928 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002929 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002930 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002931 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002932
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002933 skipCall |= parameter_validation_vkFreeDescriptorSets(my_data->report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002934
Dustin Graves080069b2016-04-05 13:48:15 -06002935 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002936 result = get_dispatch_table(pc_device_table_map, device)
2937 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002938
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002939 validate_result(my_data->report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002940 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002941
2942 return result;
2943}
2944
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002945VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2946vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
2947 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Graves080069b2016-04-05 13:48:15 -06002948 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002949 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002950 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002951
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002952 skipCall |= parameter_validation_vkUpdateDescriptorSets(my_data->report_data, descriptorWriteCount, pDescriptorWrites,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002953 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002954
Dustin Graves080069b2016-04-05 13:48:15 -06002955 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002956 get_dispatch_table(pc_device_table_map, device)
2957 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002958 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002959}
2960
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002961VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2962 const VkAllocationCallbacks *pAllocator,
2963 VkFramebuffer *pFramebuffer) {
2964 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002965 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002966 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002967 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002968
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002969 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002970
Dustin Graves080069b2016-04-05 13:48:15 -06002971 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002972 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
2973
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002974 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002975 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002976
2977 return result;
2978}
2979
Dustin Graves27a912a2016-03-07 17:52:14 -07002980VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002981vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002982 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002983 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002984 assert(my_data != NULL);
2985
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002986 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002987
Dustin Graves080069b2016-04-05 13:48:15 -06002988 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002989 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002990 }
2991}
2992
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002993VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2994 const VkAllocationCallbacks *pAllocator,
2995 VkRenderPass *pRenderPass) {
2996 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002997 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002998 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002999 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003000
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003001 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003002
Dustin Graves080069b2016-04-05 13:48:15 -06003003 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003004 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3005
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003006 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003007 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003008
3009 return result;
3010}
3011
Dustin Graves27a912a2016-03-07 17:52:14 -07003012VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003013vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003014 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003015 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003016 assert(my_data != NULL);
3017
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003018 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003019
Dustin Graves080069b2016-04-05 13:48:15 -06003020 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003021 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003022 }
3023}
3024
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003025VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3026vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06003027 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003028 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003029 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003030
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003031 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003032
Dustin Graves080069b2016-04-05 13:48:15 -06003033 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003034 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003035 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003036}
3037
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003038VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3039 const VkAllocationCallbacks *pAllocator,
3040 VkCommandPool *pCommandPool) {
3041 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003042 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003043 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003044 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003045
Dustin Gravesde628532016-04-21 16:30:17 -06003046 skipCall |=
3047 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003048
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003049 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003050
Dustin Graves080069b2016-04-05 13:48:15 -06003051 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003052 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3053
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003054 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003055 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003056
3057 return result;
3058}
3059
Dustin Graves27a912a2016-03-07 17:52:14 -07003060VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003061vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003062 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003063 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003064 assert(my_data != NULL);
3065
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003066 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003067
Dustin Graves080069b2016-04-05 13:48:15 -06003068 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003069 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003070 }
3071}
3072
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003073VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3074vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003075 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3076 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003077 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3078 assert(my_data != NULL);
3079
Dustin Graves20fd66f2016-04-18 18:33:21 -06003080 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003081
Dustin Graves20fd66f2016-04-18 18:33:21 -06003082 if (!skipCall) {
3083 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3084
3085 validate_result(my_data->report_data, "vkResetCommandPool", result);
3086 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003087
3088 return result;
3089}
3090
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003091VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3092vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
3093 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003094 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003095 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003096 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003097
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003098 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003099
Dustin Graves080069b2016-04-05 13:48:15 -06003100 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003101 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3102
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003103 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003104 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003105
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003106 return result;
3107}
3108
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003109VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3110 uint32_t commandBufferCount,
3111 const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003112 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003113 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003114 assert(my_data != NULL);
3115
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003116 skipCall |= parameter_validation_vkFreeCommandBuffers(my_data->report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003117
Dustin Graves080069b2016-04-05 13:48:15 -06003118 if (!skipCall) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003119 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003120 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003121 }
3122}
3123
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003124VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3125vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3126 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003127 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003128 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003129 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003130
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003131 skipCall |= parameter_validation_vkBeginCommandBuffer(my_data->report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003132
Dustin Graves080069b2016-04-05 13:48:15 -06003133 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003134 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3135
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003136 validate_result(my_data->report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003137 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003138
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003139 return result;
3140}
3141
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003142VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003143 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3144 assert(my_data != NULL);
3145
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003146 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003147
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003148 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003149
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003150 return result;
3151}
3152
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003153VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3154vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003155 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003156 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3157 assert(my_data != NULL);
3158
Dustin Graves16d18972016-05-09 17:36:57 -06003159 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003160
Dustin Graves16d18972016-05-09 17:36:57 -06003161 if (!skip_call) {
3162 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3163
3164 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3165 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003166
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003167 return result;
3168}
3169
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003170VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3171vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003172 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003173 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3174 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003175
Dustin Graves29148ff2016-03-23 19:44:00 -06003176 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3177
Dustin Graves080069b2016-04-05 13:48:15 -06003178 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003179 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3180 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003181}
3182
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003183VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3184vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003185 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003186 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003187 assert(my_data != NULL);
3188
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003189 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003190
Dustin Graves080069b2016-04-05 13:48:15 -06003191 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003192 get_dispatch_table(pc_device_table_map, commandBuffer)
3193 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003194 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003195}
3196
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003197VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3198vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003199 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003200 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003201 assert(my_data != NULL);
3202
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003203 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003204
Dustin Graves080069b2016-04-05 13:48:15 -06003205 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003206 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3207 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003208}
3209
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003210VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003211 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003212}
3213
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003214VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3215vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
3216 get_dispatch_table(pc_device_table_map, commandBuffer)
3217 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003218}
3219
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003220VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003221 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003222 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003223 assert(my_data != NULL);
3224
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003225 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003226
Dustin Graves080069b2016-04-05 13:48:15 -06003227 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003228 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3229 }
Cody Northrop12365112015-08-17 11:10:49 -06003230}
3231
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003232VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3233vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003234 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003235}
3236
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003237VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3238vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003239 bool skipCall = false;
3240 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3241 assert(my_data != NULL);
3242
3243 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3244
3245 if (!skipCall) {
3246 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3247 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003248}
3249
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003250VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3251vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003252 bool skipCall = false;
3253 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3254 assert(my_data != NULL);
3255
3256 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3257
3258 if (!skipCall) {
3259 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3260 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003261}
3262
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003263VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3264vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003265 bool skipCall = false;
3266 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3267 assert(my_data != NULL);
3268
3269 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3270
3271 if (!skipCall) {
3272 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3273 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003274}
3275
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003276VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3277vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3278 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3279 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003280 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003281 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003282 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003283
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003284 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003285 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003286
Dustin Graves080069b2016-04-05 13:48:15 -06003287 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003288 get_dispatch_table(pc_device_table_map, commandBuffer)
3289 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3290 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003291 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003292}
3293
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003294VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3295vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003296 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003297 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3298 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003299
Dustin Graves29148ff2016-03-23 19:44:00 -06003300 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3301
Dustin Graves080069b2016-04-05 13:48:15 -06003302 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003303 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3304 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003305}
3306
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003307VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3308 uint32_t bindingCount, const VkBuffer *pBuffers,
3309 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003310 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003311 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003312 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003313
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003314 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003315
Dustin Graves080069b2016-04-05 13:48:15 -06003316 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003317 get_dispatch_table(pc_device_table_map, commandBuffer)
3318 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003319 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003320}
3321
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003322bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3323 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003324 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003325 // 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 -07003326 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003327 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3328 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003329 return false;
3330 }
3331
3332 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003333 // 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 -07003334 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003335 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3336 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003337 return false;
3338 }
3339
3340 return true;
3341}
3342
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003343VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3344 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003345 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06003346
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003347 get_dispatch_table(pc_device_table_map, commandBuffer)
3348 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003349}
3350
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003351VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3352 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3353 uint32_t firstInstance) {
3354 get_dispatch_table(pc_device_table_map, commandBuffer)
3355 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003356}
3357
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003358VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3359vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003360 bool skipCall = false;
3361 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3362 assert(my_data != NULL);
3363
3364 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
3365
3366 if (!skipCall) {
3367 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
3368 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003369}
3370
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003371VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3372vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003373 bool skipCall = false;
3374 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3375 assert(my_data != NULL);
3376
3377 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
3378
3379 if (!skipCall) {
3380 get_dispatch_table(pc_device_table_map, commandBuffer)
3381 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
3382 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003383}
3384
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003385VK_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 -07003386 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003387}
3388
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003389VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3390vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003391 bool skipCall = false;
3392 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3393 assert(my_data != NULL);
3394
3395 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
3396
3397 if (!skipCall) {
3398 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
3399 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003400}
3401
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003402VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
3403 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003404 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003405 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003406 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003407
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003408 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003409
Dustin Graves080069b2016-04-05 13:48:15 -06003410 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003411 get_dispatch_table(pc_device_table_map, commandBuffer)
3412 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003413 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003414}
3415
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003416bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
3417 if (pRegions != nullptr) {
3418 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3419 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003420 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3421 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003422 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3423 return false;
3424 }
3425 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3426 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003427 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3428 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003429 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3430 return false;
3431 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003432 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003433
3434 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003435}
3436
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003437VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3438vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3439 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003440 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003441 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003442 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003443
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003444 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003445 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003446
Dustin Graves080069b2016-04-05 13:48:15 -06003447 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003448 PreCmdCopyImage(commandBuffer, pRegions);
3449
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003450 get_dispatch_table(pc_device_table_map, commandBuffer)
3451 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003452 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003453}
3454
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003455bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
3456 if (pRegions != nullptr) {
3457 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3458 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003459 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3460 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003461 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3462 return false;
3463 }
3464 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3465 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003466 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3467 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003468 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3469 return false;
3470 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003471 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003472
3473 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003474}
3475
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003476VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3477vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3478 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06003479 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003480 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003481 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003482
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003483 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003484 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003485
Dustin Graves080069b2016-04-05 13:48:15 -06003486 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003487 PreCmdBlitImage(commandBuffer, pRegions);
3488
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003489 get_dispatch_table(pc_device_table_map, commandBuffer)
3490 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003491 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003492}
3493
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003494bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3495 if (pRegions != nullptr) {
3496 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3497 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003498 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3499 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003500 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3501 "enumerator");
3502 return false;
3503 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003504 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003505
3506 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003507}
3508
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003509VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
3510 VkImage dstImage, VkImageLayout dstImageLayout,
3511 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003512 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003513 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003514 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003515
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003516 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003517 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003518
Dustin Graves080069b2016-04-05 13:48:15 -06003519 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003520 PreCmdCopyBufferToImage(commandBuffer, pRegions);
3521
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003522 get_dispatch_table(pc_device_table_map, commandBuffer)
3523 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003524 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003525}
3526
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003527bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3528 if (pRegions != nullptr) {
3529 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3530 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003531 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3532 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003533 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3534 "enumerator");
3535 return false;
3536 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003537 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003538
3539 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003540}
3541
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003542VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
3543 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
3544 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003545 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003546 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003547 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003548
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003549 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003550 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003551
Dustin Graves080069b2016-04-05 13:48:15 -06003552 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003553 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
3554
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003555 get_dispatch_table(pc_device_table_map, commandBuffer)
3556 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003557 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003558}
3559
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003560VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
3561 VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) {
Dustin Graves080069b2016-04-05 13:48:15 -06003562 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003563 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003564 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003565
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003566 skipCall |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003567
Dustin Graves080069b2016-04-05 13:48:15 -06003568 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003569 get_dispatch_table(pc_device_table_map, commandBuffer)
3570 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003571 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003572}
3573
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003574VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3575vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003576 bool skipCall = false;
3577 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3578 assert(my_data != NULL);
3579
3580 skipCall |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
3581
3582 if (!skipCall) {
3583 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
3584 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003585}
3586
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003587VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
3588 VkImageLayout imageLayout, const VkClearColorValue *pColor,
3589 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003590 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003591 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003592 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003593
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003594 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003595
Dustin Graves080069b2016-04-05 13:48:15 -06003596 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003597 get_dispatch_table(pc_device_table_map, commandBuffer)
3598 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003599 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003600}
3601
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003602VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3603vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
3604 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
3605 const VkImageSubresourceRange *pRanges) {
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
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003610 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003611 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003612
Dustin Graves080069b2016-04-05 13:48:15 -06003613 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003614 get_dispatch_table(pc_device_table_map, commandBuffer)
3615 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003616 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003617}
3618
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003619VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
3620 const VkClearAttachment *pAttachments, uint32_t rectCount,
3621 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06003622 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003623 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003624 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003625
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003626 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003627
Dustin Graves080069b2016-04-05 13:48:15 -06003628 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003629 get_dispatch_table(pc_device_table_map, commandBuffer)
3630 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003631 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003632}
3633
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003634bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
3635 if (pRegions != nullptr) {
3636 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3637 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3638 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06003639 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3640 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003641 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3642 return false;
3643 }
3644 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3645 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3646 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06003647 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3648 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003649 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3650 return false;
3651 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003652 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003653
3654 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003655}
3656
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003657VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3658vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3659 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003660 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003661 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003662 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003663
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003664 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003665 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003666
Dustin Graves080069b2016-04-05 13:48:15 -06003667 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003668 PreCmdResolveImage(commandBuffer, pRegions);
3669
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003670 get_dispatch_table(pc_device_table_map, commandBuffer)
3671 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003672 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003673}
3674
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003675VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3676vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003677 bool skipCall = false;
3678 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3679 assert(my_data != NULL);
3680
3681 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
3682
3683 if (!skipCall) {
3684 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
3685 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003686}
3687
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003688VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3689vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003690 bool skipCall = false;
3691 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3692 assert(my_data != NULL);
3693
3694 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
3695
3696 if (!skipCall) {
3697 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
3698 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003699}
3700
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003701VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3702vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
3703 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3704 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3705 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003706 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003707 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003708 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003709
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003710 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003711 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
3712 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003713
Dustin Graves080069b2016-04-05 13:48:15 -06003714 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003715 get_dispatch_table(pc_device_table_map, commandBuffer)
3716 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
3717 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003718 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003719}
3720
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003721VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3722vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
3723 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3724 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3725 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003726 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003727 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003728 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003729
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003730 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003731 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
3732 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003733
Dustin Graves080069b2016-04-05 13:48:15 -06003734 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003735 get_dispatch_table(pc_device_table_map, commandBuffer)
3736 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
3737 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003738 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003739}
3740
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003741VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3742vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003743 bool skipCall = false;
3744 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3745 assert(my_data != NULL);
3746
3747 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
3748
3749 if (!skipCall) {
3750 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
3751 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003752}
3753
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003754VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003755 bool skipCall = false;
3756 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3757 assert(my_data != NULL);
3758
3759 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
3760
3761 if (!skipCall) {
3762 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
3763 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003764}
3765
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003766VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3767vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003768 bool skipCall = false;
3769 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3770 assert(my_data != NULL);
3771
3772 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
3773
3774 if (!skipCall) {
3775 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
3776 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003777}
3778
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003779bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
3780 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003781
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08003782 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003783
3784 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003785}
3786
Dustin Graves20fd66f2016-04-18 18:33:21 -06003787VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
3788 VkQueryPool queryPool, uint32_t query) {
3789 bool skipCall = false;
3790 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3791 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003792
Dustin Graves20fd66f2016-04-18 18:33:21 -06003793 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
3794
3795 if (!skipCall) {
3796 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3797
3798 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3799 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003800}
3801
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003802VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3803vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
3804 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003805 bool skipCall = false;
3806 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3807 assert(my_data != NULL);
3808
3809 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
3810 dstOffset, stride, flags);
3811
3812 if (!skipCall) {
3813 get_dispatch_table(pc_device_table_map, commandBuffer)
3814 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
3815 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003816}
3817
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003818VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
3819 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
3820 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06003821 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003822 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003823 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003824
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003825 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003826
Dustin Graves080069b2016-04-05 13:48:15 -06003827 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003828 get_dispatch_table(pc_device_table_map, commandBuffer)
3829 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003830 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003831}
3832
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003833VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3834vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003835 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003836 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003837 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003838
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003839 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003840
Dustin Graves080069b2016-04-05 13:48:15 -06003841 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003842 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003843 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003844}
3845
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003846VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003847 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003848 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3849 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08003850
Dustin Graves29148ff2016-03-23 19:44:00 -06003851 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
3852
Dustin Graves080069b2016-04-05 13:48:15 -06003853 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003854 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
3855 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003856}
3857
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003858VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003859 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003860}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003861
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003862VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3863vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003864 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003865 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003866 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003867
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003868 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08003869
Dustin Graves080069b2016-04-05 13:48:15 -06003870 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003871 get_dispatch_table(pc_device_table_map, commandBuffer)
3872 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003873 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003874}
3875
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003876VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003877 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3878
Dustin Graves080069b2016-04-05 13:48:15 -06003879 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003880 return NULL;
3881 }
3882
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003883 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003884 return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003885 if (!strcmp(funcName, "vkDestroyDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003886 return (PFN_vkVoidFunction)vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003887 if (!strcmp(funcName, "vkGetDeviceQueue"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003888 return (PFN_vkVoidFunction)vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003889 if (!strcmp(funcName, "vkQueueSubmit"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003890 return (PFN_vkVoidFunction)vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003891 if (!strcmp(funcName, "vkQueueWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003892 return (PFN_vkVoidFunction)vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003893 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003894 return (PFN_vkVoidFunction)vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003895 if (!strcmp(funcName, "vkAllocateMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003896 return (PFN_vkVoidFunction)vkAllocateMemory;
Dustin Graves27a912a2016-03-07 17:52:14 -07003897 if (!strcmp(funcName, "vkFreeMemory"))
3898 return (PFN_vkVoidFunction)vkFreeMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003899 if (!strcmp(funcName, "vkMapMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003900 return (PFN_vkVoidFunction)vkMapMemory;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003901 if (!strcmp(funcName, "vkUnmapMemory"))
3902 return (PFN_vkVoidFunction)vkUnmapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003903 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003904 return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003905 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003906 return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003907 if (!strcmp(funcName, "vkGetDeviceMemoryCommitment"))
3908 return (PFN_vkVoidFunction)vkGetDeviceMemoryCommitment;
3909 if (!strcmp(funcName, "vkBindBufferMemory"))
3910 return (PFN_vkVoidFunction)vkBindBufferMemory;
3911 if (!strcmp(funcName, "vkBindImageMemory"))
3912 return (PFN_vkVoidFunction)vkBindImageMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003913 if (!strcmp(funcName, "vkCreateFence"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003914 return (PFN_vkVoidFunction)vkCreateFence;
Dustin Graves27a912a2016-03-07 17:52:14 -07003915 if (!strcmp(funcName, "vkDestroyFence"))
3916 return (PFN_vkVoidFunction)vkDestroyFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003917 if (!strcmp(funcName, "vkResetFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003918 return (PFN_vkVoidFunction)vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003919 if (!strcmp(funcName, "vkGetFenceStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003920 return (PFN_vkVoidFunction)vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003921 if (!strcmp(funcName, "vkWaitForFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003922 return (PFN_vkVoidFunction)vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003923 if (!strcmp(funcName, "vkCreateSemaphore"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003924 return (PFN_vkVoidFunction)vkCreateSemaphore;
Dustin Graves27a912a2016-03-07 17:52:14 -07003925 if (!strcmp(funcName, "vkDestroySemaphore"))
3926 return (PFN_vkVoidFunction)vkDestroySemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003927 if (!strcmp(funcName, "vkCreateEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003928 return (PFN_vkVoidFunction)vkCreateEvent;
Dustin Graves27a912a2016-03-07 17:52:14 -07003929 if (!strcmp(funcName, "vkDestroyEvent"))
3930 return (PFN_vkVoidFunction)vkDestroyEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003931 if (!strcmp(funcName, "vkGetEventStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003932 return (PFN_vkVoidFunction)vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003933 if (!strcmp(funcName, "vkSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003934 return (PFN_vkVoidFunction)vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003935 if (!strcmp(funcName, "vkResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003936 return (PFN_vkVoidFunction)vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003937 if (!strcmp(funcName, "vkCreateQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003938 return (PFN_vkVoidFunction)vkCreateQueryPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07003939 if (!strcmp(funcName, "vkDestroyQueryPool"))
3940 return (PFN_vkVoidFunction)vkDestroyQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003941 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003942 return (PFN_vkVoidFunction)vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003943 if (!strcmp(funcName, "vkCreateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003944 return (PFN_vkVoidFunction)vkCreateBuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07003945 if (!strcmp(funcName, "vkDestroyBuffer"))
3946 return (PFN_vkVoidFunction)vkDestroyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003947 if (!strcmp(funcName, "vkCreateBufferView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003948 return (PFN_vkVoidFunction)vkCreateBufferView;
Dustin Graves27a912a2016-03-07 17:52:14 -07003949 if (!strcmp(funcName, "vkDestroyBufferView"))
3950 return (PFN_vkVoidFunction)vkDestroyBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003951 if (!strcmp(funcName, "vkCreateImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003952 return (PFN_vkVoidFunction)vkCreateImage;
Dustin Graves27a912a2016-03-07 17:52:14 -07003953 if (!strcmp(funcName, "vkDestroyImage"))
3954 return (PFN_vkVoidFunction)vkDestroyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003955 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003956 return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003957 if (!strcmp(funcName, "vkCreateImageView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003958 return (PFN_vkVoidFunction)vkCreateImageView;
Dustin Graves27a912a2016-03-07 17:52:14 -07003959 if (!strcmp(funcName, "vkDestroyImageView"))
3960 return (PFN_vkVoidFunction)vkDestroyImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05003961 if (!strcmp(funcName, "vkCreateShaderModule"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003962 return (PFN_vkVoidFunction)vkCreateShaderModule;
Dustin Graves27a912a2016-03-07 17:52:14 -07003963 if (!strcmp(funcName, "vkDestroyShaderModule"))
3964 return (PFN_vkVoidFunction)vkDestroyShaderModule;
3965 if (!strcmp(funcName, "vkCreatePipelineCache"))
3966 return (PFN_vkVoidFunction)vkCreatePipelineCache;
3967 if (!strcmp(funcName, "vkDestroyPipelineCache"))
3968 return (PFN_vkVoidFunction)vkDestroyPipelineCache;
3969 if (!strcmp(funcName, "vkGetPipelineCacheData"))
3970 return (PFN_vkVoidFunction)vkGetPipelineCacheData;
3971 if (!strcmp(funcName, "vkMergePipelineCaches"))
3972 return (PFN_vkVoidFunction)vkMergePipelineCaches;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003973 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003974 return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003975 if (!strcmp(funcName, "vkCreateComputePipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003976 return (PFN_vkVoidFunction)vkCreateComputePipelines;
Dustin Graves27a912a2016-03-07 17:52:14 -07003977 if (!strcmp(funcName, "vkDestroyPipeline"))
3978 return (PFN_vkVoidFunction)vkDestroyPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003979 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003980 return (PFN_vkVoidFunction)vkCreatePipelineLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07003981 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
3982 return (PFN_vkVoidFunction)vkDestroyPipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003983 if (!strcmp(funcName, "vkCreateSampler"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003984 return (PFN_vkVoidFunction)vkCreateSampler;
Dustin Graves27a912a2016-03-07 17:52:14 -07003985 if (!strcmp(funcName, "vkDestroySampler"))
3986 return (PFN_vkVoidFunction)vkDestroySampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003987 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003988 return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07003989 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
3990 return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003991 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003992 return (PFN_vkVoidFunction)vkCreateDescriptorPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07003993 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
3994 return (PFN_vkVoidFunction)vkDestroyDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003995 if (!strcmp(funcName, "vkResetDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003996 return (PFN_vkVoidFunction)vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003997 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003998 return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06003999 if (!strcmp(funcName, "vkCmdSetViewport"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004000 return (PFN_vkVoidFunction)vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004001 if (!strcmp(funcName, "vkCmdSetScissor"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004002 return (PFN_vkVoidFunction)vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004003 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004004 return (PFN_vkVoidFunction)vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004005 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004006 return (PFN_vkVoidFunction)vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004007 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004008 return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004009 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004010 return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004011 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004012 return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004013 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004014 return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004015 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004016 return (PFN_vkVoidFunction)vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004017 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004018 return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004019 if (!strcmp(funcName, "vkFreeCommandBuffers"))
4020 return (PFN_vkVoidFunction)vkFreeCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004021 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004022 return (PFN_vkVoidFunction)vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004023 if (!strcmp(funcName, "vkEndCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004024 return (PFN_vkVoidFunction)vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004025 if (!strcmp(funcName, "vkResetCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004026 return (PFN_vkVoidFunction)vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004027 if (!strcmp(funcName, "vkCmdBindPipeline"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004028 return (PFN_vkVoidFunction)vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004029 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004030 return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004031 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004032 return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004033 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004034 return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004035 if (!strcmp(funcName, "vkCmdDraw"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004036 return (PFN_vkVoidFunction)vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004037 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004038 return (PFN_vkVoidFunction)vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004039 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004040 return (PFN_vkVoidFunction)vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004041 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004042 return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004043 if (!strcmp(funcName, "vkCmdDispatch"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004044 return (PFN_vkVoidFunction)vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004045 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004046 return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004047 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004048 return (PFN_vkVoidFunction)vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004049 if (!strcmp(funcName, "vkCmdCopyImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004050 return (PFN_vkVoidFunction)vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004051 if (!strcmp(funcName, "vkCmdBlitImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004052 return (PFN_vkVoidFunction)vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004053 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004054 return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004055 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004056 return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004057 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004058 return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004059 if (!strcmp(funcName, "vkCmdFillBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004060 return (PFN_vkVoidFunction)vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004061 if (!strcmp(funcName, "vkCmdClearColorImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004062 return (PFN_vkVoidFunction)vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004063 if (!strcmp(funcName, "vkCmdResolveImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004064 return (PFN_vkVoidFunction)vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004065 if (!strcmp(funcName, "vkCmdSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004066 return (PFN_vkVoidFunction)vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004067 if (!strcmp(funcName, "vkCmdResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004068 return (PFN_vkVoidFunction)vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004069 if (!strcmp(funcName, "vkCmdWaitEvents"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004070 return (PFN_vkVoidFunction)vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004071 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004072 return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004073 if (!strcmp(funcName, "vkCmdBeginQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004074 return (PFN_vkVoidFunction)vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004075 if (!strcmp(funcName, "vkCmdEndQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004076 return (PFN_vkVoidFunction)vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004077 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004078 return (PFN_vkVoidFunction)vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004079 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004080 return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004081 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004082 return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004083 if (!strcmp(funcName, "vkCreateFramebuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004084 return (PFN_vkVoidFunction)vkCreateFramebuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07004085 if (!strcmp(funcName, "vkDestroyFramebuffer"))
4086 return (PFN_vkVoidFunction)vkDestroyFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004087 if (!strcmp(funcName, "vkCreateRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004088 return (PFN_vkVoidFunction)vkCreateRenderPass;
Dustin Graves27a912a2016-03-07 17:52:14 -07004089 if (!strcmp(funcName, "vkDestroyRenderPass"))
4090 return (PFN_vkVoidFunction)vkDestroyRenderPass;
4091 if (!strcmp(funcName, "vkGetRenderAreaGranularity"))
4092 return (PFN_vkVoidFunction)vkGetRenderAreaGranularity;
4093 if (!strcmp(funcName, "vkCreateCommandPool"))
4094 return (PFN_vkVoidFunction)vkCreateCommandPool;
4095 if (!strcmp(funcName, "vkDestroyCommandPool"))
4096 return (PFN_vkVoidFunction)vkDestroyCommandPool;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004097 if (!strcmp(funcName, "vkResetCommandPool"))
4098 return (PFN_vkVoidFunction)vkResetCommandPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004099 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004100 return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08004101 if (!strcmp(funcName, "vkCmdNextSubpass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004102 return (PFN_vkVoidFunction)vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06004103
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004104 if (device == NULL) {
4105 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004106 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004107
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004108 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004109 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004110 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004111}
4112
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004113VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004114 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004115 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004116 if (!strcmp(funcName, "vkCreateInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004117 return (PFN_vkVoidFunction)vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004118 if (!strcmp(funcName, "vkDestroyInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004119 return (PFN_vkVoidFunction)vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004120 if (!strcmp(funcName, "vkCreateDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004121 return (PFN_vkVoidFunction)vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004122 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004123 return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004124 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004125 return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004126 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004127 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06004128 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004129 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
Dustin Graves16d18972016-05-09 17:36:57 -06004130 if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties"))
4131 return (PFN_vkVoidFunction)vkGetPhysicalDeviceImageFormatProperties;
4132 if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties"))
4133 return (PFN_vkVoidFunction)vkGetPhysicalDeviceSparseImageFormatProperties;
4134 if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties"))
4135 return (PFN_vkVoidFunction)vkGetPhysicalDeviceQueueFamilyProperties;
4136 if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties"))
4137 return (PFN_vkVoidFunction)vkGetPhysicalDeviceMemoryProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004138 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004139 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004140 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004141 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004142 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004143 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004144 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004145 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004146
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004147 if (instance == NULL) {
4148 return NULL;
4149 }
4150
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004151 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004152
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004153 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004154 if (fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004155 return fptr;
4156
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004157 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004158 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004159 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004160}