blob: 20676b4ae23d7370c8d7c827e3a908d6c862f029 [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 Graves0b70a632016-04-27 17:44:56 -06002504 bool skip_call = 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);
Dustin Graves0b70a632016-04-27 17:44:56 -06002507 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002508
Dustin Graves0b70a632016-04-27 17:44:56 -06002509 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002510
Dustin Graves0b70a632016-04-27 17:44:56 -06002511 if (pCreateInfo != nullptr) {
2512 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
2513 if (pCreateInfo->subresourceRange.layerCount != 1) {
2514 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2515 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2516 "pCreateInfo->subresourceRange.layerCount must be 1",
2517 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2518 }
2519 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
2520 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY)) {
2521 if (pCreateInfo->subresourceRange.layerCount < 1) {
2522 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2523 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2524 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2525 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2526 }
2527 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
2528 if (pCreateInfo->subresourceRange.layerCount != 6) {
2529 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2530 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2531 "pCreateInfo->subresourceRange.layerCount must be 6");
2532 }
2533 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
2534 if ((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) {
2535 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2536 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2537 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2538 }
2539 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2540 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2541 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2542 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2543 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2544 }
2545
2546 if (pCreateInfo->subresourceRange.layerCount != 1) {
2547 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2548 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2549 "pCreateInfo->subresourceRange.layerCount must be 1");
2550 }
2551 }
2552 }
2553
2554 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002555 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2556
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002557 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002558 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002559
2560 return result;
2561}
2562
Dustin Graves27a912a2016-03-07 17:52:14 -07002563VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002564vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002565 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002566 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002567 assert(my_data != NULL);
2568
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002569 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002570
Dustin Graves080069b2016-04-05 13:48:15 -06002571 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002572 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002573 }
2574}
2575
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002576VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2577 const VkAllocationCallbacks *pAllocator,
2578 VkShaderModule *pShaderModule) {
2579 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002580 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002581 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002582 assert(my_data != NULL);
2583
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002584 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002585
Dustin Graves080069b2016-04-05 13:48:15 -06002586 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002587 result =
2588 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002589
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002590 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002591 }
2592
Michael Lentine03d8e572015-09-15 14:59:14 -05002593 return result;
2594}
2595
Dustin Graves27a912a2016-03-07 17:52:14 -07002596VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002597vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002598 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002599 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002600 assert(my_data != NULL);
2601
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002602 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002603
Dustin Graves080069b2016-04-05 13:48:15 -06002604 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002605 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002606 }
2607}
2608
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002609VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2610 const VkAllocationCallbacks *pAllocator,
2611 VkPipelineCache *pPipelineCache) {
2612 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002613 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002614 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002615 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002616
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002617 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002618
Dustin Graves080069b2016-04-05 13:48:15 -06002619 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002620 result =
2621 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002622
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002623 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002624 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002625
2626 return result;
2627}
2628
Dustin Graves27a912a2016-03-07 17:52:14 -07002629VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002630vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002631 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002632 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002633 assert(my_data != NULL);
2634
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002635 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002636
Dustin Graves080069b2016-04-05 13:48:15 -06002637 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002638 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002639 }
2640}
2641
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002642VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2643vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
2644 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002645 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002646 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002647 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002648
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002649 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002650
Dustin Graves080069b2016-04-05 13:48:15 -06002651 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002652 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2653
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002654 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002655 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002656
2657 return result;
2658}
2659
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002660VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2661vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
2662 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002663 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002664 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002665 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002666
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002667 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002668
Dustin Graves080069b2016-04-05 13:48:15 -06002669 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002670 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2671
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002672 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002673 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002674
2675 return result;
2676}
2677
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002678bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002679 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2680
2681 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002682 if (pCreateInfos != nullptr) {
2683 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2684 if (pCreateInfos->basePipelineIndex != -1) {
2685 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002686 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2687 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002688 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2689 "pCreateInfos->flags "
2690 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2691 return false;
2692 }
2693 }
2694
2695 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2696 if (pCreateInfos->basePipelineIndex != -1) {
2697 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002698 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2699 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002700 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2701 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2702 "VK_NULL_HANDLE");
2703 return false;
2704 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002705 }
2706 }
2707
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002708 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002709 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002710 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2711 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002712 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2713 "unrecognized enumerator");
2714 return false;
2715 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002716 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002717
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002718 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002719 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002720 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002721 pCreateInfos[i].pStages[j].pName);
2722 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002723 }
2724
2725 return true;
2726}
2727
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002728VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2729vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2730 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2731 VkPipeline *pPipelines) {
2732 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002733 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002734 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002735 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002736
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002737 skipCall |= parameter_validation_vkCreateGraphicsPipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002738 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002739
Dustin Graves080069b2016-04-05 13:48:15 -06002740 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002741 PreCreateGraphicsPipelines(device, pCreateInfos);
2742
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002743 result = get_dispatch_table(pc_device_table_map, device)
2744 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002745
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002746 validate_result(my_data->report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002747 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002748
2749 return result;
2750}
2751
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002752bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002753 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2754
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002755 if (pCreateInfos != nullptr) {
2756 // TODO: Handle count!
2757 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002758 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002759 }
2760
2761 return true;
2762}
2763
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002764VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2765vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2766 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2767 VkPipeline *pPipelines) {
2768 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002769 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002770 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002771 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002772
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002773 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002774 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002775
Dustin Graves080069b2016-04-05 13:48:15 -06002776 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002777 PreCreateComputePipelines(device, pCreateInfos);
2778
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002779 result = get_dispatch_table(pc_device_table_map, device)
2780 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002781
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002782 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002783 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002784
2785 return result;
2786}
2787
Dustin Graves27a912a2016-03-07 17:52:14 -07002788VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002789vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002790 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002791 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002792 assert(my_data != NULL);
2793
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002794 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002795
Dustin Graves080069b2016-04-05 13:48:15 -06002796 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002797 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002798 }
2799}
2800
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002801VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2802vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2803 VkPipelineLayout *pPipelineLayout) {
2804 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002805 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002806 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002807 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002808
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002809 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002810
Dustin Graves080069b2016-04-05 13:48:15 -06002811 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002812 result =
2813 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002814
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002815 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002816 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002817
2818 return result;
2819}
2820
Dustin Graves27a912a2016-03-07 17:52:14 -07002821VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002822vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002823 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002824 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002825 assert(my_data != NULL);
2826
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002827 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002828
Dustin Graves080069b2016-04-05 13:48:15 -06002829 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002830 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002831 }
2832}
2833
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002834VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2835 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
2836 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002837 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002838 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002839 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002840
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002841 skipCall |= parameter_validation_vkCreateSampler(my_data->report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002842
Dustin Graves080069b2016-04-05 13:48:15 -06002843 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002844 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
2845
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002846 validate_result(my_data->report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002847 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002848
2849 return result;
2850}
2851
Dustin Graves27a912a2016-03-07 17:52:14 -07002852VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002853vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002854 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002855 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002856 assert(my_data != NULL);
2857
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002858 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002859
Dustin Graves080069b2016-04-05 13:48:15 -06002860 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002861 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002862 }
2863}
2864
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002865VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2866vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2867 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
2868 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002869 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002870 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002871 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002872
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002873 skipCall |= parameter_validation_vkCreateDescriptorSetLayout(my_data->report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002874
Dustin Graves080069b2016-04-05 13:48:15 -06002875 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002876 result =
2877 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002878
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002879 validate_result(my_data->report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002880 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002881
2882 return result;
2883}
2884
Dustin Graves27a912a2016-03-07 17:52:14 -07002885VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002886vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002887 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002888 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002889 assert(my_data != NULL);
2890
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002891 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002892
Dustin Graves080069b2016-04-05 13:48:15 -06002893 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002894 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002895 }
2896}
2897
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002898VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2899vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2900 VkDescriptorPool *pDescriptorPool) {
2901 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002902 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002903 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002904 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002905
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002906 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002907
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002908 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
2909
Dustin Graves080069b2016-04-05 13:48:15 -06002910 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002911 result =
2912 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002913
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002914 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002915 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002916
2917 return result;
2918}
2919
Dustin Graves27a912a2016-03-07 17:52:14 -07002920VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002921vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002922 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002923 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002924 assert(my_data != NULL);
2925
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002926 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002927
Dustin Graves080069b2016-04-05 13:48:15 -06002928 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002929 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002930 }
2931}
2932
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002933VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2934vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002935 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2936 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002937 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2938 assert(my_data != NULL);
2939
Dustin Graves20fd66f2016-04-18 18:33:21 -06002940 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002941
Dustin Graves20fd66f2016-04-18 18:33:21 -06002942 if (!skipCall) {
2943 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
2944
2945 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
2946 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002947
2948 return result;
2949}
2950
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002951VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2952vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
2953 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002954 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002955 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002956 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002957
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002958 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002959
Dustin Graves080069b2016-04-05 13:48:15 -06002960 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002961 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
2962
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002963 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002964 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002965
2966 return result;
2967}
2968
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002969VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
2970 uint32_t descriptorSetCount,
2971 const VkDescriptorSet *pDescriptorSets) {
2972 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002973 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002974 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002975 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002976
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002977 skipCall |= parameter_validation_vkFreeDescriptorSets(my_data->report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002978
Dustin Graves080069b2016-04-05 13:48:15 -06002979 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002980 result = get_dispatch_table(pc_device_table_map, device)
2981 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002982
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002983 validate_result(my_data->report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002984 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002985
2986 return result;
2987}
2988
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002989VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2990vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
2991 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Graves080069b2016-04-05 13:48:15 -06002992 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002993 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002994 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002995
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002996 skipCall |= parameter_validation_vkUpdateDescriptorSets(my_data->report_data, descriptorWriteCount, pDescriptorWrites,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002997 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002998
Dustin Graves080069b2016-04-05 13:48:15 -06002999 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003000 get_dispatch_table(pc_device_table_map, device)
3001 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003002 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003003}
3004
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003005VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3006 const VkAllocationCallbacks *pAllocator,
3007 VkFramebuffer *pFramebuffer) {
3008 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003009 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003010 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003011 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003012
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003013 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003014
Dustin Graves080069b2016-04-05 13:48:15 -06003015 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003016 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3017
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003018 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003019 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003020
3021 return result;
3022}
3023
Dustin Graves27a912a2016-03-07 17:52:14 -07003024VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003025vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003026 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003027 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003028 assert(my_data != NULL);
3029
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003030 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003031
Dustin Graves080069b2016-04-05 13:48:15 -06003032 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003033 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003034 }
3035}
3036
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003037VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3038 const VkAllocationCallbacks *pAllocator,
3039 VkRenderPass *pRenderPass) {
3040 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003041 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003042 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003043 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003044
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003045 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003046
Dustin Graves080069b2016-04-05 13:48:15 -06003047 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003048 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3049
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003050 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003051 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003052
3053 return result;
3054}
3055
Dustin Graves27a912a2016-03-07 17:52:14 -07003056VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003057vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003058 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003059 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003060 assert(my_data != NULL);
3061
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003062 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003063
Dustin Graves080069b2016-04-05 13:48:15 -06003064 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003065 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003066 }
3067}
3068
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003069VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3070vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06003071 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003072 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003073 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003074
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003075 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003076
Dustin Graves080069b2016-04-05 13:48:15 -06003077 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003078 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003079 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003080}
3081
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003082VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3083 const VkAllocationCallbacks *pAllocator,
3084 VkCommandPool *pCommandPool) {
3085 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003086 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003087 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003088 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003089
Dustin Gravesde628532016-04-21 16:30:17 -06003090 skipCall |=
3091 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003092
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003093 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003094
Dustin Graves080069b2016-04-05 13:48:15 -06003095 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003096 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3097
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003098 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003099 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003100
3101 return result;
3102}
3103
Dustin Graves27a912a2016-03-07 17:52:14 -07003104VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003105vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003106 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003107 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003108 assert(my_data != NULL);
3109
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003110 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003111
Dustin Graves080069b2016-04-05 13:48:15 -06003112 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003113 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003114 }
3115}
3116
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003117VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3118vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003119 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3120 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003121 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3122 assert(my_data != NULL);
3123
Dustin Graves20fd66f2016-04-18 18:33:21 -06003124 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003125
Dustin Graves20fd66f2016-04-18 18:33:21 -06003126 if (!skipCall) {
3127 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3128
3129 validate_result(my_data->report_data, "vkResetCommandPool", result);
3130 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003131
3132 return result;
3133}
3134
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003135VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3136vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
3137 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003138 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003139 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003140 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003141
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003142 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003143
Dustin Graves080069b2016-04-05 13:48:15 -06003144 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003145 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3146
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003147 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003148 }
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 void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3154 uint32_t commandBufferCount,
3155 const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003156 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003157 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003158 assert(my_data != NULL);
3159
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003160 skipCall |= parameter_validation_vkFreeCommandBuffers(my_data->report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003161
Dustin Graves080069b2016-04-05 13:48:15 -06003162 if (!skipCall) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003163 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003164 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003165 }
3166}
3167
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003168VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3169vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3170 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003171 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003172 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003173 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003174
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003175 skipCall |= parameter_validation_vkBeginCommandBuffer(my_data->report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003176
Dustin Graves080069b2016-04-05 13:48:15 -06003177 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003178 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3179
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003180 validate_result(my_data->report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003181 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003182
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003183 return result;
3184}
3185
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003186VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003187 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3188 assert(my_data != NULL);
3189
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003190 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003191
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003192 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003193
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003194 return result;
3195}
3196
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003197VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3198vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003199 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003200 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3201 assert(my_data != NULL);
3202
Dustin Graves16d18972016-05-09 17:36:57 -06003203 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003204
Dustin Graves16d18972016-05-09 17:36:57 -06003205 if (!skip_call) {
3206 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3207
3208 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3209 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003210
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003211 return result;
3212}
3213
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003214VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3215vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003216 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003217 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3218 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003219
Dustin Graves29148ff2016-03-23 19:44:00 -06003220 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3221
Dustin Graves080069b2016-04-05 13:48:15 -06003222 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003223 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3224 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003225}
3226
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003227VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3228vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003229 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003230 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003231 assert(my_data != NULL);
3232
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003233 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003234
Dustin Graves080069b2016-04-05 13:48:15 -06003235 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003236 get_dispatch_table(pc_device_table_map, commandBuffer)
3237 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003238 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003239}
3240
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003241VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3242vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003243 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003244 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003245 assert(my_data != NULL);
3246
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003247 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003248
Dustin Graves080069b2016-04-05 13:48:15 -06003249 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003250 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3251 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003252}
3253
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003254VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003255 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003256}
3257
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003258VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3259vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
3260 get_dispatch_table(pc_device_table_map, commandBuffer)
3261 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003262}
3263
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003264VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003265 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003266 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003267 assert(my_data != NULL);
3268
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003269 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003270
Dustin Graves080069b2016-04-05 13:48:15 -06003271 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003272 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3273 }
Cody Northrop12365112015-08-17 11:10:49 -06003274}
3275
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003276VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3277vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003278 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003279}
3280
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003281VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3282vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003283 bool skipCall = false;
3284 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3285 assert(my_data != NULL);
3286
3287 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3288
3289 if (!skipCall) {
3290 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3291 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003292}
3293
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003294VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3295vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003296 bool skipCall = false;
3297 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3298 assert(my_data != NULL);
3299
3300 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3301
3302 if (!skipCall) {
3303 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3304 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003305}
3306
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003307VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3308vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003309 bool skipCall = false;
3310 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3311 assert(my_data != NULL);
3312
3313 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3314
3315 if (!skipCall) {
3316 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3317 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003318}
3319
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003320VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3321vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3322 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3323 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003324 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003325 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003326 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003327
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003328 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003329 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003330
Dustin Graves080069b2016-04-05 13:48:15 -06003331 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003332 get_dispatch_table(pc_device_table_map, commandBuffer)
3333 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3334 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003335 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003336}
3337
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003338VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3339vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003340 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003341 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3342 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003343
Dustin Graves29148ff2016-03-23 19:44:00 -06003344 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3345
Dustin Graves080069b2016-04-05 13:48:15 -06003346 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003347 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3348 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003349}
3350
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003351VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3352 uint32_t bindingCount, const VkBuffer *pBuffers,
3353 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003354 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003355 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003356 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003357
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003358 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003359
Dustin Graves080069b2016-04-05 13:48:15 -06003360 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003361 get_dispatch_table(pc_device_table_map, commandBuffer)
3362 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003363 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003364}
3365
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003366bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3367 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003368 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003369 // 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 -07003370 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003371 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3372 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003373 return false;
3374 }
3375
3376 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003377 // 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 -07003378 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003379 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3380 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003381 return false;
3382 }
3383
3384 return true;
3385}
3386
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003387VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3388 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003389 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06003390
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003391 get_dispatch_table(pc_device_table_map, commandBuffer)
3392 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003393}
3394
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003395VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3396 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3397 uint32_t firstInstance) {
3398 get_dispatch_table(pc_device_table_map, commandBuffer)
3399 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003400}
3401
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003402VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3403vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003404 bool skipCall = false;
3405 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3406 assert(my_data != NULL);
3407
3408 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
3409
3410 if (!skipCall) {
3411 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
3412 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003413}
3414
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003415VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3416vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003417 bool skipCall = false;
3418 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3419 assert(my_data != NULL);
3420
3421 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
3422
3423 if (!skipCall) {
3424 get_dispatch_table(pc_device_table_map, commandBuffer)
3425 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
3426 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003427}
3428
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003429VK_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 -07003430 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003431}
3432
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003433VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3434vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003435 bool skipCall = false;
3436 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3437 assert(my_data != NULL);
3438
3439 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
3440
3441 if (!skipCall) {
3442 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
3443 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003444}
3445
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003446VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
3447 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003448 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003449 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003450 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003451
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003452 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003453
Dustin Graves080069b2016-04-05 13:48:15 -06003454 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003455 get_dispatch_table(pc_device_table_map, commandBuffer)
3456 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003457 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003458}
3459
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003460bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
3461 if (pRegions != nullptr) {
3462 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3463 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003464 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3465 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003466 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3467 return false;
3468 }
3469 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3470 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003471 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3472 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003473 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3474 return false;
3475 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003476 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003477
3478 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003479}
3480
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003481VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3482vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3483 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003484 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003485 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003486 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003487
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003488 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003489 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003490
Dustin Graves080069b2016-04-05 13:48:15 -06003491 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003492 PreCmdCopyImage(commandBuffer, pRegions);
3493
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003494 get_dispatch_table(pc_device_table_map, commandBuffer)
3495 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003496 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003497}
3498
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003499bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
3500 if (pRegions != nullptr) {
3501 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3502 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003503 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3504 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003505 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3506 return false;
3507 }
3508 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3509 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003510 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3511 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003512 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3513 return false;
3514 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003515 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003516
3517 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003518}
3519
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003520VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3521vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3522 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06003523 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003524 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003525 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003526
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003527 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003528 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003529
Dustin Graves080069b2016-04-05 13:48:15 -06003530 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003531 PreCmdBlitImage(commandBuffer, pRegions);
3532
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003533 get_dispatch_table(pc_device_table_map, commandBuffer)
3534 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003535 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003536}
3537
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003538bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3539 if (pRegions != nullptr) {
3540 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3541 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003542 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3543 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003544 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3545 "enumerator");
3546 return false;
3547 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003548 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003549
3550 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003551}
3552
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003553VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
3554 VkImage dstImage, VkImageLayout dstImageLayout,
3555 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003556 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003557 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003558 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003559
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003560 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003561 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003562
Dustin Graves080069b2016-04-05 13:48:15 -06003563 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003564 PreCmdCopyBufferToImage(commandBuffer, pRegions);
3565
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003566 get_dispatch_table(pc_device_table_map, commandBuffer)
3567 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003568 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003569}
3570
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003571bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3572 if (pRegions != nullptr) {
3573 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3574 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003575 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3576 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003577 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3578 "enumerator");
3579 return false;
3580 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003581 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003582
3583 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003584}
3585
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003586VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
3587 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
3588 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003589 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003590 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003591 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003592
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003593 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003594 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003595
Dustin Graves080069b2016-04-05 13:48:15 -06003596 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003597 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
3598
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003599 get_dispatch_table(pc_device_table_map, commandBuffer)
3600 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003601 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003602}
3603
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003604VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
3605 VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) {
Dustin Graves080069b2016-04-05 13:48:15 -06003606 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003607 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003608 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003609
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003610 skipCall |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003611
Dustin Graves080069b2016-04-05 13:48:15 -06003612 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003613 get_dispatch_table(pc_device_table_map, commandBuffer)
3614 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003615 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003616}
3617
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003618VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3619vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003620 bool skipCall = false;
3621 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3622 assert(my_data != NULL);
3623
3624 skipCall |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
3625
3626 if (!skipCall) {
3627 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
3628 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003629}
3630
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003631VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
3632 VkImageLayout imageLayout, const VkClearColorValue *pColor,
3633 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003634 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003635 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003636 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003637
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003638 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003639
Dustin Graves080069b2016-04-05 13:48:15 -06003640 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003641 get_dispatch_table(pc_device_table_map, commandBuffer)
3642 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003643 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003644}
3645
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003646VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3647vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
3648 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
3649 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003650 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003651 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003652 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003653
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003654 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003655 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003656
Dustin Graves080069b2016-04-05 13:48:15 -06003657 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003658 get_dispatch_table(pc_device_table_map, commandBuffer)
3659 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003660 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003661}
3662
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003663VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
3664 const VkClearAttachment *pAttachments, uint32_t rectCount,
3665 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06003666 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003667 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003668 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003669
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003670 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003671
Dustin Graves080069b2016-04-05 13:48:15 -06003672 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003673 get_dispatch_table(pc_device_table_map, commandBuffer)
3674 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003675 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003676}
3677
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003678bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
3679 if (pRegions != nullptr) {
3680 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3681 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3682 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06003683 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3684 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003685 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3686 return false;
3687 }
3688 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3689 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
3690 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06003691 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3692 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003693 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3694 return false;
3695 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003696 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003697
3698 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003699}
3700
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003701VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3702vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3703 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003704 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003705 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003706 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003707
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003708 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003709 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003710
Dustin Graves080069b2016-04-05 13:48:15 -06003711 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003712 PreCmdResolveImage(commandBuffer, pRegions);
3713
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003714 get_dispatch_table(pc_device_table_map, commandBuffer)
3715 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003716 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003717}
3718
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003719VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3720vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003721 bool skipCall = false;
3722 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3723 assert(my_data != NULL);
3724
3725 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
3726
3727 if (!skipCall) {
3728 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
3729 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003730}
3731
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003732VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3733vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003734 bool skipCall = false;
3735 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3736 assert(my_data != NULL);
3737
3738 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
3739
3740 if (!skipCall) {
3741 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
3742 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003743}
3744
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003745VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3746vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
3747 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3748 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3749 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003750 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003751 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003752 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003753
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003754 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003755 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
3756 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003757
Dustin Graves080069b2016-04-05 13:48:15 -06003758 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003759 get_dispatch_table(pc_device_table_map, commandBuffer)
3760 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
3761 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003762 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003763}
3764
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003765VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3766vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
3767 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3768 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3769 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003770 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003771 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003772 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003773
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003774 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003775 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
3776 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003777
Dustin Graves080069b2016-04-05 13:48:15 -06003778 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003779 get_dispatch_table(pc_device_table_map, commandBuffer)
3780 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
3781 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003782 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003783}
3784
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003785VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3786vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003787 bool skipCall = false;
3788 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3789 assert(my_data != NULL);
3790
3791 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
3792
3793 if (!skipCall) {
3794 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
3795 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003796}
3797
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003798VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003799 bool skipCall = false;
3800 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3801 assert(my_data != NULL);
3802
3803 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
3804
3805 if (!skipCall) {
3806 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
3807 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003808}
3809
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003810VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3811vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003812 bool skipCall = false;
3813 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3814 assert(my_data != NULL);
3815
3816 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
3817
3818 if (!skipCall) {
3819 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
3820 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003821}
3822
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003823bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
3824 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003825
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08003826 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003827
3828 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003829}
3830
Dustin Graves20fd66f2016-04-18 18:33:21 -06003831VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
3832 VkQueryPool queryPool, uint32_t query) {
3833 bool skipCall = false;
3834 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3835 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003836
Dustin Graves20fd66f2016-04-18 18:33:21 -06003837 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
3838
3839 if (!skipCall) {
3840 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3841
3842 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
3843 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003844}
3845
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003846VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3847vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
3848 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003849 bool skipCall = false;
3850 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3851 assert(my_data != NULL);
3852
3853 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
3854 dstOffset, stride, flags);
3855
3856 if (!skipCall) {
3857 get_dispatch_table(pc_device_table_map, commandBuffer)
3858 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
3859 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003860}
3861
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003862VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
3863 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
3864 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06003865 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003866 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003867 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003868
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003869 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003870
Dustin Graves080069b2016-04-05 13:48:15 -06003871 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003872 get_dispatch_table(pc_device_table_map, commandBuffer)
3873 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003874 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003875}
3876
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003877VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3878vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003879 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003880 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003881 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003882
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003883 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003884
Dustin Graves080069b2016-04-05 13:48:15 -06003885 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003886 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003887 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003888}
3889
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003890VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06003891 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003892 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3893 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08003894
Dustin Graves29148ff2016-03-23 19:44:00 -06003895 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
3896
Dustin Graves080069b2016-04-05 13:48:15 -06003897 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003898 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
3899 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003900}
3901
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003902VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003903 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003904}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003905
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003906VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3907vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06003908 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003909 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003910 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003911
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003912 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08003913
Dustin Graves080069b2016-04-05 13:48:15 -06003914 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003915 get_dispatch_table(pc_device_table_map, commandBuffer)
3916 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003917 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003918}
3919
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003920VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003921 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3922
Dustin Graves080069b2016-04-05 13:48:15 -06003923 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003924 return NULL;
3925 }
3926
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07003927 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003928 return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003929 if (!strcmp(funcName, "vkDestroyDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003930 return (PFN_vkVoidFunction)vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003931 if (!strcmp(funcName, "vkGetDeviceQueue"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003932 return (PFN_vkVoidFunction)vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003933 if (!strcmp(funcName, "vkQueueSubmit"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003934 return (PFN_vkVoidFunction)vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003935 if (!strcmp(funcName, "vkQueueWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003936 return (PFN_vkVoidFunction)vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003937 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003938 return (PFN_vkVoidFunction)vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003939 if (!strcmp(funcName, "vkAllocateMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003940 return (PFN_vkVoidFunction)vkAllocateMemory;
Dustin Graves27a912a2016-03-07 17:52:14 -07003941 if (!strcmp(funcName, "vkFreeMemory"))
3942 return (PFN_vkVoidFunction)vkFreeMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003943 if (!strcmp(funcName, "vkMapMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003944 return (PFN_vkVoidFunction)vkMapMemory;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003945 if (!strcmp(funcName, "vkUnmapMemory"))
3946 return (PFN_vkVoidFunction)vkUnmapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003947 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003948 return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003949 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003950 return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
Dustin Graves20fd66f2016-04-18 18:33:21 -06003951 if (!strcmp(funcName, "vkGetDeviceMemoryCommitment"))
3952 return (PFN_vkVoidFunction)vkGetDeviceMemoryCommitment;
3953 if (!strcmp(funcName, "vkBindBufferMemory"))
3954 return (PFN_vkVoidFunction)vkBindBufferMemory;
3955 if (!strcmp(funcName, "vkBindImageMemory"))
3956 return (PFN_vkVoidFunction)vkBindImageMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003957 if (!strcmp(funcName, "vkCreateFence"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003958 return (PFN_vkVoidFunction)vkCreateFence;
Dustin Graves27a912a2016-03-07 17:52:14 -07003959 if (!strcmp(funcName, "vkDestroyFence"))
3960 return (PFN_vkVoidFunction)vkDestroyFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003961 if (!strcmp(funcName, "vkResetFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003962 return (PFN_vkVoidFunction)vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003963 if (!strcmp(funcName, "vkGetFenceStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003964 return (PFN_vkVoidFunction)vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003965 if (!strcmp(funcName, "vkWaitForFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003966 return (PFN_vkVoidFunction)vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003967 if (!strcmp(funcName, "vkCreateSemaphore"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003968 return (PFN_vkVoidFunction)vkCreateSemaphore;
Dustin Graves27a912a2016-03-07 17:52:14 -07003969 if (!strcmp(funcName, "vkDestroySemaphore"))
3970 return (PFN_vkVoidFunction)vkDestroySemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003971 if (!strcmp(funcName, "vkCreateEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003972 return (PFN_vkVoidFunction)vkCreateEvent;
Dustin Graves27a912a2016-03-07 17:52:14 -07003973 if (!strcmp(funcName, "vkDestroyEvent"))
3974 return (PFN_vkVoidFunction)vkDestroyEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003975 if (!strcmp(funcName, "vkGetEventStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003976 return (PFN_vkVoidFunction)vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003977 if (!strcmp(funcName, "vkSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003978 return (PFN_vkVoidFunction)vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003979 if (!strcmp(funcName, "vkResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003980 return (PFN_vkVoidFunction)vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003981 if (!strcmp(funcName, "vkCreateQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003982 return (PFN_vkVoidFunction)vkCreateQueryPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07003983 if (!strcmp(funcName, "vkDestroyQueryPool"))
3984 return (PFN_vkVoidFunction)vkDestroyQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003985 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003986 return (PFN_vkVoidFunction)vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003987 if (!strcmp(funcName, "vkCreateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003988 return (PFN_vkVoidFunction)vkCreateBuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07003989 if (!strcmp(funcName, "vkDestroyBuffer"))
3990 return (PFN_vkVoidFunction)vkDestroyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003991 if (!strcmp(funcName, "vkCreateBufferView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003992 return (PFN_vkVoidFunction)vkCreateBufferView;
Dustin Graves27a912a2016-03-07 17:52:14 -07003993 if (!strcmp(funcName, "vkDestroyBufferView"))
3994 return (PFN_vkVoidFunction)vkDestroyBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003995 if (!strcmp(funcName, "vkCreateImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003996 return (PFN_vkVoidFunction)vkCreateImage;
Dustin Graves27a912a2016-03-07 17:52:14 -07003997 if (!strcmp(funcName, "vkDestroyImage"))
3998 return (PFN_vkVoidFunction)vkDestroyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003999 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004000 return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004001 if (!strcmp(funcName, "vkCreateImageView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004002 return (PFN_vkVoidFunction)vkCreateImageView;
Dustin Graves27a912a2016-03-07 17:52:14 -07004003 if (!strcmp(funcName, "vkDestroyImageView"))
4004 return (PFN_vkVoidFunction)vkDestroyImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05004005 if (!strcmp(funcName, "vkCreateShaderModule"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004006 return (PFN_vkVoidFunction)vkCreateShaderModule;
Dustin Graves27a912a2016-03-07 17:52:14 -07004007 if (!strcmp(funcName, "vkDestroyShaderModule"))
4008 return (PFN_vkVoidFunction)vkDestroyShaderModule;
4009 if (!strcmp(funcName, "vkCreatePipelineCache"))
4010 return (PFN_vkVoidFunction)vkCreatePipelineCache;
4011 if (!strcmp(funcName, "vkDestroyPipelineCache"))
4012 return (PFN_vkVoidFunction)vkDestroyPipelineCache;
4013 if (!strcmp(funcName, "vkGetPipelineCacheData"))
4014 return (PFN_vkVoidFunction)vkGetPipelineCacheData;
4015 if (!strcmp(funcName, "vkMergePipelineCaches"))
4016 return (PFN_vkVoidFunction)vkMergePipelineCaches;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004017 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004018 return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004019 if (!strcmp(funcName, "vkCreateComputePipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004020 return (PFN_vkVoidFunction)vkCreateComputePipelines;
Dustin Graves27a912a2016-03-07 17:52:14 -07004021 if (!strcmp(funcName, "vkDestroyPipeline"))
4022 return (PFN_vkVoidFunction)vkDestroyPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004023 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004024 return (PFN_vkVoidFunction)vkCreatePipelineLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07004025 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
4026 return (PFN_vkVoidFunction)vkDestroyPipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004027 if (!strcmp(funcName, "vkCreateSampler"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004028 return (PFN_vkVoidFunction)vkCreateSampler;
Dustin Graves27a912a2016-03-07 17:52:14 -07004029 if (!strcmp(funcName, "vkDestroySampler"))
4030 return (PFN_vkVoidFunction)vkDestroySampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004031 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004032 return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07004033 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
4034 return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004035 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004036 return (PFN_vkVoidFunction)vkCreateDescriptorPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07004037 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
4038 return (PFN_vkVoidFunction)vkDestroyDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004039 if (!strcmp(funcName, "vkResetDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004040 return (PFN_vkVoidFunction)vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004041 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004042 return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004043 if (!strcmp(funcName, "vkCmdSetViewport"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004044 return (PFN_vkVoidFunction)vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004045 if (!strcmp(funcName, "vkCmdSetScissor"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004046 return (PFN_vkVoidFunction)vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004047 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004048 return (PFN_vkVoidFunction)vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004049 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004050 return (PFN_vkVoidFunction)vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004051 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004052 return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004053 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004054 return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004055 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004056 return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004057 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004058 return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004059 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004060 return (PFN_vkVoidFunction)vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004061 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004062 return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004063 if (!strcmp(funcName, "vkFreeCommandBuffers"))
4064 return (PFN_vkVoidFunction)vkFreeCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004065 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004066 return (PFN_vkVoidFunction)vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004067 if (!strcmp(funcName, "vkEndCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004068 return (PFN_vkVoidFunction)vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004069 if (!strcmp(funcName, "vkResetCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004070 return (PFN_vkVoidFunction)vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004071 if (!strcmp(funcName, "vkCmdBindPipeline"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004072 return (PFN_vkVoidFunction)vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004073 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004074 return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004075 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004076 return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004077 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004078 return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004079 if (!strcmp(funcName, "vkCmdDraw"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004080 return (PFN_vkVoidFunction)vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004081 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004082 return (PFN_vkVoidFunction)vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004083 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004084 return (PFN_vkVoidFunction)vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004085 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004086 return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004087 if (!strcmp(funcName, "vkCmdDispatch"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004088 return (PFN_vkVoidFunction)vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004089 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004090 return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004091 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004092 return (PFN_vkVoidFunction)vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004093 if (!strcmp(funcName, "vkCmdCopyImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004094 return (PFN_vkVoidFunction)vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004095 if (!strcmp(funcName, "vkCmdBlitImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004096 return (PFN_vkVoidFunction)vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004097 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004098 return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004099 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004100 return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004101 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004102 return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004103 if (!strcmp(funcName, "vkCmdFillBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004104 return (PFN_vkVoidFunction)vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004105 if (!strcmp(funcName, "vkCmdClearColorImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004106 return (PFN_vkVoidFunction)vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004107 if (!strcmp(funcName, "vkCmdResolveImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004108 return (PFN_vkVoidFunction)vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004109 if (!strcmp(funcName, "vkCmdSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004110 return (PFN_vkVoidFunction)vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004111 if (!strcmp(funcName, "vkCmdResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004112 return (PFN_vkVoidFunction)vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004113 if (!strcmp(funcName, "vkCmdWaitEvents"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004114 return (PFN_vkVoidFunction)vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004115 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004116 return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004117 if (!strcmp(funcName, "vkCmdBeginQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004118 return (PFN_vkVoidFunction)vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004119 if (!strcmp(funcName, "vkCmdEndQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004120 return (PFN_vkVoidFunction)vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004121 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004122 return (PFN_vkVoidFunction)vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004123 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004124 return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004125 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004126 return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004127 if (!strcmp(funcName, "vkCreateFramebuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004128 return (PFN_vkVoidFunction)vkCreateFramebuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07004129 if (!strcmp(funcName, "vkDestroyFramebuffer"))
4130 return (PFN_vkVoidFunction)vkDestroyFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004131 if (!strcmp(funcName, "vkCreateRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004132 return (PFN_vkVoidFunction)vkCreateRenderPass;
Dustin Graves27a912a2016-03-07 17:52:14 -07004133 if (!strcmp(funcName, "vkDestroyRenderPass"))
4134 return (PFN_vkVoidFunction)vkDestroyRenderPass;
4135 if (!strcmp(funcName, "vkGetRenderAreaGranularity"))
4136 return (PFN_vkVoidFunction)vkGetRenderAreaGranularity;
4137 if (!strcmp(funcName, "vkCreateCommandPool"))
4138 return (PFN_vkVoidFunction)vkCreateCommandPool;
4139 if (!strcmp(funcName, "vkDestroyCommandPool"))
4140 return (PFN_vkVoidFunction)vkDestroyCommandPool;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004141 if (!strcmp(funcName, "vkResetCommandPool"))
4142 return (PFN_vkVoidFunction)vkResetCommandPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004143 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004144 return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08004145 if (!strcmp(funcName, "vkCmdNextSubpass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004146 return (PFN_vkVoidFunction)vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06004147
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004148 if (device == NULL) {
4149 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004150 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004151
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004152 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004153 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004154 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004155}
4156
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004157VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004158 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004159 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004160 if (!strcmp(funcName, "vkCreateInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004161 return (PFN_vkVoidFunction)vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004162 if (!strcmp(funcName, "vkDestroyInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004163 return (PFN_vkVoidFunction)vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004164 if (!strcmp(funcName, "vkCreateDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004165 return (PFN_vkVoidFunction)vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004166 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004167 return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004168 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004169 return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004170 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004171 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06004172 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004173 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
Dustin Graves16d18972016-05-09 17:36:57 -06004174 if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties"))
4175 return (PFN_vkVoidFunction)vkGetPhysicalDeviceImageFormatProperties;
4176 if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties"))
4177 return (PFN_vkVoidFunction)vkGetPhysicalDeviceSparseImageFormatProperties;
4178 if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties"))
4179 return (PFN_vkVoidFunction)vkGetPhysicalDeviceQueueFamilyProperties;
4180 if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties"))
4181 return (PFN_vkVoidFunction)vkGetPhysicalDeviceMemoryProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004182 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004183 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004184 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004185 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004186 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004187 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004188 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004189 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004190
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004191 if (instance == NULL) {
4192 return NULL;
4193 }
4194
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004195 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004196
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004197 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004198 if (fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004199 return fptr;
4200
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004201 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004202 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004203 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004204}