blob: 035b9290734e2c4bbfd16e9a186fb4fe98b70ba4 [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 Gravesc900f572016-05-16 11:07:59 -06002240 bool skip_call = false;
2241 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2242 assert(device_data != nullptr);
2243 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002244
Dustin Gravesc900f572016-05-16 11:07:59 -06002245 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002246
Dustin Gravesc900f572016-05-16 11:07:59 -06002247 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2248 if (pCreateInfo != nullptr) {
2249 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2250 // VkQueryPipelineStatisticFlagBits values
2251 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2252 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2253 skip_call |=
2254 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2255 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2256 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2257 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2258 }
2259 }
2260
2261 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002262 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2263
Dustin Gravesc900f572016-05-16 11:07:59 -06002264 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002265 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002266
2267 return result;
2268}
2269
Dustin Graves27a912a2016-03-07 17:52:14 -07002270VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002271vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
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 Graves27a912a2016-03-07 17:52:14 -07002274 assert(my_data != NULL);
2275
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002276 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002277
Dustin Graves080069b2016-04-05 13:48:15 -06002278 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002279 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002280 }
2281}
2282
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002283VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2284 uint32_t queryCount, size_t dataSize, void *pData,
2285 VkDeviceSize stride, VkQueryResultFlags flags) {
2286 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002287 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002288 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002289 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002290
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002291 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002292 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002293
Dustin Graves080069b2016-04-05 13:48:15 -06002294 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002295 result = get_dispatch_table(pc_device_table_map, device)
2296 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002297
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002298 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002299 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002300
2301 return result;
2302}
2303
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002304VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2305vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
2306 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002307 bool skip_call = false;
2308 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2309 assert(device_data != nullptr);
2310 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002311
Dustin Gravesc900f572016-05-16 11:07:59 -06002312 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002313
Dustin Gravesc900f572016-05-16 11:07:59 -06002314 if (pCreateInfo != nullptr) {
2315 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2316 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2317 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2318 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2319 skip_call |=
2320 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2321 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2322 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2323 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002324
Dustin Gravesc900f572016-05-16 11:07:59 -06002325 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2326 // queueFamilyIndexCount uint32_t values
2327 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2328 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2329 __LINE__, REQUIRED_PARAMETER, LayerName,
2330 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2331 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2332 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2333 }
2334
2335 // Ensure that the queue family indices were specified at device creation
2336 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2337 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2338 }
2339 }
2340
2341 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002342 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2343
Dustin Gravesc900f572016-05-16 11:07:59 -06002344 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002345 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002346
2347 return result;
2348}
2349
Dustin Graves27a912a2016-03-07 17:52:14 -07002350VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002351vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002352 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002353 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002354 assert(my_data != NULL);
2355
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002356 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002357
Dustin Graves080069b2016-04-05 13:48:15 -06002358 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002359 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002360 }
2361}
2362
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002363VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2364 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
2365 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002366 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002367 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002368 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002369
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002370 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002371
Dustin Graves080069b2016-04-05 13:48:15 -06002372 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002373 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2374
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002375 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002376 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002377
2378 return result;
2379}
2380
Dustin Graves27a912a2016-03-07 17:52:14 -07002381VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002382vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002383 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002384 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002385 assert(my_data != NULL);
2386
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002387 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002388
Dustin Graves080069b2016-04-05 13:48:15 -06002389 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002390 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002391 }
2392}
2393
Dustin Gravesf8032f22016-05-11 18:31:44 -06002394VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2395 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
2396 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2397 bool skip_call = false;
2398 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002399 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002400 debug_report_data *report_data = device_data->report_data;
2401
2402 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2403
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002404 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002405 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002406 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002407 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2408 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2409 skip_call |=
2410 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2411 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2412 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2413 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002414
Dustin Gravesc900f572016-05-16 11:07:59 -06002415 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2416 // queueFamilyIndexCount uint32_t values
2417 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2418 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2419 __LINE__, REQUIRED_PARAMETER, LayerName,
2420 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2421 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2422 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2423 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002424
2425 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2426 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2427 }
2428
2429 // width, height, and depth members of extent must be greater than 0
2430 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width,
2431 0u);
2432 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height,
2433 0u);
2434 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth,
2435 0u);
2436
2437 // mipLevels must be greater than 0
2438 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels,
2439 0u);
2440
2441 // arrayLayers must be greater than 0
2442 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers,
2443 0u);
2444
2445 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2446 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2447 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2448 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
2449 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
2450 }
2451
2452 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2453 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2454 // extent.height must be equal
2455 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2456 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
2457 skip_call |=
2458 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2459 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2460 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2461 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
2462 }
2463
2464 if (pCreateInfo->extent.depth != 1) {
2465 skip_call |=
2466 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2467 LayerName,
2468 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2469 }
2470 }
2471
2472 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2473 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2474 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
2475 skip_call |= log_msg(
2476 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2477 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2478 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
2479 }
2480
2481 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2482 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2483 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2484 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
2485 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2486 LayerName,
2487 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2488 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002489 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002490 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002491
Dustin Gravesf8032f22016-05-11 18:31:44 -06002492 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002493 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2494
Dustin Gravesf8032f22016-05-11 18:31:44 -06002495 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002496 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002497
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002498 return result;
2499}
2500
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002501VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002502 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002503 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002504 assert(my_data != NULL);
2505
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002506 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002507
Dustin Graves080069b2016-04-05 13:48:15 -06002508 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002509 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002510 }
2511}
2512
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002513bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2514 if (pSubresource != nullptr) {
2515 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2516 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002517 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2518 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002519 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2520 return false;
2521 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002522 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002523
2524 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002525}
2526
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002527VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2528vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002529 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002530 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002531 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002532
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002533 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002534
Dustin Graves080069b2016-04-05 13:48:15 -06002535 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002536 PreGetImageSubresourceLayout(device, pSubresource);
2537
2538 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002539 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002540}
2541
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002542VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2543 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
2544 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002545 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002546 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002547 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002548 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002549
Dustin Graves0b70a632016-04-27 17:44:56 -06002550 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002551
Dustin Graves0b70a632016-04-27 17:44:56 -06002552 if (pCreateInfo != nullptr) {
2553 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
2554 if (pCreateInfo->subresourceRange.layerCount != 1) {
2555 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2556 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2557 "pCreateInfo->subresourceRange.layerCount must be 1",
2558 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2559 }
2560 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
2561 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY)) {
2562 if (pCreateInfo->subresourceRange.layerCount < 1) {
2563 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2564 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2565 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2566 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2567 }
2568 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
2569 if (pCreateInfo->subresourceRange.layerCount != 6) {
2570 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2571 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2572 "pCreateInfo->subresourceRange.layerCount must be 6");
2573 }
2574 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
2575 if ((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) {
2576 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2577 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2578 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2579 }
2580 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2581 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2582 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2583 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2584 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2585 }
2586
2587 if (pCreateInfo->subresourceRange.layerCount != 1) {
2588 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2589 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2590 "pCreateInfo->subresourceRange.layerCount must be 1");
2591 }
2592 }
2593 }
2594
2595 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002596 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2597
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002598 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002599 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002600
2601 return result;
2602}
2603
Dustin Graves27a912a2016-03-07 17:52:14 -07002604VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002605vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002606 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002607 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002608 assert(my_data != NULL);
2609
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002610 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002611
Dustin Graves080069b2016-04-05 13:48:15 -06002612 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002613 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002614 }
2615}
2616
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002617VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2618 const VkAllocationCallbacks *pAllocator,
2619 VkShaderModule *pShaderModule) {
2620 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002621 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002622 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002623 assert(my_data != NULL);
2624
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002625 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002626
Dustin Graves080069b2016-04-05 13:48:15 -06002627 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002628 result =
2629 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002630
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002631 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002632 }
2633
Michael Lentine03d8e572015-09-15 14:59:14 -05002634 return result;
2635}
2636
Dustin Graves27a912a2016-03-07 17:52:14 -07002637VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002638vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002639 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002640 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002641 assert(my_data != NULL);
2642
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002643 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002644
Dustin Graves080069b2016-04-05 13:48:15 -06002645 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002646 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002647 }
2648}
2649
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002650VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2651 const VkAllocationCallbacks *pAllocator,
2652 VkPipelineCache *pPipelineCache) {
2653 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002654 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002655 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002656 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002657
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002658 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002659
Dustin Graves080069b2016-04-05 13:48:15 -06002660 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002661 result =
2662 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002663
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002664 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002665 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002666
2667 return result;
2668}
2669
Dustin Graves27a912a2016-03-07 17:52:14 -07002670VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002671vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002672 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002673 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002674 assert(my_data != NULL);
2675
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002676 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002677
Dustin Graves080069b2016-04-05 13:48:15 -06002678 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002679 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002680 }
2681}
2682
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002683VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2684vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
2685 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002686 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002687 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002688 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002689
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002690 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002691
Dustin Graves080069b2016-04-05 13:48:15 -06002692 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002693 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2694
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002695 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002696 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002697
2698 return result;
2699}
2700
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002701VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2702vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
2703 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002704 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002705 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002706 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002707
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002708 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002709
Dustin Graves080069b2016-04-05 13:48:15 -06002710 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002711 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2712
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002713 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002714 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002715
2716 return result;
2717}
2718
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002719bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002720 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2721
2722 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002723 if (pCreateInfos != nullptr) {
2724 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2725 if (pCreateInfos->basePipelineIndex != -1) {
2726 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002727 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2728 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002729 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2730 "pCreateInfos->flags "
2731 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2732 return false;
2733 }
2734 }
2735
2736 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2737 if (pCreateInfos->basePipelineIndex != -1) {
2738 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002739 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2740 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002741 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2742 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2743 "VK_NULL_HANDLE");
2744 return false;
2745 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002746 }
2747 }
2748
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002749 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002750 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002751 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2752 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002753 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2754 "unrecognized enumerator");
2755 return false;
2756 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002757 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002758
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002759 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002760 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002761 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002762 pCreateInfos[i].pStages[j].pName);
2763 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002764 }
2765
2766 return true;
2767}
2768
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002769VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2770vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2771 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2772 VkPipeline *pPipelines) {
2773 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002774 bool skip_call = false;
2775 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2776 assert(device_data != nullptr);
2777 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002778
Dustin Gravesc900f572016-05-16 11:07:59 -06002779 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2780 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002781
Dustin Gravesc900f572016-05-16 11:07:59 -06002782 if (pCreateInfos != nullptr) {
2783 for (uint32_t i = 0; i < createInfoCount; ++i) {
2784 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2785 if (pCreateInfos[i].pTessellationState == nullptr) {
2786 if (pCreateInfos[i].pStages != nullptr) {
2787 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2788 // pTessellationState must not be NULL
2789 bool has_control = false;
2790 bool has_eval = false;
2791
2792 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2793 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2794 has_control = true;
2795 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2796 has_eval = true;
2797 }
2798 }
2799
2800 if (has_control && has_eval) {
2801 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2802 __LINE__, REQUIRED_PARAMETER, LayerName,
2803 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2804 "control shader stage and a tessellation evaluation shader stage, "
2805 "pCreateInfos[%d].pTessellationState must not be NULL",
2806 i, i);
2807 }
2808 }
2809 } else if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2810 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2811 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2812 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2813 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2814 i);
2815 }
2816
2817 if (pCreateInfos[i].pViewportState == nullptr) {
2818 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2819 // valid VkPipelineViewportStateCreateInfo structure
2820 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2821 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2822 skip_call |= log_msg(
2823 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2824 REQUIRED_PARAMETER, LayerName,
2825 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2826 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2827 i, i);
2828 }
2829 } else {
2830 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2831 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2832 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2833 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2834 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2835 i);
2836 }
2837
2838 if (pCreateInfos[i].pDynamicState != nullptr) {
2839 bool has_dynamic_viewport = false;
2840 bool has_dynamic_scissor = false;
2841
2842 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2843 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2844 has_dynamic_viewport = true;
2845 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2846 has_dynamic_scissor = true;
2847 }
2848 }
2849
2850 // viewportCount must be greater than 0
2851 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2852 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2853 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2854 __LINE__, REQUIRED_PARAMETER, LayerName,
2855 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2856 "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2857 "must be greater than 0",
2858 i, i);
2859 }
2860
2861 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2862 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2863 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2864 skip_call |=
2865 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2866 __LINE__, REQUIRED_PARAMETER, LayerName,
2867 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2868 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2869 i, i);
2870 }
2871
2872 // scissorCount must be greater than 0
2873 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2874 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2875 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2876 __LINE__, REQUIRED_PARAMETER, LayerName,
2877 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2878 "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2879 "must be greater than 0",
2880 i, i);
2881 }
2882
2883 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2884 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2885 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2886 skip_call |=
2887 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2888 __LINE__, REQUIRED_PARAMETER, LayerName,
2889 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2890 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2891 i, i);
2892 }
2893 }
2894 }
2895
2896 if (pCreateInfos[i].pMultisampleState == nullptr) {
2897 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2898 // a valid VkPipelineMultisampleStateCreateInfo structure
2899 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2900 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2901 skip_call |=
2902 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2903 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2904 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2905 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2906 i, i);
2907 }
2908 } else if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
2909 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2910 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2911 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
2912 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
2913 i);
2914 }
2915
2916 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
2917 if ((pCreateInfos[i].pDepthStencilState != nullptr) &&
2918 (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO)) {
2919 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2920 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2921 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
2922 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
2923 i);
2924 }
2925
2926 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
2927 if (pCreateInfos[i].pColorBlendState != nullptr) {
2928 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
2929 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2930 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2931 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
2932 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
2933 i);
2934 }
2935
2936 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
2937 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
2938 skip_call |= validate_ranged_enum(
2939 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp",
2940 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
2941 }
2942 }
2943 }
2944 }
2945
2946 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002947 PreCreateGraphicsPipelines(device, pCreateInfos);
2948
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002949 result = get_dispatch_table(pc_device_table_map, device)
2950 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002951
Dustin Gravesc900f572016-05-16 11:07:59 -06002952 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002953 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002954
2955 return result;
2956}
2957
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002958bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002959 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2960
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002961 if (pCreateInfos != nullptr) {
2962 // TODO: Handle count!
2963 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002964 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002965 }
2966
2967 return true;
2968}
2969
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002970VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2971vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2972 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2973 VkPipeline *pPipelines) {
2974 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002975 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002976 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002977 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002978
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002979 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002980 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002981
Dustin Graves080069b2016-04-05 13:48:15 -06002982 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002983 PreCreateComputePipelines(device, pCreateInfos);
2984
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002985 result = get_dispatch_table(pc_device_table_map, device)
2986 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002987
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002988 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002989 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002990
2991 return result;
2992}
2993
Dustin Graves27a912a2016-03-07 17:52:14 -07002994VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002995vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002996 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002997 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002998 assert(my_data != NULL);
2999
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003000 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003001
Dustin Graves080069b2016-04-05 13:48:15 -06003002 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003003 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003004 }
3005}
3006
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003007VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3008vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3009 VkPipelineLayout *pPipelineLayout) {
3010 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003011 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003012 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003013 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003014
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003015 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003016
Dustin Graves080069b2016-04-05 13:48:15 -06003017 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003018 result =
3019 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003020
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003021 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003022 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003023
3024 return result;
3025}
3026
Dustin Graves27a912a2016-03-07 17:52:14 -07003027VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003028vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003029 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003030 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003031 assert(my_data != NULL);
3032
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003033 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003034
Dustin Graves080069b2016-04-05 13:48:15 -06003035 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003036 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003037 }
3038}
3039
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003040VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3041 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
3042 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003043 bool skip_call = false;
3044 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3045 assert(device_data != NULL);
3046 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003047
Dustin Gravesc900f572016-05-16 11:07:59 -06003048 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003049
Dustin Gravesc900f572016-05-16 11:07:59 -06003050 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3051 if (pCreateInfo != nullptr) {
3052 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3053 if (pCreateInfo->compareEnable == VK_TRUE) {
3054 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3055 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3056 }
3057
3058 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3059 // valid VkBorderColor value
3060 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3061 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3062 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3063 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3064 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3065 }
3066 }
3067
3068 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003069 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3070
Dustin Gravesc900f572016-05-16 11:07:59 -06003071 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003072 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003073
3074 return result;
3075}
3076
Dustin Graves27a912a2016-03-07 17:52:14 -07003077VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003078vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003079 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003080 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003081 assert(my_data != NULL);
3082
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003083 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003084
Dustin Graves080069b2016-04-05 13:48:15 -06003085 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003086 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003087 }
3088}
3089
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003090VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3091vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3092 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
3093 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003094 bool skip_call = false;
3095 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3096 assert(device_data != nullptr);
3097 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003098
Dustin Gravesc900f572016-05-16 11:07:59 -06003099 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003100
Dustin Gravesc900f572016-05-16 11:07:59 -06003101 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3102 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3103 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3104 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3105 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3106 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3107 // valid VkSampler handles
3108 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3109 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3110 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3111 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3112 ++descriptor_index) {
3113 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3114 skip_call |=
3115 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3116 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3117 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3118 " specified as VK_NULL_HANDLE",
3119 i, descriptor_index);
3120 }
3121 }
3122 }
3123
3124 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3125 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3126 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3127 skip_call |=
3128 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3129 UNRECOGNIZED_VALUE, LayerName,
3130 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3131 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3132 i, i);
3133 }
3134 }
3135 }
3136 }
3137
3138 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003139 result =
3140 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003141
Dustin Gravesc900f572016-05-16 11:07:59 -06003142 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003143 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003144
3145 return result;
3146}
3147
Dustin Graves27a912a2016-03-07 17:52:14 -07003148VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003149vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003150 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003151 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003152 assert(my_data != NULL);
3153
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003154 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003155
Dustin Graves080069b2016-04-05 13:48:15 -06003156 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003157 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003158 }
3159}
3160
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003161VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3162vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3163 VkDescriptorPool *pDescriptorPool) {
3164 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003165 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003166 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003167 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003168
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003169 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003170
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003171 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3172
Dustin Graves080069b2016-04-05 13:48:15 -06003173 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003174 result =
3175 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003176
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003177 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003178 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003179
3180 return result;
3181}
3182
Dustin Graves27a912a2016-03-07 17:52:14 -07003183VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003184vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003185 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003186 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003187 assert(my_data != NULL);
3188
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003189 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003190
Dustin Graves080069b2016-04-05 13:48:15 -06003191 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003192 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003193 }
3194}
3195
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003196VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3197vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003198 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3199 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003200 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3201 assert(my_data != NULL);
3202
Dustin Graves20fd66f2016-04-18 18:33:21 -06003203 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003204
Dustin Graves20fd66f2016-04-18 18:33:21 -06003205 if (!skipCall) {
3206 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3207
3208 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3209 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003210
3211 return result;
3212}
3213
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003214VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3215vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
3216 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003217 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003218 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003219 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003220
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003221 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003222
Dustin Graves080069b2016-04-05 13:48:15 -06003223 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003224 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3225
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003226 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003227 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003228
3229 return result;
3230}
3231
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003232VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
3233 uint32_t descriptorSetCount,
3234 const VkDescriptorSet *pDescriptorSets) {
3235 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003236 bool skip_call = false;
3237 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3238 assert(device_data != nullptr);
3239 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003240
Dustin Gravesc900f572016-05-16 11:07:59 -06003241 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003242
Dustin Gravesc900f572016-05-16 11:07:59 -06003243 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3244 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3245 // validate_array()
3246 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3247 pDescriptorSets, true, true);
3248
3249 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003250 result = get_dispatch_table(pc_device_table_map, device)
3251 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003252
Dustin Gravesc900f572016-05-16 11:07:59 -06003253 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003254 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003255
3256 return result;
3257}
3258
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003259VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3260vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
3261 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003262 bool skip_call = false;
3263 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3264 assert(device_data != NULL);
3265 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003266
Dustin Gravesc900f572016-05-16 11:07:59 -06003267 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3268 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003269
Dustin Gravesc900f572016-05-16 11:07:59 -06003270 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3271 if (pDescriptorWrites != NULL) {
3272 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3273 // descriptorCount must be greater than 0
3274 if (pDescriptorWrites[i].descriptorCount == 0) {
3275 skip_call |=
3276 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3277 REQUIRED_PARAMETER, LayerName,
3278 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3279 }
3280
3281 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3282 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3283 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3284 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3285 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3286 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3287 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3288 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3289 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3290 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3291 __LINE__, REQUIRED_PARAMETER, LayerName,
3292 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3293 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3294 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3295 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3296 i, i);
3297 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3298 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3299 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3300 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3301 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3302 ++descriptor_index) {
3303 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3304 "pDescriptorWrites[i].pImageInfo[i].imageView",
3305 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3306 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
3307 "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout",
3308 VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3309 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3310 }
3311 }
3312 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3313 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3314 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3315 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3316 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3317 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3318 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3319 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3320 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3321 __LINE__, REQUIRED_PARAMETER, LayerName,
3322 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3323 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3324 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3325 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3326 i, i);
3327 }
3328 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3329 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3330 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3331 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3332 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3333 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3334 __LINE__, REQUIRED_PARAMETER, LayerName,
3335 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3336 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3337 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3338 i, i);
3339 } else {
3340 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3341 ++descriptor_index) {
3342 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3343 "pDescriptorWrites[i].pTexelBufferView[i]",
3344 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3345 }
3346 }
3347 }
3348 }
3349 }
3350
3351 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003352 get_dispatch_table(pc_device_table_map, device)
3353 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003354 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003355}
3356
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003357VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3358 const VkAllocationCallbacks *pAllocator,
3359 VkFramebuffer *pFramebuffer) {
3360 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003361 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003362 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003363 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003364
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003365 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003366
Dustin Graves080069b2016-04-05 13:48:15 -06003367 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003368 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3369
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003370 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003371 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003372
3373 return result;
3374}
3375
Dustin Graves27a912a2016-03-07 17:52:14 -07003376VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003377vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003378 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003379 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003380 assert(my_data != NULL);
3381
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003382 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003383
Dustin Graves080069b2016-04-05 13:48:15 -06003384 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003385 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003386 }
3387}
3388
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003389VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3390 const VkAllocationCallbacks *pAllocator,
3391 VkRenderPass *pRenderPass) {
3392 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003393 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003394 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003395 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003396
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003397 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003398
Dustin Graves080069b2016-04-05 13:48:15 -06003399 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003400 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3401
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003402 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003403 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003404
3405 return result;
3406}
3407
Dustin Graves27a912a2016-03-07 17:52:14 -07003408VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003409vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003410 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003411 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003412 assert(my_data != NULL);
3413
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003414 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003415
Dustin Graves080069b2016-04-05 13:48:15 -06003416 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003417 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003418 }
3419}
3420
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003421VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3422vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06003423 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003424 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003425 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003426
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003427 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003428
Dustin Graves080069b2016-04-05 13:48:15 -06003429 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003430 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003431 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003432}
3433
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003434VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3435 const VkAllocationCallbacks *pAllocator,
3436 VkCommandPool *pCommandPool) {
3437 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003438 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003439 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003440 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003441
Dustin Gravesde628532016-04-21 16:30:17 -06003442 skipCall |=
3443 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003444
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003445 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003446
Dustin Graves080069b2016-04-05 13:48:15 -06003447 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003448 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3449
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003450 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003451 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003452
3453 return result;
3454}
3455
Dustin Graves27a912a2016-03-07 17:52:14 -07003456VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003457vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003458 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003459 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003460 assert(my_data != NULL);
3461
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003462 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003463
Dustin Graves080069b2016-04-05 13:48:15 -06003464 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003465 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003466 }
3467}
3468
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003469VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3470vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003471 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3472 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003473 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3474 assert(my_data != NULL);
3475
Dustin Graves20fd66f2016-04-18 18:33:21 -06003476 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003477
Dustin Graves20fd66f2016-04-18 18:33:21 -06003478 if (!skipCall) {
3479 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3480
3481 validate_result(my_data->report_data, "vkResetCommandPool", result);
3482 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003483
3484 return result;
3485}
3486
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003487VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3488vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
3489 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003490 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003491 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003492 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003493
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003494 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003495
Dustin Graves080069b2016-04-05 13:48:15 -06003496 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003497 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3498
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003499 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003500 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003501
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003502 return result;
3503}
3504
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003505VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3506 uint32_t commandBufferCount,
3507 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003508 bool skip_call = false;
3509 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3510 assert(device_data != nullptr);
3511 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003512
Dustin Gravesc900f572016-05-16 11:07:59 -06003513 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003514
Dustin Gravesc900f572016-05-16 11:07:59 -06003515 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3516 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3517 // validate_array()
3518 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3519 pCommandBuffers, true, true);
3520
3521 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003522 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003523 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003524 }
3525}
3526
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003527VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3528vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3529 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003530 bool skip_call = false;
3531 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3532 assert(device_data != nullptr);
3533 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003534
Dustin Gravesc900f572016-05-16 11:07:59 -06003535 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003536
Dustin Gravesc900f572016-05-16 11:07:59 -06003537 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3538 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3539 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3540 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3541 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3542
3543 if (pBeginInfo->pInheritanceInfo != NULL) {
3544 // TODO: This only needs to be validated when the inherited queries feature is enabled
3545 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3546 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3547
3548 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3549 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3550 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3551 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3552 }
3553
3554 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003555 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3556
Dustin Gravesc900f572016-05-16 11:07:59 -06003557 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003558 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003559
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003560 return result;
3561}
3562
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003563VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003564 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3565 assert(my_data != NULL);
3566
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003567 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003568
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003569 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003570
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003571 return result;
3572}
3573
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003574VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3575vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003576 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003577 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3578 assert(my_data != NULL);
3579
Dustin Graves16d18972016-05-09 17:36:57 -06003580 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003581
Dustin Graves16d18972016-05-09 17:36:57 -06003582 if (!skip_call) {
3583 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3584
3585 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3586 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003587
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003588 return result;
3589}
3590
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003591VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3592vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003593 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003594 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3595 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003596
Dustin Graves29148ff2016-03-23 19:44:00 -06003597 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3598
Dustin Graves080069b2016-04-05 13:48:15 -06003599 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003600 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3601 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003602}
3603
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003604VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3605vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
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);
3609
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003610 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003611
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 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003615 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003616}
3617
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003618VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3619vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003620 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003621 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003622 assert(my_data != NULL);
3623
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003624 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003625
Dustin Graves080069b2016-04-05 13:48:15 -06003626 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003627 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
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 vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003632 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003633}
3634
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003635VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3636vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
3637 get_dispatch_table(pc_device_table_map, commandBuffer)
3638 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003639}
3640
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003641VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003642 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003643 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003644 assert(my_data != NULL);
3645
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003646 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003647
Dustin Graves080069b2016-04-05 13:48:15 -06003648 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003649 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3650 }
Cody Northrop12365112015-08-17 11:10:49 -06003651}
3652
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003653VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3654vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003655 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003656}
3657
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003658VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3659vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003660 bool skipCall = false;
3661 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3662 assert(my_data != NULL);
3663
3664 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3665
3666 if (!skipCall) {
3667 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3668 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003669}
3670
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003671VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3672vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003673 bool skipCall = false;
3674 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3675 assert(my_data != NULL);
3676
3677 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3678
3679 if (!skipCall) {
3680 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3681 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003682}
3683
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003684VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3685vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003686 bool skipCall = false;
3687 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3688 assert(my_data != NULL);
3689
3690 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3691
3692 if (!skipCall) {
3693 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3694 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003695}
3696
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003697VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3698vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3699 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3700 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003701 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003702 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003703 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003704
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003705 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003706 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003707
Dustin Graves080069b2016-04-05 13:48:15 -06003708 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003709 get_dispatch_table(pc_device_table_map, commandBuffer)
3710 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3711 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003712 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003713}
3714
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003715VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3716vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003717 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003718 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3719 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003720
Dustin Graves29148ff2016-03-23 19:44:00 -06003721 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3722
Dustin Graves080069b2016-04-05 13:48:15 -06003723 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003724 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3725 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003726}
3727
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003728VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3729 uint32_t bindingCount, const VkBuffer *pBuffers,
3730 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003731 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003732 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003733 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003734
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003735 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003736
Dustin Graves080069b2016-04-05 13:48:15 -06003737 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003738 get_dispatch_table(pc_device_table_map, commandBuffer)
3739 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003740 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003741}
3742
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003743bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3744 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003745 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003746 // 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 -07003747 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003748 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3749 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003750 return false;
3751 }
3752
3753 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003754 // 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 -07003755 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003756 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3757 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003758 return false;
3759 }
3760
3761 return true;
3762}
3763
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003764VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3765 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003766 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06003767
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003768 get_dispatch_table(pc_device_table_map, commandBuffer)
3769 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003770}
3771
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003772VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3773 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3774 uint32_t firstInstance) {
3775 get_dispatch_table(pc_device_table_map, commandBuffer)
3776 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003777}
3778
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003779VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3780vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003781 bool skipCall = false;
3782 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3783 assert(my_data != NULL);
3784
3785 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
3786
3787 if (!skipCall) {
3788 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
3789 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003790}
3791
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003792VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3793vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003794 bool skipCall = false;
3795 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3796 assert(my_data != NULL);
3797
3798 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
3799
3800 if (!skipCall) {
3801 get_dispatch_table(pc_device_table_map, commandBuffer)
3802 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
3803 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003804}
3805
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003806VK_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 -07003807 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003808}
3809
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003810VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3811vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
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_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
3817
3818 if (!skipCall) {
3819 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
3820 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003821}
3822
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003823VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
3824 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003825 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003826 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003827 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003828
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003829 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003830
Dustin Graves080069b2016-04-05 13:48:15 -06003831 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003832 get_dispatch_table(pc_device_table_map, commandBuffer)
3833 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003834 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003835}
3836
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003837bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
3838 if (pRegions != nullptr) {
3839 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3840 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003841 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3842 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003843 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3844 return false;
3845 }
3846 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3847 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003848 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3849 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003850 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3851 return false;
3852 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003853 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003854
3855 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003856}
3857
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003858VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3859vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3860 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003861 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003862 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003863 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003864
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003865 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003866 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003867
Dustin Graves080069b2016-04-05 13:48:15 -06003868 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003869 PreCmdCopyImage(commandBuffer, pRegions);
3870
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003871 get_dispatch_table(pc_device_table_map, commandBuffer)
3872 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003873 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003874}
3875
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003876bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
3877 if (pRegions != nullptr) {
3878 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3879 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003880 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3881 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003882 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3883 return false;
3884 }
3885 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3886 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003887 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3888 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003889 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3890 return false;
3891 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003892 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003893
3894 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003895}
3896
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003897VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3898vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3899 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06003900 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003901 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003902 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003903
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003904 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003905 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003906
Dustin Graves080069b2016-04-05 13:48:15 -06003907 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003908 PreCmdBlitImage(commandBuffer, pRegions);
3909
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003910 get_dispatch_table(pc_device_table_map, commandBuffer)
3911 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003912 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003913}
3914
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003915bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3916 if (pRegions != nullptr) {
3917 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3918 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003919 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3920 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003921 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3922 "enumerator");
3923 return false;
3924 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003925 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003926
3927 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003928}
3929
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003930VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
3931 VkImage dstImage, VkImageLayout dstImageLayout,
3932 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003933 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003934 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003935 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003936
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003937 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003938 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003939
Dustin Graves080069b2016-04-05 13:48:15 -06003940 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003941 PreCmdCopyBufferToImage(commandBuffer, pRegions);
3942
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003943 get_dispatch_table(pc_device_table_map, commandBuffer)
3944 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003945 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003946}
3947
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003948bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3949 if (pRegions != nullptr) {
3950 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3951 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003952 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3953 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003954 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3955 "enumerator");
3956 return false;
3957 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003958 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003959
3960 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003961}
3962
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003963VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
3964 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
3965 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003966 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003967 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003968 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003969
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003970 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003971 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003972
Dustin Graves080069b2016-04-05 13:48:15 -06003973 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003974 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
3975
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003976 get_dispatch_table(pc_device_table_map, commandBuffer)
3977 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003978 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003979}
3980
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003981VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
3982 VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) {
Dustin Graves080069b2016-04-05 13:48:15 -06003983 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003984 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003985 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003986
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003987 skipCall |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003988
Dustin Graves080069b2016-04-05 13:48:15 -06003989 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003990 get_dispatch_table(pc_device_table_map, commandBuffer)
3991 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003992 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003993}
3994
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003995VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3996vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003997 bool skipCall = false;
3998 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3999 assert(my_data != NULL);
4000
4001 skipCall |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
4002
4003 if (!skipCall) {
4004 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4005 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004006}
4007
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004008VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
4009 VkImageLayout imageLayout, const VkClearColorValue *pColor,
4010 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004011 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004012 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004013 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004014
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004015 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004016
Dustin Graves080069b2016-04-05 13:48:15 -06004017 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004018 get_dispatch_table(pc_device_table_map, commandBuffer)
4019 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004020 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004021}
4022
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004023VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4024vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4025 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4026 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06004027 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004028 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004029 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004030
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004031 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004032 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004033
Dustin Graves080069b2016-04-05 13:48:15 -06004034 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004035 get_dispatch_table(pc_device_table_map, commandBuffer)
4036 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004037 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004038}
4039
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004040VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4041 const VkClearAttachment *pAttachments, uint32_t rectCount,
4042 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06004043 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004044 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004045 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004046
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004047 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004048
Dustin Graves080069b2016-04-05 13:48:15 -06004049 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004050 get_dispatch_table(pc_device_table_map, commandBuffer)
4051 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004052 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004053}
4054
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004055bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4056 if (pRegions != nullptr) {
4057 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4058 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4059 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004060 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4061 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004062 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4063 return false;
4064 }
4065 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4066 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4067 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004068 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4069 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004070 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4071 return false;
4072 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004073 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004074
4075 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004076}
4077
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004078VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4079vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4080 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004081 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004082 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004083 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004084
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004085 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004086 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004087
Dustin Graves080069b2016-04-05 13:48:15 -06004088 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004089 PreCmdResolveImage(commandBuffer, pRegions);
4090
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004091 get_dispatch_table(pc_device_table_map, commandBuffer)
4092 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004093 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004094}
4095
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004096VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4097vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004098 bool skipCall = false;
4099 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4100 assert(my_data != NULL);
4101
4102 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
4103
4104 if (!skipCall) {
4105 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4106 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004107}
4108
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004109VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4110vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004111 bool skipCall = false;
4112 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4113 assert(my_data != NULL);
4114
4115 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
4116
4117 if (!skipCall) {
4118 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4119 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004120}
4121
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004122VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4123vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
4124 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4125 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4126 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004127 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004128 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004129 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004130
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004131 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004132 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4133 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004134
Dustin Graves080069b2016-04-05 13:48:15 -06004135 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004136 get_dispatch_table(pc_device_table_map, commandBuffer)
4137 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4138 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004139 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004140}
4141
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004142VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4143vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4144 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4145 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4146 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004147 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004148 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004149 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004150
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004151 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004152 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4153 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004154
Dustin Graves080069b2016-04-05 13:48:15 -06004155 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004156 get_dispatch_table(pc_device_table_map, commandBuffer)
4157 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4158 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004159 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004160}
4161
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004162VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4163vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004164 bool skipCall = false;
4165 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4166 assert(my_data != NULL);
4167
4168 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
4169
4170 if (!skipCall) {
4171 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4172 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004173}
4174
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004175VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004176 bool skipCall = false;
4177 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4178 assert(my_data != NULL);
4179
4180 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
4181
4182 if (!skipCall) {
4183 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4184 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004185}
4186
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004187VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4188vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004189 bool skipCall = false;
4190 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4191 assert(my_data != NULL);
4192
4193 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
4194
4195 if (!skipCall) {
4196 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4197 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004198}
4199
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004200bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4201 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004202
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004203 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004204
4205 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004206}
4207
Dustin Graves20fd66f2016-04-18 18:33:21 -06004208VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4209 VkQueryPool queryPool, uint32_t query) {
4210 bool skipCall = false;
4211 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4212 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004213
Dustin Graves20fd66f2016-04-18 18:33:21 -06004214 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
4215
4216 if (!skipCall) {
4217 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4218
4219 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4220 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004221}
4222
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004223VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4224vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
4225 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004226 bool skipCall = false;
4227 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4228 assert(my_data != NULL);
4229
4230 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4231 dstOffset, stride, flags);
4232
4233 if (!skipCall) {
4234 get_dispatch_table(pc_device_table_map, commandBuffer)
4235 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4236 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004237}
4238
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004239VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
4240 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
4241 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06004242 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004243 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004244 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004245
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004246 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004247
Dustin Graves080069b2016-04-05 13:48:15 -06004248 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004249 get_dispatch_table(pc_device_table_map, commandBuffer)
4250 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004251 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004252}
4253
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004254VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4255vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004256 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004257 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004258 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004259
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004260 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004261
Dustin Graves080069b2016-04-05 13:48:15 -06004262 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004263 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004264 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004265}
4266
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004267VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004268 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004269 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4270 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004271
Dustin Graves29148ff2016-03-23 19:44:00 -06004272 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
4273
Dustin Graves080069b2016-04-05 13:48:15 -06004274 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004275 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4276 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004277}
4278
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004279VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004280 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004281}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004282
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004283VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4284vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004285 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004286 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004287 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004288
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004289 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004290
Dustin Graves080069b2016-04-05 13:48:15 -06004291 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004292 get_dispatch_table(pc_device_table_map, commandBuffer)
4293 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004294 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004295}
4296
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004297VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004298 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4299
Dustin Graves080069b2016-04-05 13:48:15 -06004300 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004301 return NULL;
4302 }
4303
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004304 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004305 return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004306 if (!strcmp(funcName, "vkDestroyDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004307 return (PFN_vkVoidFunction)vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004308 if (!strcmp(funcName, "vkGetDeviceQueue"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004309 return (PFN_vkVoidFunction)vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004310 if (!strcmp(funcName, "vkQueueSubmit"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004311 return (PFN_vkVoidFunction)vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004312 if (!strcmp(funcName, "vkQueueWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004313 return (PFN_vkVoidFunction)vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004314 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004315 return (PFN_vkVoidFunction)vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004316 if (!strcmp(funcName, "vkAllocateMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004317 return (PFN_vkVoidFunction)vkAllocateMemory;
Dustin Graves27a912a2016-03-07 17:52:14 -07004318 if (!strcmp(funcName, "vkFreeMemory"))
4319 return (PFN_vkVoidFunction)vkFreeMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004320 if (!strcmp(funcName, "vkMapMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004321 return (PFN_vkVoidFunction)vkMapMemory;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004322 if (!strcmp(funcName, "vkUnmapMemory"))
4323 return (PFN_vkVoidFunction)vkUnmapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004324 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004325 return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004326 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004327 return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004328 if (!strcmp(funcName, "vkGetDeviceMemoryCommitment"))
4329 return (PFN_vkVoidFunction)vkGetDeviceMemoryCommitment;
4330 if (!strcmp(funcName, "vkBindBufferMemory"))
4331 return (PFN_vkVoidFunction)vkBindBufferMemory;
4332 if (!strcmp(funcName, "vkBindImageMemory"))
4333 return (PFN_vkVoidFunction)vkBindImageMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004334 if (!strcmp(funcName, "vkCreateFence"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004335 return (PFN_vkVoidFunction)vkCreateFence;
Dustin Graves27a912a2016-03-07 17:52:14 -07004336 if (!strcmp(funcName, "vkDestroyFence"))
4337 return (PFN_vkVoidFunction)vkDestroyFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004338 if (!strcmp(funcName, "vkResetFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004339 return (PFN_vkVoidFunction)vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004340 if (!strcmp(funcName, "vkGetFenceStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004341 return (PFN_vkVoidFunction)vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004342 if (!strcmp(funcName, "vkWaitForFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004343 return (PFN_vkVoidFunction)vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004344 if (!strcmp(funcName, "vkCreateSemaphore"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004345 return (PFN_vkVoidFunction)vkCreateSemaphore;
Dustin Graves27a912a2016-03-07 17:52:14 -07004346 if (!strcmp(funcName, "vkDestroySemaphore"))
4347 return (PFN_vkVoidFunction)vkDestroySemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004348 if (!strcmp(funcName, "vkCreateEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004349 return (PFN_vkVoidFunction)vkCreateEvent;
Dustin Graves27a912a2016-03-07 17:52:14 -07004350 if (!strcmp(funcName, "vkDestroyEvent"))
4351 return (PFN_vkVoidFunction)vkDestroyEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004352 if (!strcmp(funcName, "vkGetEventStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004353 return (PFN_vkVoidFunction)vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004354 if (!strcmp(funcName, "vkSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004355 return (PFN_vkVoidFunction)vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004356 if (!strcmp(funcName, "vkResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004357 return (PFN_vkVoidFunction)vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004358 if (!strcmp(funcName, "vkCreateQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004359 return (PFN_vkVoidFunction)vkCreateQueryPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07004360 if (!strcmp(funcName, "vkDestroyQueryPool"))
4361 return (PFN_vkVoidFunction)vkDestroyQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004362 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004363 return (PFN_vkVoidFunction)vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004364 if (!strcmp(funcName, "vkCreateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004365 return (PFN_vkVoidFunction)vkCreateBuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07004366 if (!strcmp(funcName, "vkDestroyBuffer"))
4367 return (PFN_vkVoidFunction)vkDestroyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004368 if (!strcmp(funcName, "vkCreateBufferView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004369 return (PFN_vkVoidFunction)vkCreateBufferView;
Dustin Graves27a912a2016-03-07 17:52:14 -07004370 if (!strcmp(funcName, "vkDestroyBufferView"))
4371 return (PFN_vkVoidFunction)vkDestroyBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004372 if (!strcmp(funcName, "vkCreateImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004373 return (PFN_vkVoidFunction)vkCreateImage;
Dustin Graves27a912a2016-03-07 17:52:14 -07004374 if (!strcmp(funcName, "vkDestroyImage"))
4375 return (PFN_vkVoidFunction)vkDestroyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004376 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004377 return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004378 if (!strcmp(funcName, "vkCreateImageView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004379 return (PFN_vkVoidFunction)vkCreateImageView;
Dustin Graves27a912a2016-03-07 17:52:14 -07004380 if (!strcmp(funcName, "vkDestroyImageView"))
4381 return (PFN_vkVoidFunction)vkDestroyImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05004382 if (!strcmp(funcName, "vkCreateShaderModule"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004383 return (PFN_vkVoidFunction)vkCreateShaderModule;
Dustin Graves27a912a2016-03-07 17:52:14 -07004384 if (!strcmp(funcName, "vkDestroyShaderModule"))
4385 return (PFN_vkVoidFunction)vkDestroyShaderModule;
4386 if (!strcmp(funcName, "vkCreatePipelineCache"))
4387 return (PFN_vkVoidFunction)vkCreatePipelineCache;
4388 if (!strcmp(funcName, "vkDestroyPipelineCache"))
4389 return (PFN_vkVoidFunction)vkDestroyPipelineCache;
4390 if (!strcmp(funcName, "vkGetPipelineCacheData"))
4391 return (PFN_vkVoidFunction)vkGetPipelineCacheData;
4392 if (!strcmp(funcName, "vkMergePipelineCaches"))
4393 return (PFN_vkVoidFunction)vkMergePipelineCaches;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004394 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004395 return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004396 if (!strcmp(funcName, "vkCreateComputePipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004397 return (PFN_vkVoidFunction)vkCreateComputePipelines;
Dustin Graves27a912a2016-03-07 17:52:14 -07004398 if (!strcmp(funcName, "vkDestroyPipeline"))
4399 return (PFN_vkVoidFunction)vkDestroyPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004400 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004401 return (PFN_vkVoidFunction)vkCreatePipelineLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07004402 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
4403 return (PFN_vkVoidFunction)vkDestroyPipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004404 if (!strcmp(funcName, "vkCreateSampler"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004405 return (PFN_vkVoidFunction)vkCreateSampler;
Dustin Graves27a912a2016-03-07 17:52:14 -07004406 if (!strcmp(funcName, "vkDestroySampler"))
4407 return (PFN_vkVoidFunction)vkDestroySampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004408 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004409 return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07004410 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
4411 return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004412 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004413 return (PFN_vkVoidFunction)vkCreateDescriptorPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07004414 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
4415 return (PFN_vkVoidFunction)vkDestroyDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004416 if (!strcmp(funcName, "vkResetDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004417 return (PFN_vkVoidFunction)vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004418 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004419 return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004420 if (!strcmp(funcName, "vkCmdSetViewport"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004421 return (PFN_vkVoidFunction)vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004422 if (!strcmp(funcName, "vkCmdSetScissor"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004423 return (PFN_vkVoidFunction)vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004424 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004425 return (PFN_vkVoidFunction)vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004426 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004427 return (PFN_vkVoidFunction)vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004428 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004429 return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004430 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004431 return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004432 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004433 return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004434 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004435 return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004436 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004437 return (PFN_vkVoidFunction)vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004438 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004439 return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004440 if (!strcmp(funcName, "vkFreeCommandBuffers"))
4441 return (PFN_vkVoidFunction)vkFreeCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004442 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004443 return (PFN_vkVoidFunction)vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004444 if (!strcmp(funcName, "vkEndCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004445 return (PFN_vkVoidFunction)vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004446 if (!strcmp(funcName, "vkResetCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004447 return (PFN_vkVoidFunction)vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004448 if (!strcmp(funcName, "vkCmdBindPipeline"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004449 return (PFN_vkVoidFunction)vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004450 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004451 return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004452 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004453 return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004454 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004455 return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004456 if (!strcmp(funcName, "vkCmdDraw"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004457 return (PFN_vkVoidFunction)vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004458 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004459 return (PFN_vkVoidFunction)vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004460 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004461 return (PFN_vkVoidFunction)vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004462 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004463 return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004464 if (!strcmp(funcName, "vkCmdDispatch"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004465 return (PFN_vkVoidFunction)vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004466 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004467 return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004468 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004469 return (PFN_vkVoidFunction)vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004470 if (!strcmp(funcName, "vkCmdCopyImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004471 return (PFN_vkVoidFunction)vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004472 if (!strcmp(funcName, "vkCmdBlitImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004473 return (PFN_vkVoidFunction)vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004474 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004475 return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004476 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004477 return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004478 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004479 return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004480 if (!strcmp(funcName, "vkCmdFillBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004481 return (PFN_vkVoidFunction)vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004482 if (!strcmp(funcName, "vkCmdClearColorImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004483 return (PFN_vkVoidFunction)vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004484 if (!strcmp(funcName, "vkCmdResolveImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004485 return (PFN_vkVoidFunction)vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004486 if (!strcmp(funcName, "vkCmdSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004487 return (PFN_vkVoidFunction)vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004488 if (!strcmp(funcName, "vkCmdResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004489 return (PFN_vkVoidFunction)vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004490 if (!strcmp(funcName, "vkCmdWaitEvents"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004491 return (PFN_vkVoidFunction)vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004492 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004493 return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004494 if (!strcmp(funcName, "vkCmdBeginQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004495 return (PFN_vkVoidFunction)vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004496 if (!strcmp(funcName, "vkCmdEndQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004497 return (PFN_vkVoidFunction)vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004498 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004499 return (PFN_vkVoidFunction)vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004500 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004501 return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004502 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004503 return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004504 if (!strcmp(funcName, "vkCreateFramebuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004505 return (PFN_vkVoidFunction)vkCreateFramebuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07004506 if (!strcmp(funcName, "vkDestroyFramebuffer"))
4507 return (PFN_vkVoidFunction)vkDestroyFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004508 if (!strcmp(funcName, "vkCreateRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004509 return (PFN_vkVoidFunction)vkCreateRenderPass;
Dustin Graves27a912a2016-03-07 17:52:14 -07004510 if (!strcmp(funcName, "vkDestroyRenderPass"))
4511 return (PFN_vkVoidFunction)vkDestroyRenderPass;
4512 if (!strcmp(funcName, "vkGetRenderAreaGranularity"))
4513 return (PFN_vkVoidFunction)vkGetRenderAreaGranularity;
4514 if (!strcmp(funcName, "vkCreateCommandPool"))
4515 return (PFN_vkVoidFunction)vkCreateCommandPool;
4516 if (!strcmp(funcName, "vkDestroyCommandPool"))
4517 return (PFN_vkVoidFunction)vkDestroyCommandPool;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004518 if (!strcmp(funcName, "vkResetCommandPool"))
4519 return (PFN_vkVoidFunction)vkResetCommandPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004520 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004521 return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08004522 if (!strcmp(funcName, "vkCmdNextSubpass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004523 return (PFN_vkVoidFunction)vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06004524
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004525 if (device == NULL) {
4526 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004527 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004528
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004529 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004530 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004531 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004532}
4533
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004534VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004535 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004536 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004537 if (!strcmp(funcName, "vkCreateInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004538 return (PFN_vkVoidFunction)vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004539 if (!strcmp(funcName, "vkDestroyInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004540 return (PFN_vkVoidFunction)vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004541 if (!strcmp(funcName, "vkCreateDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004542 return (PFN_vkVoidFunction)vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004543 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004544 return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004545 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004546 return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004547 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004548 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06004549 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004550 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
Dustin Graves16d18972016-05-09 17:36:57 -06004551 if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties"))
4552 return (PFN_vkVoidFunction)vkGetPhysicalDeviceImageFormatProperties;
4553 if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties"))
4554 return (PFN_vkVoidFunction)vkGetPhysicalDeviceSparseImageFormatProperties;
4555 if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties"))
4556 return (PFN_vkVoidFunction)vkGetPhysicalDeviceQueueFamilyProperties;
4557 if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties"))
4558 return (PFN_vkVoidFunction)vkGetPhysicalDeviceMemoryProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004559 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004560 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004561 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004562 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004563 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004564 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004565 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004566 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004567
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004568 if (instance == NULL) {
4569 return NULL;
4570 }
4571
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004572 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004573
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004574 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004575 if (fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004576 return fptr;
4577
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004578 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004579 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004580 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004581}