blob: 9e711f31909a3e009588f4b28fb387116095fb80 [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 -0700137static const VkLayerProperties pc_global_layers[] = {{
Jon Ashburndc9111c2016-03-22 12:57:13 -0600138 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700139}};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700140
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700141static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600142 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700143 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
144 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
145 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
146 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
147 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 -0700148 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700149 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600150 return false;
151 }
152
153 return true;
154}
155
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700156static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
157 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600158 return "unrecognized enumerator";
159 }
160
161 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700162 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600163 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
164 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700165 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600166 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
167 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700168 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600169 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
170 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700171 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600172 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
173 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700174 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600175 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
176 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700177 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600178 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
179 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700180 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600181 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
182 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700183 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600184 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
185 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700186 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600187 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
188 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700189 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600190 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
191 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700192 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800193 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600194 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700195 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800196 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600197 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700198 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700199 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
200 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600201
202 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700203 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600204 enumeratorString += string;
205
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700206 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600207 enumeratorString += '|';
208 }
209 }
210
211 return enumeratorString;
212}
213
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700214static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
215 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
216 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
217 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
218 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
219 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600220 return false;
221 }
222
223 return true;
224}
225
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700226static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
227 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600228 return "unrecognized enumerator";
229 }
230
231 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700232 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600233 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
234 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700235 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600236 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600237 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700238 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600239 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
240 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700241 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600242 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
243 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700244 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600245 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
246 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700247 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800248 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700250 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600251 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
252 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700253 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800254 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600255 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600256
257 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700258 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600259 enumeratorString += string;
260
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700261 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600262 enumeratorString += '|';
263 }
264 }
265
266 return enumeratorString;
267}
268
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700269static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
270 VkQueueFlagBits allFlags =
271 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
272 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600273 return false;
274 }
275
276 return true;
277}
278
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700279static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
280 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600281 return "unrecognized enumerator";
282 }
283
284 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700285 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800286 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600287 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700288 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600289 strings.push_back("VK_QUEUE_COMPUTE_BIT");
290 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700291 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800292 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600293 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700294 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600295 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
296 }
297
298 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700299 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600300 enumeratorString += string;
301
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700302 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600303 enumeratorString += '|';
304 }
305 }
306
307 return enumeratorString;
308}
309
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700310static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
311 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
312 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
313 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
314 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600315 return false;
316 }
317
318 return true;
319}
320
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700321static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
322 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600323 return "unrecognized enumerator";
324 }
325
326 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700327 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600328 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
329 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700330 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800331 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600332 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700333 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600334 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
335 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700336 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800337 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600338 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700339 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800340 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600341 }
342
343 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700344 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600345 enumeratorString += string;
346
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700347 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600348 enumeratorString += '|';
349 }
350 }
351
352 return enumeratorString;
353}
354
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700355static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700356 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700357 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600358 return false;
359 }
360
361 return true;
362}
363
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700364static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
365 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600366 return "unrecognized enumerator";
367 }
368
369 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700370 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800371 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600372 }
373
374 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700375 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600376 enumeratorString += string;
377
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700378 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600379 enumeratorString += '|';
380 }
381 }
382
383 return enumeratorString;
384}
385
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700386static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
387 VkSparseImageFormatFlagBits allFlags =
388 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
389 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
390 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600391 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600392 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600393
394 return true;
395}
396
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700397static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
398 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600399 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600400 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600401
402 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700403 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800404 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600405 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700406 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800407 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600408 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700409 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800410 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600411 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600412
413 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700414 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600415 enumeratorString += string;
416
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700417 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600418 enumeratorString += '|';
419 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600420 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600421
422 return enumeratorString;
423}
424
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700425static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700426 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700427 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600428 return false;
429 }
430
431 return true;
432}
433
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700434static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
435 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600436 return "unrecognized enumerator";
437 }
438
439 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700440 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600441 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
442 }
443
444 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700445 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600446 enumeratorString += string;
447
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700448 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600449 enumeratorString += '|';
450 }
451 }
452
453 return enumeratorString;
454}
455
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700456static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
457 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
458 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
459 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
460 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
461 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600462 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
463 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
464 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700465 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600466 return false;
467 }
468
469 return true;
470}
471
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700472static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
473 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600474 return "unrecognized enumerator";
475 }
476
477 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700478 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700479 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600480 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700481 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700482 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600483 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700484 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700485 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600486 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700487 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700488 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600489 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700490 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700491 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600492 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700493 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700494 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600495 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700496 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700497 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600498 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700499 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700500 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600501 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700502 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700503 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600504 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700505 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700506 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600507 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700508 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700509 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600510 }
511
512 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700513 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600514 enumeratorString += string;
515
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700516 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600517 enumeratorString += '|';
518 }
519 }
520
521 return enumeratorString;
522}
523
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700524static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
525 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
526 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
527 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600528 return false;
529 }
530
531 return true;
532}
533
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700534static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
535 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600536 return "unrecognized enumerator";
537 }
538
539 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700540 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600541 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
542 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700543 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600544 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
545 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700546 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600547 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
548 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700549 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600550 strings.push_back("VK_QUERY_RESULT_64_BIT");
551 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600552
553 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700554 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600555 enumeratorString += string;
556
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700557 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600558 enumeratorString += '|';
559 }
560 }
561
562 return enumeratorString;
563}
564
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700565static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
566 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
567 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
568 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
569 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
570 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600571 return false;
572 }
573
574 return true;
575}
576
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700577static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
578 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600579 return "unrecognized enumerator";
580 }
581
582 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700583 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600584 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
585 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700586 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600587 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
588 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700589 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600590 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
591 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700592 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600593 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
594 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700595 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600596 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
597 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700598 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800599 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700601 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600602 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
603 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700604 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600606 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700607 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600608 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
609 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600610
611 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700612 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600613 enumeratorString += string;
614
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700615 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600616 enumeratorString += '|';
617 }
618 }
619
620 return enumeratorString;
621}
622
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700623static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
624 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
625 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
626 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600627 return false;
628 }
629
630 return true;
631}
632
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700633static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
634 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600635 return "unrecognized enumerator";
636 }
637
638 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700639 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600640 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
641 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700642 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600643 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
644 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700645 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600646 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600647 }
648
649 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700650 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600651 enumeratorString += string;
652
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700653 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600654 enumeratorString += '|';
655 }
656 }
657
658 return enumeratorString;
659}
660
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700661static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
662 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
663 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
664 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
665 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600666 return false;
667 }
668
669 return true;
670}
671
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700672static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
673 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600674 return "unrecognized enumerator";
675 }
676
677 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700678 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600679 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
680 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700681 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600682 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
683 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700684 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600685 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
686 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700687 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600688 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
689 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700690 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600691 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600692 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600693
694 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700695 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600696 enumeratorString += string;
697
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700698 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600699 enumeratorString += '|';
700 }
701 }
702
703 return enumeratorString;
704}
705
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700706static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
707 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
708 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
709 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600710 return false;
711 }
712
713 return true;
714}
715
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700716static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
717 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600718 return "unrecognized enumerator";
719 }
720
721 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700722 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800723 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600724 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700725 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800726 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600727 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700728 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800729 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600730 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700731 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800732 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600733 }
734
735 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700736 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600737 enumeratorString += string;
738
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700739 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600740 enumeratorString += '|';
741 }
742 }
743
744 return enumeratorString;
745}
746
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700747static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
748 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
749 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
750 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600751 return false;
752 }
753
754 return true;
755}
756
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700757static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
758 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600759 return "unrecognized enumerator";
760 }
761
762 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700763 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600764 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
765 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700766 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600767 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
768 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700769 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600770 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600771 }
772
773 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700774 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600775 enumeratorString += string;
776
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700777 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600778 enumeratorString += '|';
779 }
780 }
781
782 return enumeratorString;
783}
784
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700785static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
786 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
787 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
788 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
789 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600790 return false;
791 }
792
793 return true;
794}
795
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700796static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
797 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600798 return "unrecognized enumerator";
799 }
800
801 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700802 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600803 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600804 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700805 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600806 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600807 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700808 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600809 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
810 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700811 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600812 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
813 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700814 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600815 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600816 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700817 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600818 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600819 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700820 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600821 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600822 }
823
824 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700825 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600826 enumeratorString += string;
827
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700828 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600829 enumeratorString += '|';
830 }
831 }
832
833 return enumeratorString;
834}
835
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700836static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800837 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700838 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
839 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
840 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
841 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
842 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
843 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 -0700844 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700845 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600846 return false;
847 }
848
849 return true;
850}
851
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700852static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
853 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600854 return "unrecognized enumerator";
855 }
856
857 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700858 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800859 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
860 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700861 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800862 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600863 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700864 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600865 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600866 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700867 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600868 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600869 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700870 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600871 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600872 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700873 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700874 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600875 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700876 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600877 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600878 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700879 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600880 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600881 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700882 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600883 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600884 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700885 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600886 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600887 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700888 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600889 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
890 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700891 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600892 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
893 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700894 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700895 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600896 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700897 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600898 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
899 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700900 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600901 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
902 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700903 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600904 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
905 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700906 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600907 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600908 }
909
910 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700911 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600912 enumeratorString += string;
913
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700914 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600915 enumeratorString += '|';
916 }
917 }
918
919 return enumeratorString;
920}
921
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700922static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800923 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700924 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
925 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
926 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
927 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
928 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 +0800929
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700930 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600931 return false;
932 }
933
934 return true;
935}
936
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700937static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
938 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600939 return "unrecognized enumerator";
940 }
941
942 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700943 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800944 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600945 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700946 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800947 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600948 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700949 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800950 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600951 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700952 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800953 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600954 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700955 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800956 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600957 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700958 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800959 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600960 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700961 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800962 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600963 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700964 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800965 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600966 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700967 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800968 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600969 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700970 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800971 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600972 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700973 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800974 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600975 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700976 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800977 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600978 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700979 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800980 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600981 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700982 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800983 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600984 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700985 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800986 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600987 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700988 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800989 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600990 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700991 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800992 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600993 }
994
995 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700996 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600997 enumeratorString += string;
998
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700999 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001000 enumeratorString += '|';
1001 }
1002 }
1003
1004 return enumeratorString;
1005}
1006
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001007static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1008 VkCommandPoolCreateFlagBits allFlags =
1009 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1010 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001011 return false;
1012 }
1013
1014 return true;
1015}
1016
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001017static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1018 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001019 return "unrecognized enumerator";
1020 }
1021
1022 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001023 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001024 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001025 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001026 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001027 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001028 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001029
1030 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001031 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001032 enumeratorString += string;
1033
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001034 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001035 enumeratorString += '|';
1036 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001037 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001038
1039 return enumeratorString;
1040}
1041
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001042static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001043 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001044 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001045 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001046 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001047
1048 return true;
1049}
1050
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001051static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1052 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001053 return "unrecognized enumerator";
1054 }
1055
1056 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001057 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001058 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001059 }
1060
1061 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001062 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001063 enumeratorString += string;
1064
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001065 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001066 enumeratorString += '|';
1067 }
1068 }
1069
1070 return enumeratorString;
1071}
1072
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001073static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1074 VkCommandBufferUsageFlags allFlags =
1075 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1076 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1077 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001078 return false;
1079 }
1080
1081 return true;
1082}
1083
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001084static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1085 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001086 return "unrecognized enumerator";
1087 }
1088
1089 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001090 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001091 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001092 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001093 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001094 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001095 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001096 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001097 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001098 }
1099
1100 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001101 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001102 enumeratorString += string;
1103
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001104 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001105 enumeratorString += '|';
1106 }
1107 }
1108
1109 return enumeratorString;
1110}
1111
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001112static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001113 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001114 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001115 return false;
1116 }
1117
1118 return true;
1119}
1120
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001121static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1122 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001123 return "unrecognized enumerator";
1124 }
1125
1126 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001127 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001128 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001129 }
1130
1131 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001132 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001133 enumeratorString += string;
1134
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001135 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001136 enumeratorString += '|';
1137 }
1138 }
1139
1140 return enumeratorString;
1141}
1142
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001143static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1144 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1145 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1146 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001147 return false;
1148 }
1149
1150 return true;
1151}
1152
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001153static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1154 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001155 return "unrecognized enumerator";
1156 }
1157
1158 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001159 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001160 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1161 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001162 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001163 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1164 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001165 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001166 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1167 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001168 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001169 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1170 }
1171
1172 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001173 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001174 enumeratorString += string;
1175
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001176 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001177 enumeratorString += '|';
1178 }
1179 }
1180
1181 return enumeratorString;
1182}
1183
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001184static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001185 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001186 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001187 return false;
1188 }
1189
1190 return true;
1191}
1192
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001193static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1194 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001195 return "unrecognized enumerator";
1196 }
1197
1198 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001199 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001200 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001201 }
1202
1203 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001204 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001205 enumeratorString += string;
1206
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001207 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001208 enumeratorString += '|';
1209 }
1210 }
1211
1212 return enumeratorString;
1213}
1214
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001215static const int MaxParamCheckerStringLength = 256;
1216
Dustin Graves080069b2016-04-05 13:48:15 -06001217static bool validate_string(debug_report_data *report_data, const char *apiName, const char *stringName,
1218 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001219 assert(apiName != nullptr);
1220 assert(stringName != nullptr);
1221 assert(validateString != nullptr);
1222
Dustin Graves080069b2016-04-05 13:48:15 -06001223 bool skipCall = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001224
1225 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1226
1227 if (result == VK_STRING_ERROR_NONE) {
1228 return skipCall;
1229 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001230 skipCall =
1231 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1232 "PARAMCHECK", "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001233 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001234 skipCall =
1235 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1236 "PARAMCHECK", "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001237 }
1238 return skipCall;
1239}
1240
Dustin Gravesde628532016-04-21 16:30:17 -06001241static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1242 uint32_t index) {
1243 assert(device_data != nullptr);
1244 debug_report_data *report_data = device_data->report_data;
1245 bool skip_call = false;
1246
1247 if (index == VK_QUEUE_FAMILY_IGNORED) {
1248 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1249 "PARAMCHECK", "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
1250 } else {
1251 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1252 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1253 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1254 "PARAMCHECK", "%s: %s (%d) must be one of the indices specified when the device was created, via "
1255 "the VkDeviceQueueCreateInfo structure.",
1256 function_name, parameter_name, index);
1257 return false;
1258 }
1259 }
1260
1261 return skip_call;
1262}
1263
1264static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1265 const uint32_t count, const uint32_t *indices) {
1266 assert(device_data != nullptr);
1267 debug_report_data *report_data = device_data->report_data;
1268 bool skip_call = false;
1269
1270 if (indices != nullptr) {
1271 for (uint32_t i = 0; i < count; i++) {
1272 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
1273 skip_call |=
1274 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1275 "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
1276 } else {
1277 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1278 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1279 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1280 "PARAMCHECK", "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1281 "created, via the VkDeviceQueueCreateInfo structure.",
1282 function_name, parameter_name, i, indices[i]);
1283 return false;
1284 }
1285 }
1286 }
1287 }
1288
1289 return skip_call;
1290}
1291
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001292VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1293vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001294 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001295
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001296 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001297 assert(chain_info != nullptr);
1298 assert(chain_info->u.pLayerInfo != nullptr);
1299
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001300 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1301 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001302 if (fpCreateInstance == NULL) {
1303 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001304 }
1305
Dustin Graves842621d2016-03-03 14:17:08 -07001306 // Advance the link info for the next element on the chain
1307 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1308
1309 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001310
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001311 if (result == VK_SUCCESS) {
1312 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1313 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001314
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001315 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001316
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001317 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1318 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001319
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001320 // Look for one or more debug report create info structures
1321 // and setup a callback(s) for each one found.
1322 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1323 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1324 if (my_instance_data->num_tmp_callbacks > 0) {
1325 // Setup the temporary callback(s) here to catch early issues:
1326 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1327 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1328 // Failure of setting up one or more of the callback.
1329 // Therefore, clean up and don't use those callbacks:
1330 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1331 my_instance_data->num_tmp_callbacks = 0;
1332 }
1333 }
1334 }
1335
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001336 init_parameter_validation(my_instance_data, pAllocator);
Dustin Graves842621d2016-03-03 14:17:08 -07001337
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001338 // Ordinarily we'd check these before calling down the chain, but none of the layer
1339 // support is in place until now, if we survive we can report the issue now.
1340 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001341
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001342 if (pCreateInfo->pApplicationInfo) {
1343 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1344 validate_string(my_instance_data->report_data, "vkCreateInstance",
1345 "pCreateInfo->VkApplicationInfo->pApplicationName",
1346 pCreateInfo->pApplicationInfo->pApplicationName);
1347 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001348
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001349 if (pCreateInfo->pApplicationInfo->pEngineName) {
1350 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1351 pCreateInfo->pApplicationInfo->pEngineName);
1352 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001353 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001354
1355 // Disable the tmp callbacks:
1356 if (my_instance_data->num_tmp_callbacks > 0) {
1357 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1358 my_instance_data->tmp_callbacks);
1359 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001360 }
1361
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001362 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001363}
1364
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001365VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001366 // Grab the key before the instance is destroyed.
1367 dispatch_key key = get_dispatch_key(instance);
Dustin Graves080069b2016-04-05 13:48:15 -06001368 bool skipCall = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001369 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001370 assert(my_data != NULL);
1371
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001372 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1373 bool callback_setup = false;
1374 if (my_data->num_tmp_callbacks > 0) {
1375 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1376 my_data->tmp_callbacks)) {
1377 callback_setup = true;
1378 }
1379 }
1380
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001381 skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001382
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001383 // Disable and cleanup the temporary callback(s):
1384 if (callback_setup) {
1385 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1386 }
1387 if (my_data->num_tmp_callbacks > 0) {
1388 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1389 my_data->num_tmp_callbacks = 0;
1390 }
1391
Dustin Graves080069b2016-04-05 13:48:15 -06001392 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001393 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001394 pTable->DestroyInstance(instance, pAllocator);
1395
1396 // Clean up logging callback, if any
1397 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001398 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1399 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001400 my_data->logging_callback.pop_back();
1401 }
1402
1403 layer_debug_report_destroy_instance(mid(instance));
1404 layer_data_map.erase(pTable);
1405
1406 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001407 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001408 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001409}
1410
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001411VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1412vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) {
1413 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001414 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001415 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001416 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001417
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001418 skipCall |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001419
Dustin Graves080069b2016-04-05 13:48:15 -06001420 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001421 result = get_dispatch_table(pc_instance_table_map, instance)
1422 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001423
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001424 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001425 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001426
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001427 return result;
1428}
1429
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001430VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1431vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Dustin Graves080069b2016-04-05 13:48:15 -06001432 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001433 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001434 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001435
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001436 skipCall |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001437
Dustin Graves080069b2016-04-05 13:48:15 -06001438 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001439 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001440 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001441}
1442
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001443VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1444vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001445 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001446 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001447 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001448
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001449 skipCall |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001450
Dustin Graves080069b2016-04-05 13:48:15 -06001451 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001452 get_dispatch_table(pc_instance_table_map, physicalDevice)
1453 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001454 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001455}
1456
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001457VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1458vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
1459 VkImageUsageFlags usage, VkImageCreateFlags flags,
1460 VkImageFormatProperties *pImageFormatProperties) {
1461 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001462 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001463 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001464 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001465
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001466 skipCall |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001467 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001468
Dustin Graves080069b2016-04-05 13:48:15 -06001469 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001470 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1471 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1472 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001473
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001474 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001475 }
Chia-I Wu17241042015-10-31 00:31:16 +08001476
1477 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001478}
1479
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001480VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1481vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001482 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001483 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001484 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001485
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001486 skipCall |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001487
Dustin Graves080069b2016-04-05 13:48:15 -06001488 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001489 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001490 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001491}
1492
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001493VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1494vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1495 VkQueueFamilyProperties *pQueueFamilyProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001496 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001497 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001498 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001499
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001500 skipCall |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001501 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001502
Dustin Graves080069b2016-04-05 13:48:15 -06001503 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001504 get_dispatch_table(pc_instance_table_map, physicalDevice)
1505 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001506 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001507}
1508
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001509VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1510vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001511 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001512 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001513 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001514
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001515 skipCall |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001516
Dustin Graves080069b2016-04-05 13:48:15 -06001517 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001518 get_dispatch_table(pc_instance_table_map, physicalDevice)
1519 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001520 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001521}
1522
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001523void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1524 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001525 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001526
1527 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1528 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1529 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001530 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1531 INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001532 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1533 "structure.",
1534 i);
1535 } else {
1536 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001537 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001538
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001539 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1540 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1541 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1542 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001543 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
1544 __LINE__, INVALID_USAGE, "PARAMCHECK",
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001545 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1546 "between 0 and 1. Actual value is %f",
1547 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1548 }
1549 }
1550 }
1551
1552 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1553 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001554 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1555 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001556 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1557 "of queue families.",
1558 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001559 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1560 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1561 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001562 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1563 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001564 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1565 "queues for the given family index.",
1566 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001567 }
Michael Lentine774704f2016-01-27 13:36:46 -06001568 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001569 }
1570}
1571
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001572void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001573 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001574
1575 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1576 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1577 my_device_data->queueFamilyIndexMap.insert(
1578 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1579 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001580 }
1581}
1582
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001583VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice,
1584 const VkDeviceCreateInfo *pCreateInfo,
1585 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001586 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001587 * NOTE: We do not validate physicalDevice or any dispatchable
1588 * object as the first parameter. We couldn't get here if it was wrong!
1589 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001590
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001591 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001592 bool skipCall = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001593 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001594 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001595
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001596 skipCall |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001597
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001598 if (pCreateInfo != NULL) {
1599 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001600 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001601 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1602 pCreateInfo->ppEnabledLayerNames[i]);
1603 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001604 }
Michael Lentine774704f2016-01-27 13:36:46 -06001605
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001606 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001607 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001608 skipCall |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1609 pCreateInfo->ppEnabledExtensionNames[i]);
1610 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001611 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001612 }
1613
Dustin Graves080069b2016-04-05 13:48:15 -06001614 if (!skipCall) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001615 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001616 assert(chain_info != nullptr);
1617 assert(chain_info->u.pLayerInfo != nullptr);
1618
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001619 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1620 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001621 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001622 if (fpCreateDevice == NULL) {
1623 return VK_ERROR_INITIALIZATION_FAILED;
1624 }
1625
1626 // Advance the link info for the next element on the chain
1627 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1628
1629 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001630
1631 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1632
1633 if (result == VK_SUCCESS) {
1634 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1635 assert(my_device_data != nullptr);
1636
1637 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1638 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1639
1640 uint32_t count;
1641 get_dispatch_table(pc_instance_table_map, physicalDevice)
1642 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
1643 std::vector<VkQueueFamilyProperties> properties(count);
1644 get_dispatch_table(pc_instance_table_map, physicalDevice)
1645 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
1646
1647 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1648 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001649 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001650 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001651
Jeremy Hayes99a96322015-06-26 12:48:09 -06001652 return result;
1653}
1654
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001655VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001656 dispatch_key key = get_dispatch_key(device);
Dustin Graves080069b2016-04-05 13:48:15 -06001657 bool skipCall = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001658 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1659 assert(my_data != NULL);
1660
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001661 skipCall |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001662
Dustin Graves080069b2016-04-05 13:48:15 -06001663 if (!skipCall) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001664 layer_debug_report_destroy_device(device);
1665
Jeremy Hayes99a96322015-06-26 12:48:09 -06001666#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001667 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001668#endif
1669
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001670 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001671 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001672 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001673 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001674}
1675
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001676bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001677 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001678 assert(my_device_data != nullptr);
1679
Dustin Gravesde628532016-04-21 16:30:17 -06001680 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001681
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001682 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001683 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001684 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1685 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001686 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1687 "was created.",
1688 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001689 return false;
1690 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001691
Michael Lentinebdf744f2016-01-27 15:43:43 -06001692 return true;
1693}
1694
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001695VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1696vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Dustin Graves080069b2016-04-05 13:48:15 -06001697 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001698 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001699 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001700
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001701 skipCall |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001702
Dustin Graves080069b2016-04-05 13:48:15 -06001703 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001704 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1705
1706 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001707 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001708}
1709
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001710VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1711vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
1712 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001713 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001714 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001715 assert(my_data != NULL);
1716
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001717 skipCall |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001718
Dustin Graves080069b2016-04-05 13:48:15 -06001719 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001720 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1721
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001722 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001723 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001724
Jeremy Hayes99a96322015-06-26 12:48:09 -06001725 return result;
1726}
1727
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001728VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001729 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1730 assert(my_data != NULL);
1731
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001732 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001733
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001734 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001735
1736 return result;
1737}
1738
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001739VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001740 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1741 assert(my_data != NULL);
1742
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001743 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001744
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001745 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001746
1747 return result;
1748}
1749
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001750VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1751 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1752 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001753 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001754 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001755 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001756
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001757 skipCall |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001758
Dustin Graves080069b2016-04-05 13:48:15 -06001759 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001760 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1761
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001762 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001763 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001764
1765 return result;
1766}
1767
Dustin Graves27a912a2016-03-07 17:52:14 -07001768VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001769vkFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06001770 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001771 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001772 assert(my_data != NULL);
1773
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001774 skipCall |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001775
Dustin Graves080069b2016-04-05 13:48:15 -06001776 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001777 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001778 }
1779}
1780
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001781VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1782vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
1783 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001784 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001785 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001786 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001787
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001788 skipCall |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001789
Dustin Graves080069b2016-04-05 13:48:15 -06001790 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001791 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1792
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001793 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001794 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001795
1796 return result;
1797}
1798
Dustin Graves20fd66f2016-04-18 18:33:21 -06001799VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUnmapMemory(VkDevice device, VkDeviceMemory memory) {
1800 bool skipCall = false;
1801 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1802 assert(my_data != NULL);
1803
1804 skipCall |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1805
1806 if (!skipCall) {
1807 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1808 }
1809}
1810
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001811VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1812vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1813 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001814 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001815 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001816 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001817
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001818 skipCall |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001819
Dustin Graves080069b2016-04-05 13:48:15 -06001820 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001821 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1822
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001823 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001824 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001825
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001826 return result;
1827}
1828
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001829VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1830vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) {
1831 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001832 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001833 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001834 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001835
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001836 skipCall |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001837
Dustin Graves080069b2016-04-05 13:48:15 -06001838 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001839 result =
1840 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001841
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001842 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001843 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001844
Tony Barbourb1250542015-04-16 19:23:13 -06001845 return result;
1846}
1847
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001848VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1849vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) {
Dustin Graves080069b2016-04-05 13:48:15 -06001850 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001851 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001852 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001853
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001854 skipCall |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001855
Dustin Graves080069b2016-04-05 13:48:15 -06001856 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001857 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001858 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001859}
1860
Dustin Graves20fd66f2016-04-18 18:33:21 -06001861VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1862 VkDeviceSize memoryOffset) {
1863 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1864 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001865 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1866 assert(my_data != NULL);
1867
Dustin Graves20fd66f2016-04-18 18:33:21 -06001868 skipCall |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001869
Dustin Graves20fd66f2016-04-18 18:33:21 -06001870 if (!skipCall) {
1871 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1872
1873 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1874 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001875
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001876 return result;
1877}
1878
Dustin Graves20fd66f2016-04-18 18:33:21 -06001879VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
1880 VkDeviceSize memoryOffset) {
1881 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1882 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001883 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1884 assert(my_data != NULL);
1885
Dustin Graves20fd66f2016-04-18 18:33:21 -06001886 skipCall |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001887
Dustin Graves20fd66f2016-04-18 18:33:21 -06001888 if (!skipCall) {
1889 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1890
1891 validate_result(my_data->report_data, "vkBindImageMemory", result);
1892 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001893
1894 return result;
1895}
1896
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001897VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1898vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001899 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001900 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001901 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001902
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001903 skipCall |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001904
Dustin Graves080069b2016-04-05 13:48:15 -06001905 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001906 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001907 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001908}
1909
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001910VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1911vkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001912 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001913 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001914 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001915
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001916 skipCall |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001917
Dustin Graves080069b2016-04-05 13:48:15 -06001918 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001919 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001920 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001921}
1922
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001923bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1924 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1925 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001926 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001927 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1928 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001929 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1930 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001931 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1932 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001933 return false;
1934 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001935 }
1936
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001937 return true;
1938}
1939
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001940VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1941vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1942 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Dustin Graves080069b2016-04-05 13:48:15 -06001943 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001944 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001945 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001946
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001947 skipCall |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001948 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001949
Dustin Graves080069b2016-04-05 13:48:15 -06001950 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001951 get_dispatch_table(pc_device_table_map, device)
1952 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001953
1954 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1955 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001956}
1957
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001958bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1959 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1960 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001961 if (pProperties != nullptr) {
1962 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1963 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001964 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
1965 "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001966 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
1967 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001968 return false;
1969 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001970 }
1971
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001972 return true;
1973}
1974
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001975VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
1976vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
1977 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
1978 uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
Dustin Graves080069b2016-04-05 13:48:15 -06001979 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001980 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001981 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001982
Mark Lobodzinski739391a2016-03-17 15:08:18 -06001983 skipCall |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001984 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001985
Dustin Graves080069b2016-04-05 13:48:15 -06001986 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001987 get_dispatch_table(pc_instance_table_map, physicalDevice)
1988 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
1989 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001990
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001991 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
1992 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001993 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001994}
1995
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001996VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
1997vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) {
1998 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06001999 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002000 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002001 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002002
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002003 skipCall |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002004
Dustin Graves080069b2016-04-05 13:48:15 -06002005 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002006 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2007
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002008 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002009 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002010
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002011 return result;
2012}
2013
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002014VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2015vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
2016 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002017 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002018 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002019 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002020
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002021 skipCall |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002022
Dustin Graves080069b2016-04-05 13:48:15 -06002023 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002024 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2025
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002026 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002027 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002028
2029 return result;
2030}
2031
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002032VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002033 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002034 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002035 assert(my_data != NULL);
2036
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002037 skipCall |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002038
Dustin Graves080069b2016-04-05 13:48:15 -06002039 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002040 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002041 }
2042}
2043
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002044VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
2045 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002046 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002047 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002048 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002049
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002050 skipCall |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002051
Dustin Graves080069b2016-04-05 13:48:15 -06002052 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002053 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2054
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002055 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002056 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002057
2058 return result;
2059}
2060
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002061VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002062 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2063 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002064 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2065 assert(my_data != NULL);
2066
Dustin Graves20fd66f2016-04-18 18:33:21 -06002067 skipCall |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002068
Dustin Graves20fd66f2016-04-18 18:33:21 -06002069 if (!skipCall) {
2070 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2071
2072 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2073 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002074
2075 return result;
2076}
2077
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002078VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2079vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
2080 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002081 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002082 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002083 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002084
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002085 skipCall |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002086
Dustin Graves080069b2016-04-05 13:48:15 -06002087 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002088 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2089
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002090 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002091 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002092
2093 return result;
2094}
2095
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002096VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
2097 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2098 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002099 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002100 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002101 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002102
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002103 skipCall |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002104
Dustin Graves080069b2016-04-05 13:48:15 -06002105 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002106 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2107
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002108 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002109 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002110
2111 return result;
2112}
2113
Dustin Graves27a912a2016-03-07 17:52:14 -07002114VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002115vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002116 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002117 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002118 assert(my_data != NULL);
2119
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002120 skipCall |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002121
Dustin Graves080069b2016-04-05 13:48:15 -06002122 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002123 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002124 }
2125}
2126
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002127VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2128vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
2129 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002130 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002131 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002132 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002133
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002134 skipCall |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002135
Dustin Graves080069b2016-04-05 13:48:15 -06002136 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002137 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2138
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002139 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002140 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002141
2142 return result;
2143}
2144
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002145VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002146 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002147 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002148 assert(my_data != NULL);
2149
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002150 skipCall |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002151
Dustin Graves080069b2016-04-05 13:48:15 -06002152 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002153 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002154 }
2155}
2156
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002157VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002158 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2159 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002160 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2161 assert(my_data != NULL);
2162
Dustin Graves20fd66f2016-04-18 18:33:21 -06002163 skipCall |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002164
Dustin Graves20fd66f2016-04-18 18:33:21 -06002165 if (!skipCall) {
2166 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2167
2168 validate_result(my_data->report_data, "vkGetEventStatus", result);
2169 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002170
2171 return result;
2172}
2173
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002174VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002175 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2176 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002177 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2178 assert(my_data != NULL);
2179
Dustin Graves20fd66f2016-04-18 18:33:21 -06002180 skipCall |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002181
Dustin Graves20fd66f2016-04-18 18:33:21 -06002182 if (!skipCall) {
2183 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2184
2185 validate_result(my_data->report_data, "vkSetEvent", result);
2186 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002187
2188 return result;
2189}
2190
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002191VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002192 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2193 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002194 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2195 assert(my_data != NULL);
2196
Dustin Graves20fd66f2016-04-18 18:33:21 -06002197 skipCall |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002198
Dustin Graves20fd66f2016-04-18 18:33:21 -06002199 if (!skipCall) {
2200 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2201
2202 validate_result(my_data->report_data, "vkResetEvent", result);
2203 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002204
2205 return result;
2206}
2207
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002208VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2209 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
2210 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002211 bool skip_call = false;
2212 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2213 assert(device_data != nullptr);
2214 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002215
Dustin Gravesc900f572016-05-16 11:07:59 -06002216 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002217
Dustin Gravesc900f572016-05-16 11:07:59 -06002218 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2219 if (pCreateInfo != nullptr) {
2220 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2221 // VkQueryPipelineStatisticFlagBits values
2222 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2223 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2224 skip_call |=
2225 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2226 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2227 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2228 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2229 }
2230 }
2231
2232 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002233 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2234
Dustin Gravesc900f572016-05-16 11:07:59 -06002235 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002236 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002237
2238 return result;
2239}
2240
Dustin Graves27a912a2016-03-07 17:52:14 -07002241VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002242vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002243 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002244 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002245 assert(my_data != NULL);
2246
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002247 skipCall |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002248
Dustin Graves080069b2016-04-05 13:48:15 -06002249 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002250 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002251 }
2252}
2253
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002254VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
2255 uint32_t queryCount, size_t dataSize, void *pData,
2256 VkDeviceSize stride, VkQueryResultFlags flags) {
2257 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002258 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002259 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002260 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002261
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002262 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002263 parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002264
Dustin Graves080069b2016-04-05 13:48:15 -06002265 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002266 result = get_dispatch_table(pc_device_table_map, device)
2267 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002268
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002269 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002270 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002271
2272 return result;
2273}
2274
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002275VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2276vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
2277 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002278 bool skip_call = false;
2279 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2280 assert(device_data != nullptr);
2281 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002282
Dustin Gravesc900f572016-05-16 11:07:59 -06002283 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002284
Dustin Gravesc900f572016-05-16 11:07:59 -06002285 if (pCreateInfo != nullptr) {
2286 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2287 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2288 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2289 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2290 skip_call |=
2291 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2292 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2293 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2294 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002295
Dustin Gravesc900f572016-05-16 11:07:59 -06002296 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2297 // queueFamilyIndexCount uint32_t values
2298 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2299 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2300 __LINE__, REQUIRED_PARAMETER, LayerName,
2301 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2302 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2303 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2304 }
2305
2306 // Ensure that the queue family indices were specified at device creation
2307 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2308 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2309 }
2310 }
2311
2312 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002313 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2314
Dustin Gravesc900f572016-05-16 11:07:59 -06002315 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002316 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002317
2318 return result;
2319}
2320
Dustin Graves27a912a2016-03-07 17:52:14 -07002321VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002322vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002323 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002324 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002325 assert(my_data != NULL);
2326
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002327 skipCall |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002328
Dustin Graves080069b2016-04-05 13:48:15 -06002329 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002330 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002331 }
2332}
2333
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002334VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2335 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
2336 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002337 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002338 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002339 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002340
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002341 skipCall |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002342
Dustin Graves080069b2016-04-05 13:48:15 -06002343 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002344 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2345
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002346 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002347 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002348
2349 return result;
2350}
2351
Dustin Graves27a912a2016-03-07 17:52:14 -07002352VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002353vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002354 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002355 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002356 assert(my_data != NULL);
2357
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002358 skipCall |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002359
Dustin Graves080069b2016-04-05 13:48:15 -06002360 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002361 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002362 }
2363}
2364
Dustin Gravesf8032f22016-05-11 18:31:44 -06002365VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2366 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
2367 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2368 bool skip_call = false;
2369 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002370 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002371 debug_report_data *report_data = device_data->report_data;
2372
2373 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2374
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002375 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002376 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002377 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002378 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2379 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2380 skip_call |=
2381 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2382 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2383 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2384 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002385
Dustin Gravesc900f572016-05-16 11:07:59 -06002386 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2387 // queueFamilyIndexCount uint32_t values
2388 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2389 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2390 __LINE__, REQUIRED_PARAMETER, LayerName,
2391 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2392 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2393 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2394 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002395
2396 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2397 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2398 }
2399
2400 // width, height, and depth members of extent must be greater than 0
2401 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width,
2402 0u);
2403 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height,
2404 0u);
2405 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth,
2406 0u);
2407
2408 // mipLevels must be greater than 0
2409 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels,
2410 0u);
2411
2412 // arrayLayers must be greater than 0
2413 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers,
2414 0u);
2415
2416 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2417 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2418 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2419 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
2420 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
2421 }
2422
2423 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2424 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2425 // extent.height must be equal
2426 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2427 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
2428 skip_call |=
2429 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2430 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2431 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2432 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
2433 }
2434
2435 if (pCreateInfo->extent.depth != 1) {
2436 skip_call |=
2437 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2438 LayerName,
2439 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2440 }
2441 }
2442
2443 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2444 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2445 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
2446 skip_call |= log_msg(
2447 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2448 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2449 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
2450 }
2451
2452 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2453 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2454 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2455 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
2456 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2457 LayerName,
2458 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2459 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002460 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002461 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002462
Dustin Gravesf8032f22016-05-11 18:31:44 -06002463 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002464 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2465
Dustin Gravesf8032f22016-05-11 18:31:44 -06002466 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002467 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002468
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002469 return result;
2470}
2471
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002472VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002473 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002474 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002475 assert(my_data != NULL);
2476
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002477 skipCall |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002478
Dustin Graves080069b2016-04-05 13:48:15 -06002479 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002480 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002481 }
2482}
2483
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002484bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2485 if (pSubresource != nullptr) {
2486 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2487 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002488 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2489 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002490 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2491 return false;
2492 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002493 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002494
2495 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002496}
2497
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002498VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
2499vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) {
Dustin Graves080069b2016-04-05 13:48:15 -06002500 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002501 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002502 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002503
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002504 skipCall |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002505
Dustin Graves080069b2016-04-05 13:48:15 -06002506 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002507 PreGetImageSubresourceLayout(device, pSubresource);
2508
2509 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002510 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002511}
2512
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002513VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2514 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
2515 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002516 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002517 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002518 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002519 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002520
Dustin Graves0b70a632016-04-27 17:44:56 -06002521 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002522
Dustin Graves0b70a632016-04-27 17:44:56 -06002523 if (pCreateInfo != nullptr) {
2524 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
2525 if (pCreateInfo->subresourceRange.layerCount != 1) {
2526 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2527 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2528 "pCreateInfo->subresourceRange.layerCount must be 1",
2529 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2530 }
2531 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
2532 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY)) {
2533 if (pCreateInfo->subresourceRange.layerCount < 1) {
2534 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2535 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2536 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2537 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2538 }
2539 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
2540 if (pCreateInfo->subresourceRange.layerCount != 6) {
2541 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2542 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2543 "pCreateInfo->subresourceRange.layerCount must be 6");
2544 }
2545 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
2546 if ((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) {
2547 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2548 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2549 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2550 }
2551 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2552 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2553 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2554 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2555 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2556 }
2557
2558 if (pCreateInfo->subresourceRange.layerCount != 1) {
2559 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2560 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2561 "pCreateInfo->subresourceRange.layerCount must be 1");
2562 }
2563 }
2564 }
2565
2566 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002567 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2568
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002569 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002570 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002571
2572 return result;
2573}
2574
Dustin Graves27a912a2016-03-07 17:52:14 -07002575VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002576vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002577 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002578 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002579 assert(my_data != NULL);
2580
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002581 skipCall |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002582
Dustin Graves080069b2016-04-05 13:48:15 -06002583 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002584 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002585 }
2586}
2587
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002588VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2589 const VkAllocationCallbacks *pAllocator,
2590 VkShaderModule *pShaderModule) {
2591 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002592 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002593 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002594 assert(my_data != NULL);
2595
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002596 skipCall |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002597
Dustin Graves080069b2016-04-05 13:48:15 -06002598 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002599 result =
2600 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002601
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002602 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002603 }
2604
Michael Lentine03d8e572015-09-15 14:59:14 -05002605 return result;
2606}
2607
Dustin Graves27a912a2016-03-07 17:52:14 -07002608VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002609vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002610 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002611 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002612 assert(my_data != NULL);
2613
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002614 skipCall |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002615
Dustin Graves080069b2016-04-05 13:48:15 -06002616 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002617 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002618 }
2619}
2620
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002621VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2622 const VkAllocationCallbacks *pAllocator,
2623 VkPipelineCache *pPipelineCache) {
2624 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002625 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002626 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002627 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002628
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002629 skipCall |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002630
Dustin Graves080069b2016-04-05 13:48:15 -06002631 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002632 result =
2633 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002634
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002635 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002636 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002637
2638 return result;
2639}
2640
Dustin Graves27a912a2016-03-07 17:52:14 -07002641VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002642vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002643 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002644 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002645 assert(my_data != NULL);
2646
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002647 skipCall |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002648
Dustin Graves080069b2016-04-05 13:48:15 -06002649 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002650 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002651 }
2652}
2653
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002654VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2655vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) {
2656 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002657 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002658 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002659 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002660
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002661 skipCall |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002662
Dustin Graves080069b2016-04-05 13:48:15 -06002663 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002664 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2665
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002666 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002667 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002668
2669 return result;
2670}
2671
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002672VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2673vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
2674 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002675 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002676 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002677 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002678
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002679 skipCall |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002680
Dustin Graves080069b2016-04-05 13:48:15 -06002681 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002682 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2683
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002684 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002685 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002686
2687 return result;
2688}
2689
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002690bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002691 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2692
2693 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002694 if (pCreateInfos != nullptr) {
2695 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2696 if (pCreateInfos->basePipelineIndex != -1) {
2697 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002698 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2699 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002700 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2701 "pCreateInfos->flags "
2702 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2703 return false;
2704 }
2705 }
2706
2707 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2708 if (pCreateInfos->basePipelineIndex != -1) {
2709 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002710 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2711 INVALID_USAGE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002712 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2713 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2714 "VK_NULL_HANDLE");
2715 return false;
2716 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002717 }
2718 }
2719
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002720 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002721 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002722 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2723 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002724 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2725 "unrecognized enumerator");
2726 return false;
2727 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002728 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002729
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002730 int i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002731 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002732 validate_string(data->report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pStages[j].pName",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002733 pCreateInfos[i].pStages[j].pName);
2734 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002735 }
2736
2737 return true;
2738}
2739
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002740VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2741vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2742 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2743 VkPipeline *pPipelines) {
2744 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002745 bool skip_call = false;
2746 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2747 assert(device_data != nullptr);
2748 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002749
Dustin Gravesc900f572016-05-16 11:07:59 -06002750 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2751 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002752
Dustin Gravesc900f572016-05-16 11:07:59 -06002753 if (pCreateInfos != nullptr) {
2754 for (uint32_t i = 0; i < createInfoCount; ++i) {
2755 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2756 if (pCreateInfos[i].pTessellationState == nullptr) {
2757 if (pCreateInfos[i].pStages != nullptr) {
2758 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2759 // pTessellationState must not be NULL
2760 bool has_control = false;
2761 bool has_eval = false;
2762
2763 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2764 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2765 has_control = true;
2766 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2767 has_eval = true;
2768 }
2769 }
2770
2771 if (has_control && has_eval) {
2772 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2773 __LINE__, REQUIRED_PARAMETER, LayerName,
2774 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2775 "control shader stage and a tessellation evaluation shader stage, "
2776 "pCreateInfos[%d].pTessellationState must not be NULL",
2777 i, i);
2778 }
2779 }
2780 } else if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2781 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2782 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2783 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2784 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2785 i);
2786 }
2787
2788 if (pCreateInfos[i].pViewportState == nullptr) {
2789 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2790 // valid VkPipelineViewportStateCreateInfo structure
2791 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2792 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2793 skip_call |= log_msg(
2794 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2795 REQUIRED_PARAMETER, LayerName,
2796 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2797 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2798 i, i);
2799 }
2800 } else {
2801 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2802 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2803 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2804 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2805 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2806 i);
2807 }
2808
2809 if (pCreateInfos[i].pDynamicState != nullptr) {
2810 bool has_dynamic_viewport = false;
2811 bool has_dynamic_scissor = false;
2812
2813 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2814 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2815 has_dynamic_viewport = true;
2816 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2817 has_dynamic_scissor = true;
2818 }
2819 }
2820
2821 // viewportCount must be greater than 0
2822 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2823 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2824 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2825 __LINE__, REQUIRED_PARAMETER, LayerName,
2826 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2827 "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2828 "must be greater than 0",
2829 i, i);
2830 }
2831
2832 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2833 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2834 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2835 skip_call |=
2836 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2837 __LINE__, REQUIRED_PARAMETER, LayerName,
2838 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2839 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2840 i, i);
2841 }
2842
2843 // scissorCount must be greater than 0
2844 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2845 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2846 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2847 __LINE__, REQUIRED_PARAMETER, LayerName,
2848 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates "
2849 "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2850 "must be greater than 0",
2851 i, i);
2852 }
2853
2854 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2855 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2856 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2857 skip_call |=
2858 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2859 __LINE__, REQUIRED_PARAMETER, LayerName,
2860 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains "
2861 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2862 i, i);
2863 }
2864 }
2865 }
2866
2867 if (pCreateInfos[i].pMultisampleState == nullptr) {
2868 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2869 // a valid VkPipelineMultisampleStateCreateInfo structure
2870 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2871 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2872 skip_call |=
2873 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2874 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2875 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2876 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2877 i, i);
2878 }
2879 } else if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
2880 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2881 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2882 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
2883 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
2884 i);
2885 }
2886
2887 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
2888 if ((pCreateInfos[i].pDepthStencilState != nullptr) &&
2889 (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO)) {
2890 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2891 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2892 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
2893 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
2894 i);
2895 }
2896
2897 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
2898 if (pCreateInfos[i].pColorBlendState != nullptr) {
2899 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
2900 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2901 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2902 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
2903 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
2904 i);
2905 }
2906
2907 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
2908 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
2909 skip_call |= validate_ranged_enum(
2910 report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp",
2911 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
2912 }
2913 }
2914 }
2915 }
2916
2917 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002918 PreCreateGraphicsPipelines(device, pCreateInfos);
2919
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002920 result = get_dispatch_table(pc_device_table_map, device)
2921 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002922
Dustin Gravesc900f572016-05-16 11:07:59 -06002923 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002924 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002925
2926 return result;
2927}
2928
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002929bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002930 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2931
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002932 if (pCreateInfos != nullptr) {
2933 // TODO: Handle count!
2934 int i = 0;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06002935 validate_string(data->report_data, "vkCreateComputePipelines", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002936 }
2937
2938 return true;
2939}
2940
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002941VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2942vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2943 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
2944 VkPipeline *pPipelines) {
2945 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002946 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002947 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002948 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002949
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002950 skipCall |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002951 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002952
Dustin Graves080069b2016-04-05 13:48:15 -06002953 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002954 PreCreateComputePipelines(device, pCreateInfos);
2955
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002956 result = get_dispatch_table(pc_device_table_map, device)
2957 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002958
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002959 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002960 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002961
2962 return result;
2963}
2964
Dustin Graves27a912a2016-03-07 17:52:14 -07002965VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002966vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06002967 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002968 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002969 assert(my_data != NULL);
2970
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002971 skipCall |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002972
Dustin Graves080069b2016-04-05 13:48:15 -06002973 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002974 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002975 }
2976}
2977
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002978VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
2979vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
2980 VkPipelineLayout *pPipelineLayout) {
2981 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06002982 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002983 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002984 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002985
Mark Lobodzinski739391a2016-03-17 15:08:18 -06002986 skipCall |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002987
Dustin Graves080069b2016-04-05 13:48:15 -06002988 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002989 result =
2990 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002991
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002992 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002993 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002994
2995 return result;
2996}
2997
Dustin Graves27a912a2016-03-07 17:52:14 -07002998VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002999vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003000 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003001 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003002 assert(my_data != NULL);
3003
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003004 skipCall |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003005
Dustin Graves080069b2016-04-05 13:48:15 -06003006 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003007 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003008 }
3009}
3010
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003011VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3012 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
3013 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003014 bool skip_call = false;
3015 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3016 assert(device_data != NULL);
3017 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003018
Dustin Gravesc900f572016-05-16 11:07:59 -06003019 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003020
Dustin Gravesc900f572016-05-16 11:07:59 -06003021 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3022 if (pCreateInfo != nullptr) {
3023 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3024 if (pCreateInfo->compareEnable == VK_TRUE) {
3025 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3026 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3027 }
3028
3029 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3030 // valid VkBorderColor value
3031 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3032 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3033 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3034 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3035 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3036 }
3037 }
3038
3039 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003040 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3041
Dustin Gravesc900f572016-05-16 11:07:59 -06003042 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003043 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003044
3045 return result;
3046}
3047
Dustin Graves27a912a2016-03-07 17:52:14 -07003048VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003049vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003050 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003051 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003052 assert(my_data != NULL);
3053
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003054 skipCall |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003055
Dustin Graves080069b2016-04-05 13:48:15 -06003056 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003057 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003058 }
3059}
3060
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003061VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3062vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3063 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
3064 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003065 bool skip_call = false;
3066 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3067 assert(device_data != nullptr);
3068 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003069
Dustin Gravesc900f572016-05-16 11:07:59 -06003070 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003071
Dustin Gravesc900f572016-05-16 11:07:59 -06003072 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3073 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3074 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3075 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3076 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3077 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3078 // valid VkSampler handles
3079 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3080 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3081 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3082 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3083 ++descriptor_index) {
3084 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3085 skip_call |=
3086 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3087 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3088 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3089 " specified as VK_NULL_HANDLE",
3090 i, descriptor_index);
3091 }
3092 }
3093 }
3094
3095 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3096 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3097 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3098 skip_call |=
3099 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3100 UNRECOGNIZED_VALUE, LayerName,
3101 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3102 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3103 i, i);
3104 }
3105 }
3106 }
3107 }
3108
3109 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003110 result =
3111 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003112
Dustin Gravesc900f572016-05-16 11:07:59 -06003113 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003114 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003115
3116 return result;
3117}
3118
Dustin Graves27a912a2016-03-07 17:52:14 -07003119VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003120vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003121 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003122 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003123 assert(my_data != NULL);
3124
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003125 skipCall |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003126
Dustin Graves080069b2016-04-05 13:48:15 -06003127 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003128 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003129 }
3130}
3131
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003132VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3133vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3134 VkDescriptorPool *pDescriptorPool) {
3135 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003136 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003137 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003138 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003139
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003140 skipCall |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003141
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003142 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3143
Dustin Graves080069b2016-04-05 13:48:15 -06003144 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003145 result =
3146 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003147
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003148 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003149 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003150
3151 return result;
3152}
3153
Dustin Graves27a912a2016-03-07 17:52:14 -07003154VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003155vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003156 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003157 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003158 assert(my_data != NULL);
3159
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003160 skipCall |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003161
Dustin Graves080069b2016-04-05 13:48:15 -06003162 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003163 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003164 }
3165}
3166
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003167VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3168vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003169 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3170 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003171 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3172 assert(my_data != NULL);
3173
Dustin Graves20fd66f2016-04-18 18:33:21 -06003174 skipCall |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003175
Dustin Graves20fd66f2016-04-18 18:33:21 -06003176 if (!skipCall) {
3177 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3178
3179 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3180 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003181
3182 return result;
3183}
3184
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003185VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3186vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
3187 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003188 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003189 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003190 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003191
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003192 skipCall |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003193
Dustin Graves080069b2016-04-05 13:48:15 -06003194 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003195 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3196
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003197 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003198 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003199
3200 return result;
3201}
3202
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003203VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
3204 uint32_t descriptorSetCount,
3205 const VkDescriptorSet *pDescriptorSets) {
3206 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003207 bool skip_call = false;
3208 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3209 assert(device_data != nullptr);
3210 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003211
Dustin Gravesc900f572016-05-16 11:07:59 -06003212 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003213
Dustin Gravesc900f572016-05-16 11:07:59 -06003214 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3215 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3216 // validate_array()
3217 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3218 pDescriptorSets, true, true);
3219
3220 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003221 result = get_dispatch_table(pc_device_table_map, device)
3222 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003223
Dustin Gravesc900f572016-05-16 11:07:59 -06003224 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003225 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003226
3227 return result;
3228}
3229
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003230VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3231vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
3232 uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003233 bool skip_call = false;
3234 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3235 assert(device_data != NULL);
3236 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003237
Dustin Gravesc900f572016-05-16 11:07:59 -06003238 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3239 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003240
Dustin Gravesc900f572016-05-16 11:07:59 -06003241 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3242 if (pDescriptorWrites != NULL) {
3243 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3244 // descriptorCount must be greater than 0
3245 if (pDescriptorWrites[i].descriptorCount == 0) {
3246 skip_call |=
3247 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3248 REQUIRED_PARAMETER, LayerName,
3249 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3250 }
3251
3252 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3253 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3254 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3255 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3256 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3257 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3258 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3259 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3260 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3261 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3262 __LINE__, REQUIRED_PARAMETER, LayerName,
3263 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3264 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3265 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3266 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3267 i, i);
3268 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3269 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3270 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3271 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3272 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3273 ++descriptor_index) {
3274 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3275 "pDescriptorWrites[i].pImageInfo[i].imageView",
3276 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3277 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
3278 "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout",
3279 VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3280 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3281 }
3282 }
3283 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3284 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3285 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3286 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3287 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3288 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3289 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3290 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3291 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3292 __LINE__, REQUIRED_PARAMETER, LayerName,
3293 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3294 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3295 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3296 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3297 i, i);
3298 }
3299 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3300 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3301 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3302 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3303 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3304 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3305 __LINE__, REQUIRED_PARAMETER, LayerName,
3306 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3307 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3308 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3309 i, i);
3310 } else {
3311 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3312 ++descriptor_index) {
3313 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3314 "pDescriptorWrites[i].pTexelBufferView[i]",
3315 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3316 }
3317 }
3318 }
3319 }
3320 }
3321
3322 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003323 get_dispatch_table(pc_device_table_map, device)
3324 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003325 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003326}
3327
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003328VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3329 const VkAllocationCallbacks *pAllocator,
3330 VkFramebuffer *pFramebuffer) {
3331 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003332 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003333 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003334 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003335
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003336 skipCall |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003337
Dustin Graves080069b2016-04-05 13:48:15 -06003338 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003339 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3340
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003341 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003342 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003343
3344 return result;
3345}
3346
Dustin Graves27a912a2016-03-07 17:52:14 -07003347VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003348vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003349 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003350 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003351 assert(my_data != NULL);
3352
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003353 skipCall |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003354
Dustin Graves080069b2016-04-05 13:48:15 -06003355 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003356 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003357 }
3358}
3359
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003360VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3361 const VkAllocationCallbacks *pAllocator,
3362 VkRenderPass *pRenderPass) {
3363 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003364 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003365 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003366 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003367
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003368 skipCall |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003369
Dustin Graves080069b2016-04-05 13:48:15 -06003370 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003371 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3372
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003373 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003374 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003375
3376 return result;
3377}
3378
Dustin Graves27a912a2016-03-07 17:52:14 -07003379VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003380vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003381 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003382 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003383 assert(my_data != NULL);
3384
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003385 skipCall |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003386
Dustin Graves080069b2016-04-05 13:48:15 -06003387 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003388 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003389 }
3390}
3391
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003392VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3393vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Dustin Graves080069b2016-04-05 13:48:15 -06003394 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003395 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003396 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003397
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003398 skipCall |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003399
Dustin Graves080069b2016-04-05 13:48:15 -06003400 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003401 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003402 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003403}
3404
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003405VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3406 const VkAllocationCallbacks *pAllocator,
3407 VkCommandPool *pCommandPool) {
3408 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003409 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003410 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003411 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003412
Dustin Gravesde628532016-04-21 16:30:17 -06003413 skipCall |=
3414 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003415
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003416 skipCall |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003417
Dustin Graves080069b2016-04-05 13:48:15 -06003418 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003419 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3420
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003421 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003422 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003423
3424 return result;
3425}
3426
Dustin Graves27a912a2016-03-07 17:52:14 -07003427VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003428vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Dustin Graves080069b2016-04-05 13:48:15 -06003429 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003430 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003431 assert(my_data != NULL);
3432
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003433 skipCall |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003434
Dustin Graves080069b2016-04-05 13:48:15 -06003435 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003436 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003437 }
3438}
3439
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003440VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3441vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003442 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3443 bool skipCall = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003444 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3445 assert(my_data != NULL);
3446
Dustin Graves20fd66f2016-04-18 18:33:21 -06003447 skipCall |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003448
Dustin Graves20fd66f2016-04-18 18:33:21 -06003449 if (!skipCall) {
3450 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3451
3452 validate_result(my_data->report_data, "vkResetCommandPool", result);
3453 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003454
3455 return result;
3456}
3457
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003458VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3459vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
3460 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves080069b2016-04-05 13:48:15 -06003461 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003462 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003463 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003464
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003465 skipCall |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003466
Dustin Graves080069b2016-04-05 13:48:15 -06003467 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003468 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3469
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003470 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003471 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003472
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003473 return result;
3474}
3475
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003476VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
3477 uint32_t commandBufferCount,
3478 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003479 bool skip_call = false;
3480 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3481 assert(device_data != nullptr);
3482 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003483
Dustin Gravesc900f572016-05-16 11:07:59 -06003484 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003485
Dustin Gravesc900f572016-05-16 11:07:59 -06003486 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3487 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3488 // validate_array()
3489 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3490 pCommandBuffers, true, true);
3491
3492 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003493 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003494 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003495 }
3496}
3497
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003498VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3499vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3500 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003501 bool skip_call = false;
3502 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3503 assert(device_data != nullptr);
3504 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003505
Dustin Gravesc900f572016-05-16 11:07:59 -06003506 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003507
Dustin Gravesc900f572016-05-16 11:07:59 -06003508 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3509 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3510 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3511 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3512 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3513
3514 if (pBeginInfo->pInheritanceInfo != NULL) {
3515 // TODO: This only needs to be validated when the inherited queries feature is enabled
3516 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3517 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3518
3519 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3520 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3521 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3522 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3523 }
3524
3525 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003526 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3527
Dustin Gravesc900f572016-05-16 11:07:59 -06003528 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003529 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003530
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003531 return result;
3532}
3533
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003534VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003535 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3536 assert(my_data != NULL);
3537
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003538 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003539
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003540 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003541
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003542 return result;
3543}
3544
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003545VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
3546vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003547 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003548 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3549 assert(my_data != NULL);
3550
Dustin Graves16d18972016-05-09 17:36:57 -06003551 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003552
Dustin Graves16d18972016-05-09 17:36:57 -06003553 if (!skip_call) {
3554 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3555
3556 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3557 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003558
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003559 return result;
3560}
3561
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003562VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3563vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
Dustin Graves080069b2016-04-05 13:48:15 -06003564 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003565 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3566 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003567
Dustin Graves29148ff2016-03-23 19:44:00 -06003568 skipCall |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3569
Dustin Graves080069b2016-04-05 13:48:15 -06003570 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003571 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3572 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003573}
3574
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003575VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3576vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
Dustin Graves080069b2016-04-05 13:48:15 -06003577 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003578 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003579 assert(my_data != NULL);
3580
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003581 skipCall |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003582
Dustin Graves080069b2016-04-05 13:48:15 -06003583 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003584 get_dispatch_table(pc_device_table_map, commandBuffer)
3585 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003586 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003587}
3588
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003589VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3590vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) {
Dustin Graves080069b2016-04-05 13:48:15 -06003591 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003592 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003593 assert(my_data != NULL);
3594
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003595 skipCall |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003596
Dustin Graves080069b2016-04-05 13:48:15 -06003597 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003598 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3599 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003600}
3601
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003602VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003603 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003604}
3605
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003606VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3607vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) {
3608 get_dispatch_table(pc_device_table_map, commandBuffer)
3609 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003610}
3611
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003612VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Dustin Graves080069b2016-04-05 13:48:15 -06003613 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003614 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003615 assert(my_data != NULL);
3616
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003617 skipCall |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003618
Dustin Graves080069b2016-04-05 13:48:15 -06003619 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003620 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
3621 }
Cody Northrop12365112015-08-17 11:10:49 -06003622}
3623
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003624VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3625vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003626 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06003627}
3628
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003629VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3630vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003631 bool skipCall = false;
3632 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3633 assert(my_data != NULL);
3634
3635 skipCall |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
3636
3637 if (!skipCall) {
3638 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
3639 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003640}
3641
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003642VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3643vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Dustin Graves46948e62016-05-06 10:16:06 -06003644 bool skipCall = false;
3645 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3646 assert(my_data != NULL);
3647
3648 skipCall |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
3649
3650 if (!skipCall) {
3651 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
3652 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003653}
3654
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003655VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3656vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Dustin Graves46948e62016-05-06 10:16:06 -06003657 bool skipCall = false;
3658 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3659 assert(my_data != NULL);
3660
3661 skipCall |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
3662
3663 if (!skipCall) {
3664 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
3665 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003666}
3667
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003668VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3669vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
3670 uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
3671 uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003672 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003673 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003674 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003675
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003676 skipCall |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003677 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003678
Dustin Graves080069b2016-04-05 13:48:15 -06003679 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003680 get_dispatch_table(pc_device_table_map, commandBuffer)
3681 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
3682 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003683 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003684}
3685
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003686VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3687vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
Dustin Graves080069b2016-04-05 13:48:15 -06003688 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003689 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3690 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003691
Dustin Graves29148ff2016-03-23 19:44:00 -06003692 skipCall |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
3693
Dustin Graves080069b2016-04-05 13:48:15 -06003694 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003695 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
3696 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003697}
3698
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003699VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3700 uint32_t bindingCount, const VkBuffer *pBuffers,
3701 const VkDeviceSize *pOffsets) {
Dustin Graves080069b2016-04-05 13:48:15 -06003702 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003703 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003704 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003705
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003706 skipCall |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
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 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003711 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003712}
3713
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003714bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
3715 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06003716 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003717 // 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 -07003718 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003719 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3720 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003721 return false;
3722 }
3723
3724 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003725 // 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 -07003726 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06003727 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3728 REQUIRED_PARAMETER, "PARAMCHECK", "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06003729 return false;
3730 }
3731
3732 return true;
3733}
3734
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003735VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3736 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003737 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06003738
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003739 get_dispatch_table(pc_device_table_map, commandBuffer)
3740 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003741}
3742
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003743VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3744 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3745 uint32_t firstInstance) {
3746 get_dispatch_table(pc_device_table_map, commandBuffer)
3747 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003748}
3749
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003750VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3751vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003752 bool skipCall = false;
3753 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3754 assert(my_data != NULL);
3755
3756 skipCall |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
3757
3758 if (!skipCall) {
3759 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
3760 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003761}
3762
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003763VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3764vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003765 bool skipCall = false;
3766 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3767 assert(my_data != NULL);
3768
3769 skipCall |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
3770
3771 if (!skipCall) {
3772 get_dispatch_table(pc_device_table_map, commandBuffer)
3773 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
3774 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003775}
3776
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003777VK_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 -07003778 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003779}
3780
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003781VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3782vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003783 bool skipCall = false;
3784 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3785 assert(my_data != NULL);
3786
3787 skipCall |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
3788
3789 if (!skipCall) {
3790 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
3791 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003792}
3793
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003794VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
3795 uint32_t regionCount, const VkBufferCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003796 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003797 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003798 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003799
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003800 skipCall |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003801
Dustin Graves080069b2016-04-05 13:48:15 -06003802 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003803 get_dispatch_table(pc_device_table_map, commandBuffer)
3804 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003805 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003806}
3807
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003808bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
3809 if (pRegions != nullptr) {
3810 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3811 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003812 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3813 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003814 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3815 return false;
3816 }
3817 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3818 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003819 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3820 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003821 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3822 return false;
3823 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003824 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003825
3826 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003827}
3828
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003829VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3830vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3831 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003832 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003833 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003834 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003835
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003836 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003837 parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003838
Dustin Graves080069b2016-04-05 13:48:15 -06003839 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003840 PreCmdCopyImage(commandBuffer, pRegions);
3841
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003842 get_dispatch_table(pc_device_table_map, commandBuffer)
3843 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003844 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003845}
3846
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003847bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
3848 if (pRegions != nullptr) {
3849 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3850 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003851 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3852 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003853 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
3854 return false;
3855 }
3856 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3857 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003858 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3859 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003860 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
3861 return false;
3862 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003863 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003864
3865 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003866}
3867
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003868VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3869vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
3870 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Dustin Graves080069b2016-04-05 13:48:15 -06003871 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003872 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003873 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003874
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003875 skipCall |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003876 pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003877
Dustin Graves080069b2016-04-05 13:48:15 -06003878 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003879 PreCmdBlitImage(commandBuffer, pRegions);
3880
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003881 get_dispatch_table(pc_device_table_map, commandBuffer)
3882 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003883 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003884}
3885
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003886bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3887 if (pRegions != nullptr) {
3888 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3889 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003890 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3891 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003892 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3893 "enumerator");
3894 return false;
3895 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003896 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003897
3898 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003899}
3900
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003901VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
3902 VkImage dstImage, VkImageLayout dstImageLayout,
3903 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003904 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003905 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003906 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003907
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003908 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003909 parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003910
Dustin Graves080069b2016-04-05 13:48:15 -06003911 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003912 PreCmdCopyBufferToImage(commandBuffer, pRegions);
3913
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003914 get_dispatch_table(pc_device_table_map, commandBuffer)
3915 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003916 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003917}
3918
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003919bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
3920 if (pRegions != nullptr) {
3921 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
3922 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06003923 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3924 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003925 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
3926 "enumerator");
3927 return false;
3928 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003929 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003930
3931 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003932}
3933
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003934VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
3935 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
3936 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06003937 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003938 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003939 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003940
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003941 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003942 parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003943
Dustin Graves080069b2016-04-05 13:48:15 -06003944 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003945 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
3946
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003947 get_dispatch_table(pc_device_table_map, commandBuffer)
3948 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003949 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003950}
3951
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003952VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
3953 VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) {
Dustin Graves080069b2016-04-05 13:48:15 -06003954 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003955 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003956 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003957
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003958 skipCall |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003959
Dustin Graves080069b2016-04-05 13:48:15 -06003960 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003961 get_dispatch_table(pc_device_table_map, commandBuffer)
3962 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003963 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003964}
3965
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003966VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3967vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003968 bool skipCall = false;
3969 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3970 assert(my_data != NULL);
3971
3972 skipCall |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
3973
3974 if (!skipCall) {
3975 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
3976 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003977}
3978
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003979VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
3980 VkImageLayout imageLayout, const VkClearColorValue *pColor,
3981 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003982 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003983 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003984 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003985
Mark Lobodzinski739391a2016-03-17 15:08:18 -06003986 skipCall |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003987
Dustin Graves080069b2016-04-05 13:48:15 -06003988 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003989 get_dispatch_table(pc_device_table_map, commandBuffer)
3990 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003991 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003992}
3993
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003994VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
3995vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
3996 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
3997 const VkImageSubresourceRange *pRanges) {
Dustin Graves080069b2016-04-05 13:48:15 -06003998 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003999 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004000 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004001
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004002 skipCall |=
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004003 parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004004
Dustin Graves080069b2016-04-05 13:48:15 -06004005 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004006 get_dispatch_table(pc_device_table_map, commandBuffer)
4007 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004008 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004009}
4010
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004011VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4012 const VkClearAttachment *pAttachments, uint32_t rectCount,
4013 const VkClearRect *pRects) {
Dustin Graves080069b2016-04-05 13:48:15 -06004014 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004015 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004016 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004017
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004018 skipCall |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004019
Dustin Graves080069b2016-04-05 13:48:15 -06004020 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004021 get_dispatch_table(pc_device_table_map, commandBuffer)
4022 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004023 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004024}
4025
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004026bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4027 if (pRegions != nullptr) {
4028 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4029 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4030 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004031 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4032 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004033 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4034 return false;
4035 }
4036 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4037 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4038 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004039 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4040 UNRECOGNIZED_VALUE, "PARAMCHECK",
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004041 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4042 return false;
4043 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004044 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004045
4046 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004047}
4048
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004049VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4050vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
4051 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) {
Dustin Graves080069b2016-04-05 13:48:15 -06004052 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004053 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004054 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004055
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004056 skipCall |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004057 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004058
Dustin Graves080069b2016-04-05 13:48:15 -06004059 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004060 PreCmdResolveImage(commandBuffer, pRegions);
4061
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004062 get_dispatch_table(pc_device_table_map, commandBuffer)
4063 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004064 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004065}
4066
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004067VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4068vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004069 bool skipCall = false;
4070 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4071 assert(my_data != NULL);
4072
4073 skipCall |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
4074
4075 if (!skipCall) {
4076 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4077 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004078}
4079
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004080VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4081vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004082 bool skipCall = false;
4083 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4084 assert(my_data != NULL);
4085
4086 skipCall |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
4087
4088 if (!skipCall) {
4089 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4090 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004091}
4092
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004093VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4094vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask,
4095 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4096 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4097 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004098 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004099 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004100 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004101
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004102 skipCall |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004103 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4104 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004105
Dustin Graves080069b2016-04-05 13:48:15 -06004106 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004107 get_dispatch_table(pc_device_table_map, commandBuffer)
4108 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4109 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004110 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004111}
4112
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004113VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4114vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4115 VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4116 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4117 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Dustin Graves080069b2016-04-05 13:48:15 -06004118 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004119 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004120 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004121
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004122 skipCall |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004123 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4124 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004125
Dustin Graves080069b2016-04-05 13:48:15 -06004126 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004127 get_dispatch_table(pc_device_table_map, commandBuffer)
4128 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4129 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004130 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004131}
4132
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004133VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4134vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004135 bool skipCall = false;
4136 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4137 assert(my_data != NULL);
4138
4139 skipCall |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
4140
4141 if (!skipCall) {
4142 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4143 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004144}
4145
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004146VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004147 bool skipCall = false;
4148 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4149 assert(my_data != NULL);
4150
4151 skipCall |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
4152
4153 if (!skipCall) {
4154 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4155 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004156}
4157
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004158VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4159vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004160 bool skipCall = false;
4161 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4162 assert(my_data != NULL);
4163
4164 skipCall |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
4165
4166 if (!skipCall) {
4167 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4168 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004169}
4170
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004171bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4172 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004173
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004174 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004175
4176 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004177}
4178
Dustin Graves20fd66f2016-04-18 18:33:21 -06004179VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4180 VkQueryPool queryPool, uint32_t query) {
4181 bool skipCall = false;
4182 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4183 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004184
Dustin Graves20fd66f2016-04-18 18:33:21 -06004185 skipCall |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
4186
4187 if (!skipCall) {
4188 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4189
4190 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4191 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004192}
4193
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004194VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4195vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
4196 VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004197 bool skipCall = false;
4198 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4199 assert(my_data != NULL);
4200
4201 skipCall |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4202 dstOffset, stride, flags);
4203
4204 if (!skipCall) {
4205 get_dispatch_table(pc_device_table_map, commandBuffer)
4206 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4207 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004208}
4209
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004210VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
4211 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
4212 const void *pValues) {
Dustin Graves080069b2016-04-05 13:48:15 -06004213 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004214 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004215 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004216
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004217 skipCall |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004218
Dustin Graves080069b2016-04-05 13:48:15 -06004219 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004220 get_dispatch_table(pc_device_table_map, commandBuffer)
4221 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004222 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004223}
4224
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004225VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4226vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004227 bool skipCall = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004228 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004229 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004230
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004231 skipCall |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004232
Dustin Graves080069b2016-04-05 13:48:15 -06004233 if (!skipCall) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004234 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004235 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004236}
4237
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004238VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Dustin Graves080069b2016-04-05 13:48:15 -06004239 bool skipCall = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004240 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4241 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004242
Dustin Graves29148ff2016-03-23 19:44:00 -06004243 skipCall |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
4244
Dustin Graves080069b2016-04-05 13:48:15 -06004245 if (!skipCall) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004246 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4247 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004248}
4249
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004250VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004251 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004252}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004253
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004254VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
4255vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
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 Hayes359eeb92015-07-09 17:11:25 -06004259
Mark Lobodzinski739391a2016-03-17 15:08:18 -06004260 skipCall |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004261
Dustin Graves080069b2016-04-05 13:48:15 -06004262 if (!skipCall) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004263 get_dispatch_table(pc_device_table_map, commandBuffer)
4264 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004265 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004266}
4267
Chia-I Wu99f701c2016-05-13 14:06:08 +08004268VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4269 const char *pLayerName, uint32_t *pCount,
4270 VkExtensionProperties *pProperties) {
4271 /* parameter_validation does not have any physical device extensions */
4272 if (pLayerName == NULL) {
4273 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4274 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
4275 } else {
4276 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
4277 }
4278}
4279
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004280VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004281 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4282
Dustin Graves080069b2016-04-05 13:48:15 -06004283 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004284 return NULL;
4285 }
4286
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004287 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004288 return (PFN_vkVoidFunction)vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004289 if (!strcmp(funcName, "vkDestroyDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004290 return (PFN_vkVoidFunction)vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004291 if (!strcmp(funcName, "vkGetDeviceQueue"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004292 return (PFN_vkVoidFunction)vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004293 if (!strcmp(funcName, "vkQueueSubmit"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004294 return (PFN_vkVoidFunction)vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004295 if (!strcmp(funcName, "vkQueueWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004296 return (PFN_vkVoidFunction)vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004297 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004298 return (PFN_vkVoidFunction)vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004299 if (!strcmp(funcName, "vkAllocateMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004300 return (PFN_vkVoidFunction)vkAllocateMemory;
Dustin Graves27a912a2016-03-07 17:52:14 -07004301 if (!strcmp(funcName, "vkFreeMemory"))
4302 return (PFN_vkVoidFunction)vkFreeMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004303 if (!strcmp(funcName, "vkMapMemory"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004304 return (PFN_vkVoidFunction)vkMapMemory;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004305 if (!strcmp(funcName, "vkUnmapMemory"))
4306 return (PFN_vkVoidFunction)vkUnmapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004307 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004308 return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004309 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004310 return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004311 if (!strcmp(funcName, "vkGetDeviceMemoryCommitment"))
4312 return (PFN_vkVoidFunction)vkGetDeviceMemoryCommitment;
4313 if (!strcmp(funcName, "vkBindBufferMemory"))
4314 return (PFN_vkVoidFunction)vkBindBufferMemory;
4315 if (!strcmp(funcName, "vkBindImageMemory"))
4316 return (PFN_vkVoidFunction)vkBindImageMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004317 if (!strcmp(funcName, "vkCreateFence"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004318 return (PFN_vkVoidFunction)vkCreateFence;
Dustin Graves27a912a2016-03-07 17:52:14 -07004319 if (!strcmp(funcName, "vkDestroyFence"))
4320 return (PFN_vkVoidFunction)vkDestroyFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004321 if (!strcmp(funcName, "vkResetFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004322 return (PFN_vkVoidFunction)vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004323 if (!strcmp(funcName, "vkGetFenceStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004324 return (PFN_vkVoidFunction)vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004325 if (!strcmp(funcName, "vkWaitForFences"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004326 return (PFN_vkVoidFunction)vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004327 if (!strcmp(funcName, "vkCreateSemaphore"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004328 return (PFN_vkVoidFunction)vkCreateSemaphore;
Dustin Graves27a912a2016-03-07 17:52:14 -07004329 if (!strcmp(funcName, "vkDestroySemaphore"))
4330 return (PFN_vkVoidFunction)vkDestroySemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004331 if (!strcmp(funcName, "vkCreateEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004332 return (PFN_vkVoidFunction)vkCreateEvent;
Dustin Graves27a912a2016-03-07 17:52:14 -07004333 if (!strcmp(funcName, "vkDestroyEvent"))
4334 return (PFN_vkVoidFunction)vkDestroyEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004335 if (!strcmp(funcName, "vkGetEventStatus"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004336 return (PFN_vkVoidFunction)vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004337 if (!strcmp(funcName, "vkSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004338 return (PFN_vkVoidFunction)vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004339 if (!strcmp(funcName, "vkResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004340 return (PFN_vkVoidFunction)vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004341 if (!strcmp(funcName, "vkCreateQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004342 return (PFN_vkVoidFunction)vkCreateQueryPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07004343 if (!strcmp(funcName, "vkDestroyQueryPool"))
4344 return (PFN_vkVoidFunction)vkDestroyQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004345 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004346 return (PFN_vkVoidFunction)vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004347 if (!strcmp(funcName, "vkCreateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004348 return (PFN_vkVoidFunction)vkCreateBuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07004349 if (!strcmp(funcName, "vkDestroyBuffer"))
4350 return (PFN_vkVoidFunction)vkDestroyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004351 if (!strcmp(funcName, "vkCreateBufferView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004352 return (PFN_vkVoidFunction)vkCreateBufferView;
Dustin Graves27a912a2016-03-07 17:52:14 -07004353 if (!strcmp(funcName, "vkDestroyBufferView"))
4354 return (PFN_vkVoidFunction)vkDestroyBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004355 if (!strcmp(funcName, "vkCreateImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004356 return (PFN_vkVoidFunction)vkCreateImage;
Dustin Graves27a912a2016-03-07 17:52:14 -07004357 if (!strcmp(funcName, "vkDestroyImage"))
4358 return (PFN_vkVoidFunction)vkDestroyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004359 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004360 return (PFN_vkVoidFunction)vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004361 if (!strcmp(funcName, "vkCreateImageView"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004362 return (PFN_vkVoidFunction)vkCreateImageView;
Dustin Graves27a912a2016-03-07 17:52:14 -07004363 if (!strcmp(funcName, "vkDestroyImageView"))
4364 return (PFN_vkVoidFunction)vkDestroyImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05004365 if (!strcmp(funcName, "vkCreateShaderModule"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004366 return (PFN_vkVoidFunction)vkCreateShaderModule;
Dustin Graves27a912a2016-03-07 17:52:14 -07004367 if (!strcmp(funcName, "vkDestroyShaderModule"))
4368 return (PFN_vkVoidFunction)vkDestroyShaderModule;
4369 if (!strcmp(funcName, "vkCreatePipelineCache"))
4370 return (PFN_vkVoidFunction)vkCreatePipelineCache;
4371 if (!strcmp(funcName, "vkDestroyPipelineCache"))
4372 return (PFN_vkVoidFunction)vkDestroyPipelineCache;
4373 if (!strcmp(funcName, "vkGetPipelineCacheData"))
4374 return (PFN_vkVoidFunction)vkGetPipelineCacheData;
4375 if (!strcmp(funcName, "vkMergePipelineCaches"))
4376 return (PFN_vkVoidFunction)vkMergePipelineCaches;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004377 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004378 return (PFN_vkVoidFunction)vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06004379 if (!strcmp(funcName, "vkCreateComputePipelines"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004380 return (PFN_vkVoidFunction)vkCreateComputePipelines;
Dustin Graves27a912a2016-03-07 17:52:14 -07004381 if (!strcmp(funcName, "vkDestroyPipeline"))
4382 return (PFN_vkVoidFunction)vkDestroyPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004383 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004384 return (PFN_vkVoidFunction)vkCreatePipelineLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07004385 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
4386 return (PFN_vkVoidFunction)vkDestroyPipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004387 if (!strcmp(funcName, "vkCreateSampler"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004388 return (PFN_vkVoidFunction)vkCreateSampler;
Dustin Graves27a912a2016-03-07 17:52:14 -07004389 if (!strcmp(funcName, "vkDestroySampler"))
4390 return (PFN_vkVoidFunction)vkDestroySampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004391 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004392 return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout;
Dustin Graves27a912a2016-03-07 17:52:14 -07004393 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
4394 return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004395 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004396 return (PFN_vkVoidFunction)vkCreateDescriptorPool;
Dustin Graves27a912a2016-03-07 17:52:14 -07004397 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
4398 return (PFN_vkVoidFunction)vkDestroyDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004399 if (!strcmp(funcName, "vkResetDescriptorPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004400 return (PFN_vkVoidFunction)vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004401 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004402 return (PFN_vkVoidFunction)vkAllocateDescriptorSets;
Tobin Ehlisb55bc272016-05-17 10:38:45 -06004403 if (!strcmp(funcName, "vkFreeDescriptorSets"))
4404 return (PFN_vkVoidFunction)vkFreeDescriptorSets;
4405 if (!strcmp(funcName, "vkUpdateDescriptorSets"))
4406 return (PFN_vkVoidFunction)vkUpdateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004407 if (!strcmp(funcName, "vkCmdSetViewport"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004408 return (PFN_vkVoidFunction)vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004409 if (!strcmp(funcName, "vkCmdSetScissor"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004410 return (PFN_vkVoidFunction)vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004411 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004412 return (PFN_vkVoidFunction)vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004413 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004414 return (PFN_vkVoidFunction)vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004415 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004416 return (PFN_vkVoidFunction)vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004417 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004418 return (PFN_vkVoidFunction)vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004419 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004420 return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004421 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004422 return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06004423 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004424 return (PFN_vkVoidFunction)vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004425 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004426 return (PFN_vkVoidFunction)vkAllocateCommandBuffers;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004427 if (!strcmp(funcName, "vkFreeCommandBuffers"))
4428 return (PFN_vkVoidFunction)vkFreeCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004429 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004430 return (PFN_vkVoidFunction)vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004431 if (!strcmp(funcName, "vkEndCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004432 return (PFN_vkVoidFunction)vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004433 if (!strcmp(funcName, "vkResetCommandBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004434 return (PFN_vkVoidFunction)vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004435 if (!strcmp(funcName, "vkCmdBindPipeline"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004436 return (PFN_vkVoidFunction)vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004437 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004438 return (PFN_vkVoidFunction)vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004439 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004440 return (PFN_vkVoidFunction)vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004441 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004442 return (PFN_vkVoidFunction)vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004443 if (!strcmp(funcName, "vkCmdDraw"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004444 return (PFN_vkVoidFunction)vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004445 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004446 return (PFN_vkVoidFunction)vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004447 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004448 return (PFN_vkVoidFunction)vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004449 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004450 return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004451 if (!strcmp(funcName, "vkCmdDispatch"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004452 return (PFN_vkVoidFunction)vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004453 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004454 return (PFN_vkVoidFunction)vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004455 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004456 return (PFN_vkVoidFunction)vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004457 if (!strcmp(funcName, "vkCmdCopyImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004458 return (PFN_vkVoidFunction)vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004459 if (!strcmp(funcName, "vkCmdBlitImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004460 return (PFN_vkVoidFunction)vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004461 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004462 return (PFN_vkVoidFunction)vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004463 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004464 return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004465 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004466 return (PFN_vkVoidFunction)vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004467 if (!strcmp(funcName, "vkCmdFillBuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004468 return (PFN_vkVoidFunction)vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004469 if (!strcmp(funcName, "vkCmdClearColorImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004470 return (PFN_vkVoidFunction)vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004471 if (!strcmp(funcName, "vkCmdResolveImage"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004472 return (PFN_vkVoidFunction)vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004473 if (!strcmp(funcName, "vkCmdSetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004474 return (PFN_vkVoidFunction)vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004475 if (!strcmp(funcName, "vkCmdResetEvent"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004476 return (PFN_vkVoidFunction)vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004477 if (!strcmp(funcName, "vkCmdWaitEvents"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004478 return (PFN_vkVoidFunction)vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004479 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004480 return (PFN_vkVoidFunction)vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004481 if (!strcmp(funcName, "vkCmdBeginQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004482 return (PFN_vkVoidFunction)vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004483 if (!strcmp(funcName, "vkCmdEndQuery"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004484 return (PFN_vkVoidFunction)vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004485 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004486 return (PFN_vkVoidFunction)vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004487 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004488 return (PFN_vkVoidFunction)vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004489 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004490 return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004491 if (!strcmp(funcName, "vkCreateFramebuffer"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004492 return (PFN_vkVoidFunction)vkCreateFramebuffer;
Dustin Graves27a912a2016-03-07 17:52:14 -07004493 if (!strcmp(funcName, "vkDestroyFramebuffer"))
4494 return (PFN_vkVoidFunction)vkDestroyFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004495 if (!strcmp(funcName, "vkCreateRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004496 return (PFN_vkVoidFunction)vkCreateRenderPass;
Dustin Graves27a912a2016-03-07 17:52:14 -07004497 if (!strcmp(funcName, "vkDestroyRenderPass"))
4498 return (PFN_vkVoidFunction)vkDestroyRenderPass;
4499 if (!strcmp(funcName, "vkGetRenderAreaGranularity"))
4500 return (PFN_vkVoidFunction)vkGetRenderAreaGranularity;
4501 if (!strcmp(funcName, "vkCreateCommandPool"))
4502 return (PFN_vkVoidFunction)vkCreateCommandPool;
4503 if (!strcmp(funcName, "vkDestroyCommandPool"))
4504 return (PFN_vkVoidFunction)vkDestroyCommandPool;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004505 if (!strcmp(funcName, "vkResetCommandPool"))
4506 return (PFN_vkVoidFunction)vkResetCommandPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004507 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004508 return (PFN_vkVoidFunction)vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08004509 if (!strcmp(funcName, "vkCmdNextSubpass"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004510 return (PFN_vkVoidFunction)vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06004511
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004512 if (device == NULL) {
4513 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004514 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004515
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004516 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004517 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004518 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004519}
4520
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004521VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004522 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004523 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004524 if (!strcmp(funcName, "vkCreateInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004525 return (PFN_vkVoidFunction)vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004526 if (!strcmp(funcName, "vkDestroyInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004527 return (PFN_vkVoidFunction)vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004528 if (!strcmp(funcName, "vkCreateDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004529 return (PFN_vkVoidFunction)vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004530 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004531 return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004532 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004533 return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004534 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004535 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06004536 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004537 return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties;
Dustin Graves16d18972016-05-09 17:36:57 -06004538 if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties"))
4539 return (PFN_vkVoidFunction)vkGetPhysicalDeviceImageFormatProperties;
4540 if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties"))
4541 return (PFN_vkVoidFunction)vkGetPhysicalDeviceSparseImageFormatProperties;
4542 if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties"))
4543 return (PFN_vkVoidFunction)vkGetPhysicalDeviceQueueFamilyProperties;
4544 if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties"))
4545 return (PFN_vkVoidFunction)vkGetPhysicalDeviceMemoryProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004546 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004547 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004548 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004549 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004550 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004551 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06004552 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004553 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004554
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004555 if (instance == NULL) {
4556 return NULL;
4557 }
4558
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004559 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004560
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004561 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004562 if (fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06004563 return fptr;
4564
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004565 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07004566 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004567 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004568}
Chia-I Wu99f701c2016-05-13 14:06:08 +08004569
4570VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4571vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
4572 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4573}
4574
4575VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4576vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
4577 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
4578}
4579
4580VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
4581vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
4582
4583 /* parameter_validation's physical device layers are the same as global */
4584 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties);
4585}