blob: 1306217f457ace87fa73610a8614ccdf4b1a445b [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
Dustin Graves8ffbbf62016-07-22 13:19:46 -060050#include "parameter_name.h"
Mark Lobodzinski739391a2016-03-17 15:08:18 -060051#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070052
Chia-I Wu1a6b1932016-05-13 14:07:36 +080053namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060054
Cody Northrop55443ef2015-09-28 15:09:32 -060055struct layer_data {
Chia-I Wua570b7c2016-05-16 07:48:14 +080056 VkInstance instance;
57
Jeremy Hayes99a96322015-06-26 12:48:09 -060058 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070059 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060060
Ian Elliotted6b5ac2016-04-28 09:08:13 -060061 // The following are for keeping track of the temporary callbacks that can
62 // be used in vkCreateInstance and vkDestroyInstance:
63 uint32_t num_tmp_callbacks;
64 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
65 VkDebugReportCallbackEXT *tmp_callbacks;
66
Jon Ashburn5484e0c2016-03-08 17:48:44 -070067 // TODO: Split instance/device structs
68 // Device Data
69 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060070 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Mark Lobodzinskia4932512016-06-27 15:13:00 -060071 VkPhysicalDeviceLimits device_limits;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060072 VkPhysicalDeviceFeatures physical_device_features;
73 VkPhysicalDevice physical_device;
Michael Lentinebdf744f2016-01-27 15:43:43 -060074
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060075 bool wsi_enabled;
Mark Youngead9b932016-09-08 12:28:38 -060076 bool wsi_display_swapchain_enabled;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -060077
Mark Lobodzinskia4932512016-06-27 15:13:00 -060078 layer_data()
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -060079 : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr), device_limits{},
Mark Youngead9b932016-09-08 12:28:38 -060080 physical_device_features{}, physical_device{}, wsi_enabled(false), wsi_display_swapchain_enabled(false) {};
Cody Northrop55443ef2015-09-28 15:09:32 -060081};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050082
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060083static std::unordered_map<void *, struct instance_extension_enables> instance_extension_map;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070084static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060085static device_table_map pc_device_table_map;
86static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060087
Jeremy Hayes99a96322015-06-26 12:48:09 -060088// "my instance data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070089debug_report_data *mid(VkInstance object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060090 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060091 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060092#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -060093 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 -060094#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060095 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060096
97 return data->report_data;
98}
99
100// "my device data"
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700101debug_report_data *mdd(void *object) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600102 dispatch_key key = get_dispatch_key(object);
103 layer_data *data = get_my_data_ptr(key, layer_data_map);
104#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -0600105 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 -0600106#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -0600107 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600108 return data->report_data;
109}
110
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600111static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600112
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600113 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600114}
115
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600116VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
117 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
118 const VkAllocationCallbacks *pAllocator,
119 VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700120 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700121 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600122
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700123 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700124 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600125 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600126 }
127
128 return result;
129}
130
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600131VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800132 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700133 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700134 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600135
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700136 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700137 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600138}
139
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600140VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
141 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
142 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700143 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
144 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700145}
146
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700147static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600148
Chia-I Wu3384db82016-05-16 07:30:58 +0800149static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600150 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800151};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700152
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700153static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600154 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700155 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
156 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
157 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
158 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
159 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 -0700160 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700161 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600162 return false;
163 }
164
165 return true;
166}
167
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700168static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
169 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600170 return "unrecognized enumerator";
171 }
172
173 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700174 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600175 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
176 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700177 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600178 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
179 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700180 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600181 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
182 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700183 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600184 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
185 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700186 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600187 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
188 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700189 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600190 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
191 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700192 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600193 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
194 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700195 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600196 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
197 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700198 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600199 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
200 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700201 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600202 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
203 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700204 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800205 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600206 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700207 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800208 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600209 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700210 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700211 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
212 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600213
214 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700215 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600216 enumeratorString += string;
217
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700218 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600219 enumeratorString += '|';
220 }
221 }
222
223 return enumeratorString;
224}
225
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700226static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
227 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
228 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
229 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
230 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
231 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600232 return false;
233 }
234
235 return true;
236}
237
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700238static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
239 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600240 return "unrecognized enumerator";
241 }
242
243 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700244 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600245 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
246 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700247 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600248 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700250 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600251 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
252 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700253 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600254 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
255 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700256 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600257 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
258 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700259 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800260 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600261 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700262 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600263 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
264 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700265 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800266 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600267 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600268
269 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700270 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600271 enumeratorString += string;
272
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700273 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600274 enumeratorString += '|';
275 }
276 }
277
278 return enumeratorString;
279}
280
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700281static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
282 VkQueueFlagBits allFlags =
283 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
284 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600285 return false;
286 }
287
288 return true;
289}
290
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700291static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
292 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600293 return "unrecognized enumerator";
294 }
295
296 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700297 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800298 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600299 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700300 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600301 strings.push_back("VK_QUEUE_COMPUTE_BIT");
302 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700303 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800304 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600305 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700306 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600307 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
308 }
309
310 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700311 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600312 enumeratorString += string;
313
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700314 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600315 enumeratorString += '|';
316 }
317 }
318
319 return enumeratorString;
320}
321
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700322static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
323 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
324 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
325 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
326 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600327 return false;
328 }
329
330 return true;
331}
332
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700333static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
334 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600335 return "unrecognized enumerator";
336 }
337
338 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700339 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600340 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
341 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700342 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800343 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600344 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700345 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600346 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
347 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700348 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800349 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600350 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700351 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800352 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600353 }
354
355 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700356 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600357 enumeratorString += string;
358
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700359 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600360 enumeratorString += '|';
361 }
362 }
363
364 return enumeratorString;
365}
366
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700367static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700368 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700369 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600370 return false;
371 }
372
373 return true;
374}
375
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700376static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
377 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600378 return "unrecognized enumerator";
379 }
380
381 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700382 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800383 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600384 }
385
386 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700387 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600388 enumeratorString += string;
389
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700390 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600391 enumeratorString += '|';
392 }
393 }
394
395 return enumeratorString;
396}
397
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700398static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
399 VkSparseImageFormatFlagBits allFlags =
400 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
401 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
402 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600403 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600404 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600405
406 return true;
407}
408
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700409static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
410 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600411 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600412 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600413
414 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700415 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800416 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600417 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700418 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800419 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600420 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700421 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800422 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600423 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600424
425 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700426 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600427 enumeratorString += string;
428
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700429 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600430 enumeratorString += '|';
431 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600432 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600433
434 return enumeratorString;
435}
436
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700437static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700438 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700439 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600440 return false;
441 }
442
443 return true;
444}
445
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700446static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
447 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600448 return "unrecognized enumerator";
449 }
450
451 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700452 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600453 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
454 }
455
456 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700457 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600458 enumeratorString += string;
459
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700460 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600461 enumeratorString += '|';
462 }
463 }
464
465 return enumeratorString;
466}
467
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700468static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
469 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
470 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
471 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
472 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
473 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600474 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
475 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
476 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700477 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600478 return false;
479 }
480
481 return true;
482}
483
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700484static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
485 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600486 return "unrecognized enumerator";
487 }
488
489 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700490 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700491 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_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_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700494 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600495 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700496 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700497 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600498 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700499 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700500 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600501 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700502 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700503 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_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_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700506 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600507 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700508 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700509 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600510 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700511 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700512 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600513 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700514 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700515 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600516 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700517 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700518 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600519 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700520 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700521 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600522 }
523
524 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700525 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600526 enumeratorString += string;
527
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700528 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600529 enumeratorString += '|';
530 }
531 }
532
533 return enumeratorString;
534}
535
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700536static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
537 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
538 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
539 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600540 return false;
541 }
542
543 return true;
544}
545
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700546static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
547 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600548 return "unrecognized enumerator";
549 }
550
551 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700552 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600553 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
554 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700555 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600556 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
557 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700558 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600559 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
560 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700561 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600562 strings.push_back("VK_QUERY_RESULT_64_BIT");
563 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600564
565 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700566 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600567 enumeratorString += string;
568
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700569 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600570 enumeratorString += '|';
571 }
572 }
573
574 return enumeratorString;
575}
576
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700577static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
578 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
579 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
580 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
581 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
582 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600583 return false;
584 }
585
586 return true;
587}
588
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700589static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
590 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600591 return "unrecognized enumerator";
592 }
593
594 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700595 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600596 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
597 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700598 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600599 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
600 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700601 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600602 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
603 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700604 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600605 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
606 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700607 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600608 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
609 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700610 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800611 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600612 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700613 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600614 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
615 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700616 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800617 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600618 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700619 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600620 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
621 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600622
623 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700624 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600625 enumeratorString += string;
626
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700627 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600628 enumeratorString += '|';
629 }
630 }
631
632 return enumeratorString;
633}
634
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700635static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
636 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
637 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
638 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600639 return false;
640 }
641
642 return true;
643}
644
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700645static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
646 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600647 return "unrecognized enumerator";
648 }
649
650 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700651 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600652 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
653 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700654 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600655 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
656 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700657 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600658 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600659 }
660
661 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700662 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600663 enumeratorString += string;
664
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700665 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600666 enumeratorString += '|';
667 }
668 }
669
670 return enumeratorString;
671}
672
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700673static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
674 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
675 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
676 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
677 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600678 return false;
679 }
680
681 return true;
682}
683
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700684static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
685 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600686 return "unrecognized enumerator";
687 }
688
689 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700690 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600691 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
692 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700693 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600694 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
695 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700696 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600697 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
698 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700699 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600700 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
701 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700702 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600703 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600704 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600705
706 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700707 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600708 enumeratorString += string;
709
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700710 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600711 enumeratorString += '|';
712 }
713 }
714
715 return enumeratorString;
716}
717
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700718static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
719 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
720 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
721 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600722 return false;
723 }
724
725 return true;
726}
727
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700728static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
729 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600730 return "unrecognized enumerator";
731 }
732
733 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700734 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800735 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600736 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700737 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800738 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600739 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700740 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800741 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600742 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700743 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800744 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600745 }
746
747 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700748 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600749 enumeratorString += string;
750
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700751 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600752 enumeratorString += '|';
753 }
754 }
755
756 return enumeratorString;
757}
758
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700759static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
760 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
761 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
762 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600763 return false;
764 }
765
766 return true;
767}
768
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700769static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
770 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600771 return "unrecognized enumerator";
772 }
773
774 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700775 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600776 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
777 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700778 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600779 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
780 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700781 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600782 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600783 }
784
785 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700786 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600787 enumeratorString += string;
788
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700789 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600790 enumeratorString += '|';
791 }
792 }
793
794 return enumeratorString;
795}
796
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700797static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
798 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
799 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
800 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
801 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600802 return false;
803 }
804
805 return true;
806}
807
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700808static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
809 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600810 return "unrecognized enumerator";
811 }
812
813 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700814 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600815 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600816 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700817 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600818 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600819 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700820 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600821 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
822 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700823 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600824 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
825 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700826 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600827 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600828 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700829 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600830 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600831 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700832 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600833 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600834 }
835
836 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700837 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600838 enumeratorString += string;
839
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700840 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600841 enumeratorString += '|';
842 }
843 }
844
845 return enumeratorString;
846}
847
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700848static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800849 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700850 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
851 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
852 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
853 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
854 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
855 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 -0700856 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700857 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600858 return false;
859 }
860
861 return true;
862}
863
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700864static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
865 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600866 return "unrecognized enumerator";
867 }
868
869 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700870 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800871 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
872 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700873 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800874 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600875 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700876 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600877 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600878 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700879 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600880 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600881 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700882 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600883 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600884 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700885 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700886 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600887 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700888 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600889 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600890 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700891 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600892 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600893 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700894 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600895 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600896 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700897 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600898 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600899 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700900 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600901 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
902 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700903 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600904 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
905 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700906 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700907 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600908 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700909 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600910 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
911 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700912 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600913 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
914 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700915 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600916 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
917 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700918 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600919 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600920 }
921
922 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700923 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600924 enumeratorString += string;
925
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700926 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600927 enumeratorString += '|';
928 }
929 }
930
931 return enumeratorString;
932}
933
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700934static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800935 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700936 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
937 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
938 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
939 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
940 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 +0800941
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700942 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600943 return false;
944 }
945
946 return true;
947}
948
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700949static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
950 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600951 return "unrecognized enumerator";
952 }
953
954 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700955 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800956 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600957 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700958 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800959 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600960 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700961 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800962 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600963 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700964 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800965 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600966 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700967 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800968 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600969 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700970 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800971 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600972 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700973 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800974 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600975 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700976 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800977 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600978 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700979 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800980 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600981 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700982 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800983 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600984 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700985 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800986 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600987 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700988 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800989 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600990 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700991 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800992 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600993 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700994 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800995 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600996 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700997 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800998 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600999 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001000 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001001 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001002 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001003 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001004 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001005 }
1006
1007 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001008 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001009 enumeratorString += string;
1010
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001011 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001012 enumeratorString += '|';
1013 }
1014 }
1015
1016 return enumeratorString;
1017}
1018
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001019static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1020 VkCommandPoolCreateFlagBits allFlags =
1021 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1022 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001023 return false;
1024 }
1025
1026 return true;
1027}
1028
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001029static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1030 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001031 return "unrecognized enumerator";
1032 }
1033
1034 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001035 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001036 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001037 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001038 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001039 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001040 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001041
1042 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001043 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001044 enumeratorString += string;
1045
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001046 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001047 enumeratorString += '|';
1048 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001049 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001050
1051 return enumeratorString;
1052}
1053
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001054static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001055 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001056 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001057 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001058 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001059
1060 return true;
1061}
1062
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001063static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1064 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001065 return "unrecognized enumerator";
1066 }
1067
1068 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001069 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001070 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001071 }
1072
1073 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001074 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001075 enumeratorString += string;
1076
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001077 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001078 enumeratorString += '|';
1079 }
1080 }
1081
1082 return enumeratorString;
1083}
1084
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001085static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1086 VkCommandBufferUsageFlags allFlags =
1087 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1088 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1089 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001090 return false;
1091 }
1092
1093 return true;
1094}
1095
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001096static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1097 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001098 return "unrecognized enumerator";
1099 }
1100
1101 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001102 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001103 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001104 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001105 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001106 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001107 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001108 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001109 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001110 }
1111
1112 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001113 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001114 enumeratorString += string;
1115
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001116 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001117 enumeratorString += '|';
1118 }
1119 }
1120
1121 return enumeratorString;
1122}
1123
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001124static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001125 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001126 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001127 return false;
1128 }
1129
1130 return true;
1131}
1132
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001133static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1134 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001135 return "unrecognized enumerator";
1136 }
1137
1138 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001139 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001140 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001141 }
1142
1143 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001144 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001145 enumeratorString += string;
1146
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001147 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001148 enumeratorString += '|';
1149 }
1150 }
1151
1152 return enumeratorString;
1153}
1154
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001155static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1156 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1157 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1158 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001159 return false;
1160 }
1161
1162 return true;
1163}
1164
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001165static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1166 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001167 return "unrecognized enumerator";
1168 }
1169
1170 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001171 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001172 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1173 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001174 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001175 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1176 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001177 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001178 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1179 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001180 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001181 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1182 }
1183
1184 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001185 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001186 enumeratorString += string;
1187
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001188 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001189 enumeratorString += '|';
1190 }
1191 }
1192
1193 return enumeratorString;
1194}
1195
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001196static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001197 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001198 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001199 return false;
1200 }
1201
1202 return true;
1203}
1204
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001205static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1206 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001207 return "unrecognized enumerator";
1208 }
1209
1210 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001211 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001212 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001213 }
1214
1215 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001216 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001217 enumeratorString += string;
1218
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001219 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001220 enumeratorString += '|';
1221 }
1222 }
1223
1224 return enumeratorString;
1225}
1226
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001227static const int MaxParamCheckerStringLength = 256;
1228
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001229static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001230 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001231 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001232 assert(validateString != nullptr);
1233
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001234 bool skip_call = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001235
1236 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1237
1238 if (result == VK_STRING_ERROR_NONE) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001239 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001240 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001241
1242 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1243 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1244 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001245 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001246 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1247 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1248 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001249 }
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001250 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001251}
1252
Dustin Gravesde628532016-04-21 16:30:17 -06001253static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1254 uint32_t index) {
1255 assert(device_data != nullptr);
1256 debug_report_data *report_data = device_data->report_data;
1257 bool skip_call = false;
1258
1259 if (index == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001260 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1261 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001262 } else {
1263 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1264 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1265 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001266 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1267 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001268 function_name, parameter_name, index);
1269 return false;
1270 }
1271 }
1272
1273 return skip_call;
1274}
1275
1276static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1277 const uint32_t count, const uint32_t *indices) {
1278 assert(device_data != nullptr);
1279 debug_report_data *report_data = device_data->report_data;
1280 bool skip_call = false;
1281
1282 if (indices != nullptr) {
1283 for (uint32_t i = 0; i < count; i++) {
1284 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001285 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1286 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001287 } else {
1288 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1289 if (queue_data == device_data->queueFamilyIndexMap.end()) {
1290 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001291 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1292 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001293 function_name, parameter_name, i, indices[i]);
1294 return false;
1295 }
1296 }
1297 }
1298 }
1299
1300 return skip_call;
1301}
1302
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001303static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance);
1304
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001305VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1306 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001307 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001308
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001309 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001310 assert(chain_info != nullptr);
1311 assert(chain_info->u.pLayerInfo != nullptr);
1312
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001313 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1314 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001315 if (fpCreateInstance == NULL) {
1316 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001317 }
1318
Dustin Graves842621d2016-03-03 14:17:08 -07001319 // Advance the link info for the next element on the chain
1320 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1321
1322 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001323
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001324 if (result == VK_SUCCESS) {
1325 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1326 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001327
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001328 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001329
Chia-I Wua570b7c2016-05-16 07:48:14 +08001330 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001331 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1332 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001333
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001334 // Look for one or more debug report create info structures
1335 // and setup a callback(s) for each one found.
1336 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1337 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1338 if (my_instance_data->num_tmp_callbacks > 0) {
1339 // Setup the temporary callback(s) here to catch early issues:
1340 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1341 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1342 // Failure of setting up one or more of the callback.
1343 // Therefore, clean up and don't use those callbacks:
1344 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1345 my_instance_data->num_tmp_callbacks = 0;
1346 }
1347 }
1348 }
1349
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001350 init_parameter_validation(my_instance_data, pAllocator);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001351 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001352
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001353 // Ordinarily we'd check these before calling down the chain, but none of the layer
1354 // support is in place until now, if we survive we can report the issue now.
1355 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001356
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001357 if (pCreateInfo->pApplicationInfo) {
1358 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1359 validate_string(my_instance_data->report_data, "vkCreateInstance",
1360 "pCreateInfo->VkApplicationInfo->pApplicationName",
1361 pCreateInfo->pApplicationInfo->pApplicationName);
1362 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001363
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001364 if (pCreateInfo->pApplicationInfo->pEngineName) {
1365 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1366 pCreateInfo->pApplicationInfo->pEngineName);
1367 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001368 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001369
1370 // Disable the tmp callbacks:
1371 if (my_instance_data->num_tmp_callbacks > 0) {
1372 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1373 my_instance_data->tmp_callbacks);
1374 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001375 }
1376
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001377 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001378}
1379
Chia-I Wu01ca2372016-05-13 14:37:49 +08001380VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001381 // Grab the key before the instance is destroyed.
1382 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001383 bool skip_call = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001384 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001385 assert(my_data != NULL);
1386
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001387 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1388 bool callback_setup = false;
1389 if (my_data->num_tmp_callbacks > 0) {
1390 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1391 my_data->tmp_callbacks)) {
1392 callback_setup = true;
1393 }
1394 }
1395
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001396 skip_call |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001397
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001398 // Disable and cleanup the temporary callback(s):
1399 if (callback_setup) {
1400 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1401 }
1402 if (my_data->num_tmp_callbacks > 0) {
1403 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1404 my_data->num_tmp_callbacks = 0;
1405 }
1406
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001407 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001408 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001409 pTable->DestroyInstance(instance, pAllocator);
1410
1411 // Clean up logging callback, if any
1412 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001413 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1414 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001415 my_data->logging_callback.pop_back();
1416 }
1417
1418 layer_debug_report_destroy_instance(mid(instance));
1419 layer_data_map.erase(pTable);
1420
1421 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001422 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001423 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001424}
1425
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001426VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1427 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001428 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001429 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001430 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001431 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001432
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001433 skip_call |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001435 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001436 result = get_dispatch_table(pc_instance_table_map, instance)
1437 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001438
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001439 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001440 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1441 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1442 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1443 // Save the supported features for each physical device
1444 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1445 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1446 }
1447 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001448 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001449 return result;
1450}
1451
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001452VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
1453 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001454 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001455 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001456
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001457 skip_call |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001459 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001460 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001461 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001462}
1463
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001464VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1465 VkFormatProperties *pFormatProperties) {
1466 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001467 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001468 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001469
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001470 skip_call |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001471
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001472 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001473 get_dispatch_table(pc_instance_table_map, physicalDevice)
1474 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001475 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001476}
1477
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001478VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1479 VkImageType type, VkImageTiling tiling,
1480 VkImageUsageFlags usage, VkImageCreateFlags flags,
1481 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001482 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001483 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001484 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001485 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001486
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001487 skip_call |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
1488 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001489
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001490 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001491 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1492 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1493 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001494
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001495 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001496 }
Chia-I Wu17241042015-10-31 00:31:16 +08001497
1498 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001499}
1500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001501VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
1502 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001503 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001504 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001505
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001506 skip_call |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001507
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001508 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001509 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001510 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001511}
1512
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001513VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1514 uint32_t *pQueueFamilyPropertyCount,
1515 VkQueueFamilyProperties *pQueueFamilyProperties) {
1516 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001517 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001518 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001519
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001520 skip_call |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1521 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001522
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001523 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001524 get_dispatch_table(pc_instance_table_map, physicalDevice)
1525 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001526 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001527}
1528
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001529VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1530 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1531 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001532 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001533 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001534
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001535 skip_call |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001536
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001537 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001538 get_dispatch_table(pc_instance_table_map, physicalDevice)
1539 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001540 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001541}
1542
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001543void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1544 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001545 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001546
1547 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1548 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1549 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001550 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001551 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001552 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1553 "structure.",
1554 i);
1555 } else {
1556 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001557 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001558
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001559 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1560 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1561 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1562 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001563 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001564 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001565 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1566 "between 0 and 1. Actual value is %f",
1567 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1568 }
1569 }
1570 }
1571
1572 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1573 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001574 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001575 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001576 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1577 "of queue families.",
1578 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001579 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1580 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1581 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06001582 mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001583 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001584 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1585 "queues for the given family index.",
1586 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001587 }
Michael Lentine774704f2016-01-27 13:36:46 -06001588 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001589 }
1590}
1591
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001592static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001593 VkLayerInstanceDispatchTable *dispatch_table = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001594
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001595 instance_extension_map[dispatch_table] = {};
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001596
1597 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1598 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001599 instance_extension_map[dispatch_table].wsi_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001600 }
1601#ifdef VK_USE_PLATFORM_XLIB_KHR
1602 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001603 instance_extension_map[dispatch_table].xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001604 }
1605#endif
1606#ifdef VK_USE_PLATFORM_XCB_KHR
1607 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001608 instance_extension_map[dispatch_table].xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001609 }
1610#endif
1611#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1612 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001613 instance_extension_map[dispatch_table].wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001614 }
1615#endif
1616#ifdef VK_USE_PLATFORM_MIR_KHR
1617 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001618 instance_extension_map[dispatch_table].mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001619 }
1620#endif
1621#ifdef VK_USE_PLATFORM_ANDROID_KHR
1622 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001623 instance_extension_map[dispatch_table].android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001624 }
1625#endif
1626#ifdef VK_USE_PLATFORM_WIN32_KHR
1627 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001628 instance_extension_map[dispatch_table].win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001629 }
1630#endif
1631 }
1632}
1633
1634static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1635 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1636 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06001637 device_data->wsi_display_swapchain_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001638
1639 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1640 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
1641 device_data->wsi_enabled = true;
1642 }
Mark Youngead9b932016-09-08 12:28:38 -06001643 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
1644 device_data->wsi_display_swapchain_enabled = true;
1645 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001646 }
1647}
1648
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001649void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001650 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001651
1652 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1653 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1654 my_device_data->queueFamilyIndexMap.insert(
1655 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1656 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001657 }
1658}
1659
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001660VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001661 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001662 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001663 * NOTE: We do not validate physicalDevice or any dispatchable
1664 * object as the first parameter. We couldn't get here if it was wrong!
1665 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001666
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001667 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001668 bool skip_call = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001669 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001670 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001671
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001672 skip_call |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001673
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001674 if (pCreateInfo != NULL) {
1675 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001676 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001677 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1678 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001679 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001680 }
Michael Lentine774704f2016-01-27 13:36:46 -06001681
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001682 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001683 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001684 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice",
1685 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001686 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001687 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001688 }
1689
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001690 if (!skip_call) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001691 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001692 assert(chain_info != nullptr);
1693 assert(chain_info->u.pLayerInfo != nullptr);
1694
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001695 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1696 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001697 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001698 if (fpCreateDevice == NULL) {
1699 return VK_ERROR_INITIALIZATION_FAILED;
1700 }
1701
1702 // Advance the link info for the next element on the chain
1703 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1704
1705 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001706
1707 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1708
1709 if (result == VK_SUCCESS) {
1710 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1711 assert(my_device_data != nullptr);
1712
1713 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1714 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1715
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001716 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1717
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001718 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001719 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1720 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001721 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001722 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001723
1724 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1725 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001726
1727 // Query and save physical device limits for this device
1728 VkPhysicalDeviceProperties device_properties = {};
1729 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1730 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001731 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001732
1733 // Save app-enabled features in this device's layer_data structure
1734 if (pCreateInfo->pEnabledFeatures) {
1735 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1736 } else {
1737 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1738 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001739 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001740 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001741
Jeremy Hayes99a96322015-06-26 12:48:09 -06001742 return result;
1743}
1744
Chia-I Wu01ca2372016-05-13 14:37:49 +08001745VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001746 dispatch_key key = get_dispatch_key(device);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001747 bool skip_call = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001748 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1749 assert(my_data != NULL);
1750
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001751 skip_call |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001752
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001753 if (!skip_call) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001754 layer_debug_report_destroy_device(device);
1755
Jeremy Hayes99a96322015-06-26 12:48:09 -06001756#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001757 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001758#endif
1759
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001760 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001761 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001762 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001763 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001764}
1765
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001766bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001767 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001768 assert(my_device_data != nullptr);
1769
Dustin Gravesde628532016-04-21 16:30:17 -06001770 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001771
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001772 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001773 if (queue_data->second <= queueIndex) {
Dustin Gravesf233e502016-05-05 13:44:21 -06001774 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001775 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001776 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1777 "was created.",
1778 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001779 return false;
1780 }
1781 return true;
1782}
1783
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001784VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1785 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001786 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001787 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001788
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001789 skip_call |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001790
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001791 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001792 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1793
1794 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001795 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001796}
1797
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001798VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001799 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001800 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001801 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001802 assert(my_data != NULL);
1803
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001804 skip_call |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001805
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001806 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001807 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1808
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001809 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001810 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001811
Jeremy Hayes99a96322015-06-26 12:48:09 -06001812 return result;
1813}
1814
Chia-I Wu01ca2372016-05-13 14:37:49 +08001815VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001816 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1817 assert(my_data != NULL);
1818
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001819 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001820
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001821 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001822
1823 return result;
1824}
1825
Chia-I Wu01ca2372016-05-13 14:37:49 +08001826VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001827 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1828 assert(my_data != NULL);
1829
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001830 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001831
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001832 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001833
1834 return result;
1835}
1836
Chia-I Wu01ca2372016-05-13 14:37:49 +08001837VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001838 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001839 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001840 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001841 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001842 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001843
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001844 skip_call |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001845
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001846 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001847 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1848
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001849 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001850 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001851
1852 return result;
1853}
1854
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001855VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
1856 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001857 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001858 assert(my_data != NULL);
1859
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001860 skip_call |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001861
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001862 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001863 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001864 }
1865}
1866
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001867VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1868 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001869 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001870 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001871 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001872 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001873
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001874 skip_call |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001875
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001876 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001877 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1878
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001879 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001880 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001881
1882 return result;
1883}
1884
Chia-I Wu01ca2372016-05-13 14:37:49 +08001885VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001886 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001887 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1888 assert(my_data != NULL);
1889
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001890 skip_call |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001891
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001892 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001893 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1894 }
1895}
1896
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001897VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1898 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001899 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001900 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001901 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001902 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001903
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001904 skip_call |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001905
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001906 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001907 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1908
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001909 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001910 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001911
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001912 return result;
1913}
1914
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001915VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1916 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001917 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001918 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001919 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001920 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001921
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001922 skip_call |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001923
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001924 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001925 result =
1926 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001927
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001928 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001929 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001930
Tony Barbourb1250542015-04-16 19:23:13 -06001931 return result;
1932}
1933
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001934VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1935 VkDeviceSize *pCommittedMemoryInBytes) {
1936 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001937 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001938 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001939
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001940 skip_call |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001941
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001942 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001943 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001944 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001945}
1946
Chia-I Wu01ca2372016-05-13 14:37:49 +08001947VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1948 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001949 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001950 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001951 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1952 assert(my_data != NULL);
1953
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001954 skip_call |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001955
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001956 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001957 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1958
1959 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1960 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001961
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001962 return result;
1963}
1964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001965VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001966 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001967 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001968 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1969 assert(my_data != NULL);
1970
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001971 skip_call |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001972
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001973 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001974 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1975
1976 validate_result(my_data->report_data, "vkBindImageMemory", result);
1977 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001978
1979 return result;
1980}
1981
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001982VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1983 VkMemoryRequirements *pMemoryRequirements) {
1984 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001985 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001986 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001987
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001988 skip_call |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001989
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001990 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001991 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001992 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001993}
1994
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001995VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
1996 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001997 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001998 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001999
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002000 skip_call |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002001
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002002 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002003 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002004 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002005}
2006
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002007bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
2008 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2009 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002010 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002011 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2012 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002013 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002014 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002015 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2016 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002017 return false;
2018 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002019 }
2020
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002021 return true;
2022}
2023
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002024VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2025 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2026 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002027 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002028 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002029
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002030 skip_call |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2031 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002032
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002033 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002034 get_dispatch_table(pc_device_table_map, device)
2035 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002036
2037 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2038 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002039}
2040
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002041bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2042 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2043 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002044 if (pProperties != nullptr) {
2045 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2046 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002047 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002048 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002049 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2050 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002051 return false;
2052 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002053 }
2054
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002055 return true;
2056}
2057
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002058VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2059 VkImageType type, VkSampleCountFlagBits samples,
2060 VkImageUsageFlags usage, VkImageTiling tiling,
2061 uint32_t *pPropertyCount,
2062 VkSparseImageFormatProperties *pProperties) {
2063 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002064 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002065 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002066
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002067 skip_call |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
2068 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002069
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002070 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002071 get_dispatch_table(pc_instance_table_map, physicalDevice)
2072 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2073 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002074
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002075 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2076 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002077 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002078}
2079
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002080VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2081 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002082 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002083 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002084 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002085 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002086
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002087 skip_call |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002088
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002089 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002090 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2091
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002092 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002093 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002094
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002095 return result;
2096}
2097
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002098VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2099 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002100 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002101 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002102 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002103 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002104
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002105 skip_call |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002106
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002107 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002108 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2109
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002110 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002111 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002112
2113 return result;
2114}
2115
Chia-I Wu01ca2372016-05-13 14:37:49 +08002116VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002117 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002118 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002119 assert(my_data != NULL);
2120
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002121 skip_call |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002122
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002123 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002124 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002125 }
2126}
2127
Chia-I Wu01ca2372016-05-13 14:37:49 +08002128VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002129 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002130 bool skip_call = 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 Lobodzinski72ecd912016-08-11 13:25:38 -06002134 skip_call |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002135
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002136 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002137 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2138
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002139 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002140 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002141
2142 return result;
2143}
2144
Chia-I Wu01ca2372016-05-13 14:37:49 +08002145VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002146 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002147 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002148 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2149 assert(my_data != NULL);
2150
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002151 skip_call |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002152
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002153 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002154 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2155
2156 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2157 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002158
2159 return result;
2160}
2161
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002162VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2163 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002164 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002165 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002166 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002167 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002168
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002169 skip_call |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002170
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002171 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002172 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2173
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002174 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002175 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002176
2177 return result;
2178}
2179
Chia-I Wu01ca2372016-05-13 14:37:49 +08002180VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002181 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002182 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002183 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002184 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002185 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002186
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002187 skip_call |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002188
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002189 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002190 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2191
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002192 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002193 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002194
2195 return result;
2196}
2197
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002198VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
2199 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002200 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002201 assert(my_data != NULL);
2202
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002203 skip_call |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002204
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002205 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002206 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002207 }
2208}
2209
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002210VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2211 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002212 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002213 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002214 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002215 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002216
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002217 skip_call |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002218
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002219 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002220 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2221
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002222 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002223 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002224
2225 return result;
2226}
2227
Chia-I Wu01ca2372016-05-13 14:37:49 +08002228VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002229 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002230 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002231 assert(my_data != NULL);
2232
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002233 skip_call |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002234
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002235 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002236 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002237 }
2238}
2239
Chia-I Wu01ca2372016-05-13 14:37:49 +08002240VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002241 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002242 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002243 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2244 assert(my_data != NULL);
2245
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002246 skip_call |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002247
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002248 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002249 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2250
2251 validate_result(my_data->report_data, "vkGetEventStatus", result);
2252 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002253
2254 return result;
2255}
2256
Chia-I Wu01ca2372016-05-13 14:37:49 +08002257VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002258 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002259 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002260 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2261 assert(my_data != NULL);
2262
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002263 skip_call |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002264
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002265 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002266 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2267
2268 validate_result(my_data->report_data, "vkSetEvent", result);
2269 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002270
2271 return result;
2272}
2273
Chia-I Wu01ca2372016-05-13 14:37:49 +08002274VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002275 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002276 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002277 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2278 assert(my_data != NULL);
2279
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002280 skip_call |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002281
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002282 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002283 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2284
2285 validate_result(my_data->report_data, "vkResetEvent", result);
2286 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002287
2288 return result;
2289}
2290
Chia-I Wu01ca2372016-05-13 14:37:49 +08002291VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002292 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002293 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002294 bool skip_call = false;
2295 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2296 assert(device_data != nullptr);
2297 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002298
Dustin Gravesc900f572016-05-16 11:07:59 -06002299 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002300
Dustin Gravesc900f572016-05-16 11:07:59 -06002301 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2302 if (pCreateInfo != nullptr) {
2303 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2304 // VkQueryPipelineStatisticFlagBits values
2305 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2306 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2307 skip_call |=
2308 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2309 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2310 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2311 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2312 }
2313 }
2314
2315 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002316 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2317
Dustin Gravesc900f572016-05-16 11:07:59 -06002318 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002319 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002320
2321 return result;
2322}
2323
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002324VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
2325 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002326 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002327 assert(my_data != NULL);
2328
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002329 skip_call |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002330
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002331 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002332 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002333 }
2334}
2335
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002336VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2337 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002338 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002339 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002340 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002341 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002342
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002343 skip_call |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
2344 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002345
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002346 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002347 result = get_dispatch_table(pc_device_table_map, device)
2348 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002349
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002350 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002351 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002352
2353 return result;
2354}
2355
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002356VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2357 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002358 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002359 bool skip_call = false;
2360 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2361 assert(device_data != nullptr);
2362 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002363
Karl Schultza9ef1e52016-10-06 17:53:48 -06002364 // TODO: Add check for VALIDATION_ERROR_00660
2365 // TODO: Add check for VALIDATION_ERROR_00661
2366 // TODO: Add check for VALIDATION_ERROR_00662
2367 // TODO: Add check for VALIDATION_ERROR_00670
2368 // TODO: Add check for VALIDATION_ERROR_00671
2369 // TODO: Add check for VALIDATION_ERROR_00672
2370 // TODO: Add check for VALIDATION_ERROR_00673
2371 // TODO: Add check for VALIDATION_ERROR_00674
2372 // TODO: Add check for VALIDATION_ERROR_00675
2373 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2374 // TODO: Add check for VALIDATION_ERROR_00663
Dustin Gravesc900f572016-05-16 11:07:59 -06002375 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002376
Dustin Gravesc900f572016-05-16 11:07:59 -06002377 if (pCreateInfo != nullptr) {
2378 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2379 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2380 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2381 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Karl Schultza9ef1e52016-10-06 17:53:48 -06002382 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2383 __LINE__, VALIDATION_ERROR_00665, LayerName,
2384 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2385 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2386 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002387 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002388
Dustin Gravesc900f572016-05-16 11:07:59 -06002389 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2390 // queueFamilyIndexCount uint32_t values
2391 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2392 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Karl Schultza9ef1e52016-10-06 17:53:48 -06002393 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002394 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2395 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002396 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2397 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002398 }
2399
2400 // Ensure that the queue family indices were specified at device creation
2401 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2402 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2403 }
2404 }
2405
2406 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002407 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2408
Dustin Gravesc900f572016-05-16 11:07:59 -06002409 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002410 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002411
2412 return result;
2413}
2414
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002415VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
2416 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002417 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002418 assert(my_data != NULL);
2419
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002420 skip_call |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002421
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002422 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002423 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002424 }
2425}
2426
Chia-I Wu01ca2372016-05-13 14:37:49 +08002427VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2428 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002429 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002430 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002431 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002432 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002433
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002434 skip_call |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002435
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002436 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002437 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2438
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002439 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002440 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002441
2442 return result;
2443}
2444
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002445VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
2446 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002447 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002448 assert(my_data != NULL);
2449
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002450 skip_call |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002451
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002452 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002453 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002454 }
2455}
2456
Chia-I Wu01ca2372016-05-13 14:37:49 +08002457VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2458 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002459 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2460 bool skip_call = false;
2461 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002462 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002463 debug_report_data *report_data = device_data->report_data;
2464
2465 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2466
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002467 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002468 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002469 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002470 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2471 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2472 skip_call |=
2473 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2474 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2475 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2476 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002477
Dustin Gravesc900f572016-05-16 11:07:59 -06002478 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2479 // queueFamilyIndexCount uint32_t values
2480 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2481 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2482 __LINE__, REQUIRED_PARAMETER, LayerName,
2483 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2484 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2485 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2486 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002487
2488 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2489 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2490 }
2491
2492 // width, height, and depth members of extent must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002493 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2494 skip_call |=
2495 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
2496 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002497
2498 // mipLevels must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002499 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002500
2501 // arrayLayers must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002502 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002503
2504 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2505 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2506 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2507 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002508 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002509 }
2510
2511 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2512 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2513 // extent.height must be equal
2514 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2515 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002516 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2517 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2518 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2519 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002520 }
2521
2522 if (pCreateInfo->extent.depth != 1) {
2523 skip_call |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002524 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002525 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2526 }
2527 }
2528
2529 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2530 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2531 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002532 skip_call |=
2533 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2534 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2535 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002536 }
2537
2538 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2539 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2540 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2541 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002542 skip_call |=
2543 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2544 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2545 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002546 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002547 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002548
Dustin Gravesf8032f22016-05-11 18:31:44 -06002549 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002550 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2551
Dustin Gravesf8032f22016-05-11 18:31:44 -06002552 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002553 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002554
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002555 return result;
2556}
2557
Chia-I Wu01ca2372016-05-13 14:37:49 +08002558VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002559 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002560 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002561 assert(my_data != NULL);
2562
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002563 skip_call |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002564
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002565 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002566 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002567 }
2568}
2569
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002570bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2571 if (pSubresource != nullptr) {
2572 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2573 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002574 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002575 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002576 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2577 return false;
2578 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002579 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002580
2581 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002582}
2583
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002584VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2585 VkSubresourceLayout *pLayout) {
2586 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002587 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002588 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002589
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002590 skip_call |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002591
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002592 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002593 PreGetImageSubresourceLayout(device, pSubresource);
2594
2595 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002596 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002597}
2598
Chia-I Wu01ca2372016-05-13 14:37:49 +08002599VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2600 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002601 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002602 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002603 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002604 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002605 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002606
Dustin Graves0b70a632016-04-27 17:44:56 -06002607 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002608
Dustin Graves0b70a632016-04-27 17:44:56 -06002609 if (pCreateInfo != nullptr) {
2610 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002611 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2612 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002613 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2614 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2615 "pCreateInfo->subresourceRange.layerCount must be 1",
2616 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2617 }
2618 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002619 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2620 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2621 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002622 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2623 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2624 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2625 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2626 }
2627 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002628 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2629 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002630 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2631 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2632 "pCreateInfo->subresourceRange.layerCount must be 6");
2633 }
2634 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002635 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2636 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002637 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2638 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2639 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2640 }
2641 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2642 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2643 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2644 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2645 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2646 }
2647
Dustin Graves2a80dc62016-07-12 13:57:02 -06002648 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2649 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002650 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2651 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2652 "pCreateInfo->subresourceRange.layerCount must be 1");
2653 }
2654 }
2655 }
2656
2657 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002658 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2659
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002660 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002661 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002662
2663 return result;
2664}
2665
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002666VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
2667 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002668 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002669 assert(my_data != NULL);
2670
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002671 skip_call |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002672
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002673 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002674 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002675 }
2676}
2677
Chia-I Wu01ca2372016-05-13 14:37:49 +08002678VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002679 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002680 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002681 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002682 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002683 assert(my_data != NULL);
2684
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002685 skip_call |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002686
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002687 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002688 result =
2689 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002690
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002691 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002692 }
2693
Michael Lentine03d8e572015-09-15 14:59:14 -05002694 return result;
2695}
2696
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002697VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2698 const VkAllocationCallbacks *pAllocator) {
2699 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002700 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002701 assert(my_data != NULL);
2702
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002703 skip_call |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002704
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002705 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002706 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002707 }
2708}
2709
Chia-I Wu01ca2372016-05-13 14:37:49 +08002710VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002711 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002712 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002713 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002714 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002715 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002716
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002717 skip_call |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002718
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002719 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002720 result =
2721 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002722
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002723 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002724 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002725
2726 return result;
2727}
2728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002729VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2730 const VkAllocationCallbacks *pAllocator) {
2731 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002732 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002733 assert(my_data != NULL);
2734
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002735 skip_call |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002736
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002737 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002738 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002739 }
2740}
2741
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002742VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2743 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002744 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002745 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002746 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002747 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002748
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002749 skip_call |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002750
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002751 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002752 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2753
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002754 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002755 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002756
2757 return result;
2758}
2759
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002760VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2761 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002762 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002763 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002764 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002765 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002766
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002767 skip_call |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002768
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002769 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002770 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2771
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002772 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002773 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002774
2775 return result;
2776}
2777
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002778bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002779 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2780
2781 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002782 if (pCreateInfos != nullptr) {
2783 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2784 if (pCreateInfos->basePipelineIndex != -1) {
2785 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002786 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002787 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002788 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2789 "pCreateInfos->flags "
2790 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2791 return false;
2792 }
2793 }
2794
2795 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2796 if (pCreateInfos->basePipelineIndex != -1) {
2797 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002798 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002799 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002800 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2801 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2802 "VK_NULL_HANDLE");
2803 return false;
2804 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002805 }
2806 }
2807
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002808 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002809 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002810 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002811 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002812 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2813 "unrecognized enumerator");
2814 return false;
2815 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002816
2817 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2818 (data->physical_device_features.fillModeNonSolid == false)) {
2819 log_msg(
2820 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2821 DEVICE_FEATURE, LayerName,
2822 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2823 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2824 return false;
2825 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002826 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002827
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002828 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002829 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002830 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2831 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002832 pCreateInfos[i].pStages[j].pName);
2833 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002834 }
2835
2836 return true;
2837}
2838
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002839VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2840 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2841 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002842 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002843 bool skip_call = false;
2844 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2845 assert(device_data != nullptr);
2846 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002847
Dustin Gravesc900f572016-05-16 11:07:59 -06002848 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2849 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002850
Dustin Gravesc900f572016-05-16 11:07:59 -06002851 if (pCreateInfos != nullptr) {
2852 for (uint32_t i = 0; i < createInfoCount; ++i) {
2853 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2854 if (pCreateInfos[i].pTessellationState == nullptr) {
2855 if (pCreateInfos[i].pStages != nullptr) {
2856 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2857 // pTessellationState must not be NULL
2858 bool has_control = false;
2859 bool has_eval = false;
2860
2861 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2862 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2863 has_control = true;
2864 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2865 has_eval = true;
2866 }
2867 }
2868
2869 if (has_control && has_eval) {
2870 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2871 __LINE__, REQUIRED_PARAMETER, LayerName,
2872 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2873 "control shader stage and a tessellation evaluation shader stage, "
2874 "pCreateInfos[%d].pTessellationState must not be NULL",
2875 i, i);
2876 }
2877 }
Dustin Graves629259b2016-05-30 16:14:27 -06002878 } else {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002879 skip_call |= validate_struct_pnext(
2880 report_data, "vkCreateGraphicsPipelines",
2881 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2882 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002883
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002884 skip_call |= validate_reserved_flags(
2885 report_data, "vkCreateGraphicsPipelines",
2886 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2887 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002888
2889 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_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].pTessellationState->sType must be "
2893 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2894 i);
2895 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002896 }
2897
2898 if (pCreateInfos[i].pViewportState == nullptr) {
2899 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2900 // valid VkPipelineViewportStateCreateInfo structure
2901 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2902 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2903 skip_call |= log_msg(
2904 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2905 REQUIRED_PARAMETER, LayerName,
2906 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2907 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2908 i, i);
2909 }
2910 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002911 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002912 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2913 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2914 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002915
2916 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002917 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2918 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002919 pCreateInfos[i].pViewportState->flags);
2920
Dustin Gravesc900f572016-05-16 11:07:59 -06002921 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2922 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2923 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2924 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2925 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2926 i);
2927 }
2928
2929 if (pCreateInfos[i].pDynamicState != nullptr) {
2930 bool has_dynamic_viewport = false;
2931 bool has_dynamic_scissor = false;
2932
2933 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2934 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2935 has_dynamic_viewport = true;
2936 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2937 has_dynamic_scissor = true;
2938 }
2939 }
2940
2941 // viewportCount must be greater than 0
2942 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2943 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2944 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2945 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002946 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2947 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002948 "must be greater than 0",
2949 i, i);
2950 }
2951
2952 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2953 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2954 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2955 skip_call |=
2956 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2957 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002958 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002959 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2960 i, i);
2961 }
2962
2963 // scissorCount must be greater than 0
2964 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2965 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2966 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2967 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002968 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2969 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002970 "must be greater than 0",
2971 i, i);
2972 }
2973
2974 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2975 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2976 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2977 skip_call |=
2978 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2979 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002980 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002981 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2982 i, i);
2983 }
2984 }
2985 }
2986
2987 if (pCreateInfos[i].pMultisampleState == nullptr) {
2988 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2989 // a valid VkPipelineMultisampleStateCreateInfo structure
2990 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2991 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2992 skip_call |=
2993 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2994 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2995 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2996 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2997 i, i);
2998 }
Dustin Graves629259b2016-05-30 16:14:27 -06002999 } else {
3000 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003001 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3002 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003003 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003004
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003005 skip_call |= validate_reserved_flags(
3006 report_data, "vkCreateGraphicsPipelines",
3007 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
3008 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003009
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003010 skip_call |= validate_bool32(
3011 report_data, "vkCreateGraphicsPipelines",
3012 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
3013 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003014
3015 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003016 report_data, "vkCreateGraphicsPipelines",
3017 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3018 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3019 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3020 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003021
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003022 skip_call |= validate_bool32(
3023 report_data, "vkCreateGraphicsPipelines",
3024 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3025 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003026
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003027 skip_call |= validate_bool32(
3028 report_data, "vkCreateGraphicsPipelines",
3029 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3030 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003031
3032 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3033 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3034 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3035 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3036 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3037 i);
3038 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003039 }
3040
3041 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003042 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003043 skip_call |= validate_struct_pnext(
3044 report_data, "vkCreateGraphicsPipelines",
3045 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3046 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003047
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003048 skip_call |= validate_reserved_flags(
3049 report_data, "vkCreateGraphicsPipelines",
3050 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3051 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003052
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003053 skip_call |= validate_bool32(
3054 report_data, "vkCreateGraphicsPipelines",
3055 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3056 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003057
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003058 skip_call |= validate_bool32(
3059 report_data, "vkCreateGraphicsPipelines",
3060 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3061 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003062
3063 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003064 report_data, "vkCreateGraphicsPipelines",
3065 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3066 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3067 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003068
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003069 skip_call |= validate_bool32(
3070 report_data, "vkCreateGraphicsPipelines",
3071 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3072 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003073
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003074 skip_call |= validate_bool32(
3075 report_data, "vkCreateGraphicsPipelines",
3076 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3077 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003078
3079 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003080 report_data, "vkCreateGraphicsPipelines",
3081 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3082 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3083 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003084
3085 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003086 report_data, "vkCreateGraphicsPipelines",
3087 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3088 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3089 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003090
3091 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003092 report_data, "vkCreateGraphicsPipelines",
3093 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3094 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3095 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003096
3097 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003098 report_data, "vkCreateGraphicsPipelines",
3099 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3100 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3101 pCreateInfos[i].pDepthStencilState->front.compareOp);
3102
3103 skip_call |= validate_ranged_enum(
3104 report_data, "vkCreateGraphicsPipelines",
3105 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003106 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3107
3108 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003109 report_data, "vkCreateGraphicsPipelines",
3110 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003111 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3112
3113 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003114 report_data, "vkCreateGraphicsPipelines",
3115 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3116 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3117 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003118
3119 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003120 report_data, "vkCreateGraphicsPipelines",
3121 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3122 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3123 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003124
3125 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3126 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3127 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3128 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3129 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3130 i);
3131 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003132 }
3133
3134 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3135 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003136 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003137 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3138 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3139 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003140
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003141 skip_call |= validate_reserved_flags(
3142 report_data, "vkCreateGraphicsPipelines",
3143 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3144 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003145
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003146 skip_call |= validate_bool32(
3147 report_data, "vkCreateGraphicsPipelines",
3148 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3149 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003150
3151 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003152 report_data, "vkCreateGraphicsPipelines",
3153 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3154 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3155 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003156
3157 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3158 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3159 ++attachmentIndex) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003160 skip_call |=
3161 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3162 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3163 ParameterName::IndexVector{i, attachmentIndex}),
3164 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003165
3166 skip_call |= validate_ranged_enum(
3167 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003168 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3169 ParameterName::IndexVector{i, attachmentIndex}),
3170 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003171 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3172
3173 skip_call |= validate_ranged_enum(
3174 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003175 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3176 ParameterName::IndexVector{i, attachmentIndex}),
3177 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003178 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3179
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003180 skip_call |=
3181 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3182 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3183 ParameterName::IndexVector{i, attachmentIndex}),
3184 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3185 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003186
3187 skip_call |= validate_ranged_enum(
3188 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003189 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3190 ParameterName::IndexVector{i, attachmentIndex}),
3191 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003192 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3193
3194 skip_call |= validate_ranged_enum(
3195 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003196 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3197 ParameterName::IndexVector{i, attachmentIndex}),
3198 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003199 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3200
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003201 skip_call |=
3202 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3203 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3204 ParameterName::IndexVector{i, attachmentIndex}),
3205 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3206 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003207
3208 skip_call |=
3209 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003210 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3211 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003212 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3213 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3214 }
3215 }
3216
Dustin Gravesc900f572016-05-16 11:07:59 -06003217 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3218 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3219 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3220 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3221 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3222 i);
3223 }
3224
3225 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3226 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3227 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003228 report_data, "vkCreateGraphicsPipelines",
3229 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003230 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3231 }
3232 }
3233 }
3234 }
3235
3236 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003237 PreCreateGraphicsPipelines(device, pCreateInfos);
3238
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003239 result = get_dispatch_table(pc_device_table_map, device)
3240 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003241
Dustin Gravesc900f572016-05-16 11:07:59 -06003242 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003243 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003244
3245 return result;
3246}
3247
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003248bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003249 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3250
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003251 if (pCreateInfos != nullptr) {
3252 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003253 uint32_t i = 0;
3254 validate_string(data->report_data, "vkCreateComputePipelines",
3255 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003256 }
3257
3258 return true;
3259}
3260
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003261VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3262 const VkComputePipelineCreateInfo *pCreateInfos,
3263 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003264 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003265 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003266 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003267 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003268
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003269 skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3270 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003271
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003272 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003273 PreCreateComputePipelines(device, pCreateInfos);
3274
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003275 result = get_dispatch_table(pc_device_table_map, device)
3276 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003277
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003278 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003279 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003280
3281 return result;
3282}
3283
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003284VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3285 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003286 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003287 assert(my_data != NULL);
3288
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003289 skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003290
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003291 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003292 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003293 }
3294}
3295
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003296VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3297 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003298 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003299 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003300 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003301 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003302
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003303 skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003304
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003305 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003306 result =
3307 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003308
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003309 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003310 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003311
3312 return result;
3313}
3314
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003315VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3316 const VkAllocationCallbacks *pAllocator) {
3317 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003318 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003319 assert(my_data != NULL);
3320
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003321 skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003322
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003323 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003324 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003325 }
3326}
3327
Chia-I Wu01ca2372016-05-13 14:37:49 +08003328VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3329 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003330 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003331 bool skip_call = false;
3332 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3333 assert(device_data != NULL);
3334 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003335
Dustin Gravesc900f572016-05-16 11:07:59 -06003336 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003337
Dustin Gravesc900f572016-05-16 11:07:59 -06003338 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3339 if (pCreateInfo != nullptr) {
3340 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3341 if (pCreateInfo->compareEnable == VK_TRUE) {
3342 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3343 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3344 }
3345
3346 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3347 // valid VkBorderColor value
3348 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3349 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3350 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3351 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3352 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3353 }
3354 }
3355
3356 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003357 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3358
Dustin Gravesc900f572016-05-16 11:07:59 -06003359 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003360 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003361
3362 return result;
3363}
3364
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003365VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3366 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003367 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003368 assert(my_data != NULL);
3369
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003370 skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003371
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003372 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003373 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003374 }
3375}
3376
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003377VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3378 const VkAllocationCallbacks *pAllocator,
3379 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003380 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003381 bool skip_call = false;
3382 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3383 assert(device_data != nullptr);
3384 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003385
Dustin Gravesc900f572016-05-16 11:07:59 -06003386 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003387
Dustin Gravesc900f572016-05-16 11:07:59 -06003388 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3389 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3390 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3391 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3392 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3393 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3394 // valid VkSampler handles
3395 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3396 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3397 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3398 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3399 ++descriptor_index) {
3400 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3401 skip_call |=
3402 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3403 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3404 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3405 " specified as VK_NULL_HANDLE",
3406 i, descriptor_index);
3407 }
3408 }
3409 }
3410
3411 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3412 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3413 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3414 skip_call |=
3415 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3416 UNRECOGNIZED_VALUE, LayerName,
3417 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3418 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3419 i, i);
3420 }
3421 }
3422 }
3423 }
3424
3425 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003426 result =
3427 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003428
Dustin Gravesc900f572016-05-16 11:07:59 -06003429 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003430 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003431
3432 return result;
3433}
3434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003435VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3436 const VkAllocationCallbacks *pAllocator) {
3437 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003438 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003439 assert(my_data != NULL);
3440
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003441 skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003442
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003443 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003444 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003445 }
3446}
3447
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003448VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3449 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003450 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003451 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003452 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003453 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003454
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003455 skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003456
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003457 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003459 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003460 result =
3461 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003462
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003463 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003464 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003465
3466 return result;
3467}
3468
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003469VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3470 const VkAllocationCallbacks *pAllocator) {
3471 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003472 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003473 assert(my_data != NULL);
3474
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003475 skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003476
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003477 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003478 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003479 }
3480}
3481
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003482VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3483 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003484 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003485 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003486 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3487 assert(my_data != NULL);
3488
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003489 skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003490
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003491 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003492 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3493
3494 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3495 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003496
3497 return result;
3498}
3499
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003500VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3501 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003502 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003503 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003504 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003505 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003506
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003507 skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003508
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003509 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003510 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3511
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003512 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003513 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003514
3515 return result;
3516}
3517
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003518VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003519 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003520 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003521 bool skip_call = false;
3522 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3523 assert(device_data != nullptr);
3524 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003525
Dustin Gravesc900f572016-05-16 11:07:59 -06003526 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003527
Dustin Gravesc900f572016-05-16 11:07:59 -06003528 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3529 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3530 // validate_array()
3531 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3532 pDescriptorSets, true, true);
3533
3534 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003535 result = get_dispatch_table(pc_device_table_map, device)
3536 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003537
Dustin Gravesc900f572016-05-16 11:07:59 -06003538 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003539 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003540
3541 return result;
3542}
3543
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003544VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3545 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3546 const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003547 bool skip_call = false;
3548 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3549 assert(device_data != NULL);
3550 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003551
Dustin Gravesc900f572016-05-16 11:07:59 -06003552 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3553 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003554
Dustin Gravesc900f572016-05-16 11:07:59 -06003555 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3556 if (pDescriptorWrites != NULL) {
3557 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3558 // descriptorCount must be greater than 0
3559 if (pDescriptorWrites[i].descriptorCount == 0) {
3560 skip_call |=
3561 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3562 REQUIRED_PARAMETER, LayerName,
3563 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3564 }
3565
3566 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3567 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3568 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3569 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3570 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3571 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3572 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3573 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3574 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3575 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3576 __LINE__, REQUIRED_PARAMETER, LayerName,
3577 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3578 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3579 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3580 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3581 i, i);
3582 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3583 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3584 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3585 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3586 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3587 ++descriptor_index) {
3588 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003589 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3590 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003591 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3592 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003593 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3594 ParameterName::IndexVector{i, descriptor_index}),
3595 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003596 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3597 }
3598 }
3599 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3600 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3601 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3602 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3603 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3604 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3605 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3606 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3607 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3608 __LINE__, REQUIRED_PARAMETER, LayerName,
3609 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3610 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3611 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3612 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3613 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003614 } else {
3615 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3616 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003617 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3618 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003619 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3620 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003621 }
3622 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3623 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3624 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3625 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3626 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3627 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3628 __LINE__, REQUIRED_PARAMETER, LayerName,
3629 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3630 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3631 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3632 i, i);
3633 } else {
3634 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3635 ++descriptor_index) {
3636 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003637 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3638 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003639 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3640 }
3641 }
3642 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003643
3644 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3645 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3646 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3647 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3648 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3649 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3650 skip_call |=
3651 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003652 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003653 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3654 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3655 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3656 }
3657 }
3658 }
3659 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3660 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3661 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3662 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3663 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3664 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3665 skip_call |=
3666 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003667 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003668 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3669 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3670 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3671 }
3672 }
3673 }
3674 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003675 }
3676 }
3677
3678 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003679 get_dispatch_table(pc_device_table_map, device)
3680 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003681 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003682}
3683
Chia-I Wu01ca2372016-05-13 14:37:49 +08003684VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003685 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003686 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003687 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003688 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003689 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003690
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003691 skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003692
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003693 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003694 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3695
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003696 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003697 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003698
3699 return result;
3700}
3701
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003702VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3703 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003704 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003705 assert(my_data != NULL);
3706
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003707 skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003708
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003709 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003710 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003711 }
3712}
3713
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003714bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3715 bool skip_call = false;
3716 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3717
3718 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3719 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3720 skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003721 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003722 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3723 }
3724 }
3725 return skip_call;
3726}
3727
Chia-I Wu01ca2372016-05-13 14:37:49 +08003728VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003729 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003730 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003731 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003732 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003733 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003734
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003735 skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3736 skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003737
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003738 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003739 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3740
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003741 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003742 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003743
3744 return result;
3745}
3746
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003747VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
3748 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003749 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003750 assert(my_data != NULL);
3751
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003752 skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003753
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003754 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003755 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003756 }
3757}
3758
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003759VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3760 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003761 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003762 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003763
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003764 skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003765
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003766 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003767 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003768 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003769}
3770
Chia-I Wu01ca2372016-05-13 14:37:49 +08003771VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003772 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003773 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003774 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003775 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003776 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003777
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003778 skip_call |=
Dustin Gravesde628532016-04-21 16:30:17 -06003779 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003780
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003781 skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003782
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003783 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003784 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3785
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003786 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003787 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003788
3789 return result;
3790}
3791
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003792VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3793 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003794 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003795 assert(my_data != NULL);
3796
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003797 skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003798
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003799 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003800 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003801 }
3802}
3803
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003804VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003805 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003806 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003807 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3808 assert(my_data != NULL);
3809
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003810 skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003811
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003812 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003813 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3814
3815 validate_result(my_data->report_data, "vkResetCommandPool", result);
3816 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003817
3818 return result;
3819}
3820
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003821VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3822 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003823 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003824 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003825 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003826 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003827
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003828 skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003829
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003830 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003831 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3832
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003833 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003834 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003835
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003836 return result;
3837}
3838
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003839VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003840 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003841 bool skip_call = false;
3842 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3843 assert(device_data != nullptr);
3844 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003845
Dustin Gravesc900f572016-05-16 11:07:59 -06003846 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003847
Dustin Gravesc900f572016-05-16 11:07:59 -06003848 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3849 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3850 // validate_array()
3851 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3852 pCommandBuffers, true, true);
3853
3854 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003855 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003856 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003857 }
3858}
3859
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003860bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3861 bool skip_call = false;
3862 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3863 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3864
3865 if (pInfo != NULL) {
3866 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3867 skip_call |=
3868 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003869 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003870 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3871 "inheritedQueries.");
3872 }
3873
3874 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3875 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3876 skip_call |=
3877 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003878 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003879 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3880 "valid combination of VkQueryControlFlagBits.",
3881 pInfo->queryFlags);
3882 }
3883 }
3884 return skip_call;
3885}
3886
3887VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003888 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003889 bool skip_call = false;
3890 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3891 assert(device_data != nullptr);
3892 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003893
Dustin Gravesc900f572016-05-16 11:07:59 -06003894 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003895
Dustin Gravesc900f572016-05-16 11:07:59 -06003896 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3897 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3898 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3899 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3900 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3901
3902 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003903 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003904 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003905
3906 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3907 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3908
Dustin Gravesc900f572016-05-16 11:07:59 -06003909 // TODO: This only needs to be validated when the inherited queries feature is enabled
3910 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3911 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3912
3913 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3914 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3915 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3916 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3917 }
3918
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003919 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3920
Dustin Gravesc900f572016-05-16 11:07:59 -06003921 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003922 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3923
Dustin Gravesc900f572016-05-16 11:07:59 -06003924 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003925 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003926
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003927 return result;
3928}
3929
Chia-I Wu01ca2372016-05-13 14:37:49 +08003930VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003931 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3932 assert(my_data != NULL);
3933
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003934 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003935
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003936 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003937
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003938 return result;
3939}
3940
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003941VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003942 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003943 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3944 assert(my_data != NULL);
3945
Dustin Graves16d18972016-05-09 17:36:57 -06003946 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003947
Dustin Graves16d18972016-05-09 17:36:57 -06003948 if (!skip_call) {
3949 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3950
3951 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3952 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003953
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003954 return result;
3955}
3956
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003957VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3958 VkPipeline pipeline) {
3959 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003960 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3961 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003962
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003963 skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003965 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003966 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3967 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003968}
3969
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003970VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3971 const VkViewport *pViewports) {
3972 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003973 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003974 assert(my_data != NULL);
3975
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003976 skip_call |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003977
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003978 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003979 get_dispatch_table(pc_device_table_map, commandBuffer)
3980 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003981 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003982}
3983
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003984VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3985 const VkRect2D *pScissors) {
3986 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003987 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003988 assert(my_data != NULL);
3989
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003990 skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003991
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003992 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003993 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3994 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003995}
3996
Chia-I Wu01ca2372016-05-13 14:37:49 +08003997VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003998 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003999}
4000
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004001VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4002 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004003 get_dispatch_table(pc_device_table_map, commandBuffer)
4004 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004005}
4006
Chia-I Wu01ca2372016-05-13 14:37:49 +08004007VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004008 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004009 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004010 assert(my_data != NULL);
4011
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004012 skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004013
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004014 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004015 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4016 }
Cody Northrop12365112015-08-17 11:10:49 -06004017}
4018
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004019VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004020 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004021}
4022
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004023VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4024 uint32_t compareMask) {
4025 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004026 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4027 assert(my_data != NULL);
4028
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004029 skip_call |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004030
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004031 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004032 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4033 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004034}
4035
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004036VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
4037 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004038 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4039 assert(my_data != NULL);
4040
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004041 skip_call |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004042
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004043 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004044 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4045 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004046}
4047
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004048VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
4049 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004050 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4051 assert(my_data != NULL);
4052
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004053 skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004054
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004055 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004056 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4057 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004058}
4059
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004060VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4061 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4062 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4063 const uint32_t *pDynamicOffsets) {
4064 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004065 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004066 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004067
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004068 skip_call |=
4069 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4070 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004071
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004072 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004073 get_dispatch_table(pc_device_table_map, commandBuffer)
4074 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4075 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004076 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004077}
4078
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004079VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4080 VkIndexType indexType) {
4081 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004082 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4083 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004084
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004085 skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004086
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004087 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004088 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4089 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004090}
4091
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004092VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4093 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4094 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004095 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004096 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004097
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004098 skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004099
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004100 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004101 get_dispatch_table(pc_device_table_map, commandBuffer)
4102 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004103 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004104}
4105
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004106bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4107 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004108 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004109 // 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 -07004110 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004111 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004112 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004113 return false;
4114 }
4115
4116 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004117 // 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 -07004118 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004119 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004120 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004121 return false;
4122 }
4123
4124 return true;
4125}
4126
Chia-I Wu01ca2372016-05-13 14:37:49 +08004127VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4128 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004129 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004130
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004131 get_dispatch_table(pc_device_table_map, commandBuffer)
4132 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004133}
4134
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004135VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4136 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004137 get_dispatch_table(pc_device_table_map, commandBuffer)
4138 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004139}
4140
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004141VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4142 uint32_t stride) {
4143 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004144 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4145 assert(my_data != NULL);
4146
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004147 skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004148
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004149 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004150 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4151 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004152}
4153
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004154VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4155 uint32_t count, uint32_t stride) {
4156 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004157 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4158 assert(my_data != NULL);
4159
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004160 skip_call |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004161
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004162 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004163 get_dispatch_table(pc_device_table_map, commandBuffer)
4164 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4165 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004166}
4167
Chia-I Wu01ca2372016-05-13 14:37:49 +08004168VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004169 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004170}
4171
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004172VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4173 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004174 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4175 assert(my_data != NULL);
4176
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004177 skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004178
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004179 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004180 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4181 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004182}
4183
Chia-I Wu01ca2372016-05-13 14:37:49 +08004184VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4185 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004186 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004187 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004188 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004189
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004190 skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004191
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004192 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004193 get_dispatch_table(pc_device_table_map, commandBuffer)
4194 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004195 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004196}
4197
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004198bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4199 if (pRegions != nullptr) {
4200 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4201 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004202 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004203 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004204 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4205 return false;
4206 }
4207 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4208 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004209 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004210 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004211 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4212 return false;
4213 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004214 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004215
4216 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004217}
4218
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004219VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4220 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4221 const VkImageCopy *pRegions) {
4222 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004223 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004224 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004225
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004226 skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4227 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004228
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004229 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004230 PreCmdCopyImage(commandBuffer, pRegions);
4231
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004232 get_dispatch_table(pc_device_table_map, commandBuffer)
4233 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004234 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004235}
4236
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004237bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4238 if (pRegions != nullptr) {
4239 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4240 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004241 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004242 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004243 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4244 return false;
4245 }
4246 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4247 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004248 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004249 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004250 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4251 return false;
4252 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004253 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004254
4255 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004256}
4257
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004258VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4259 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4260 const VkImageBlit *pRegions, VkFilter filter) {
4261 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004262 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004263 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004264
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004265 skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4266 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004267
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004268 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004269 PreCmdBlitImage(commandBuffer, pRegions);
4270
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004271 get_dispatch_table(pc_device_table_map, commandBuffer)
4272 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004273 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004274}
4275
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004276bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4277 if (pRegions != nullptr) {
4278 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4279 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004280 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004281 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004282 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4283 "enumerator");
4284 return false;
4285 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004286 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004287
4288 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004289}
4290
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004291VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4292 VkImageLayout dstImageLayout, uint32_t regionCount,
4293 const VkBufferImageCopy *pRegions) {
4294 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004295 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004296 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004297
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004298 skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4299 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004300
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004301 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004302 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4303
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004304 get_dispatch_table(pc_device_table_map, commandBuffer)
4305 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004306 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004307}
4308
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004309bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4310 if (pRegions != nullptr) {
4311 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4312 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004313 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004314 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004315 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4316 "enumerator");
4317 return false;
4318 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004319 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004320
4321 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004322}
4323
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004324VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4325 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4326 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004327 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004328 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004329
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004330 skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4331 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004332
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004333 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004334 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4335
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004336 get_dispatch_table(pc_device_table_map, commandBuffer)
4337 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004338 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004339}
4340
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004341VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4342 VkDeviceSize dataSize, const uint32_t *pData) {
4343 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004344 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004345 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004346
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004347 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004348
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004349 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004350 skip_call |= log_msg(
4351 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4352 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004353 }
4354
4355 if ((dataSize <= 0) || (dataSize > 65536)) {
4356 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004357 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4358 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004359 dataSize);
4360 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004361 skip_call |= log_msg(
4362 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4363 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004364 }
4365
4366 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004367 get_dispatch_table(pc_device_table_map, commandBuffer)
4368 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004369 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004370}
4371
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004372VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4373 VkDeviceSize size, uint32_t data) {
4374 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004375 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4376 assert(my_data != NULL);
4377
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004378 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004379
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004380 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004381 skip_call |= log_msg(
4382 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4383 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004384 }
4385
4386 if (size != VK_WHOLE_SIZE) {
4387 if (size <= 0) {
4388 skip_call |= log_msg(
4389 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004390 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004391 } else if (size & 3) {
4392 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004393 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004394 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4395 }
4396 }
4397
4398 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004399 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4400 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004401}
4402
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004403VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4404 const VkClearColorValue *pColor, uint32_t rangeCount,
4405 const VkImageSubresourceRange *pRanges) {
4406 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004407 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004408 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004409
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004410 skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004411
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004412 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004413 get_dispatch_table(pc_device_table_map, commandBuffer)
4414 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004415 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004416}
4417
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004418VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4419 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4420 const VkImageSubresourceRange *pRanges) {
4421 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004422 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004423 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004424
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004425 skip_call |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4426 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004427
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004428 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004429 get_dispatch_table(pc_device_table_map, commandBuffer)
4430 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004431 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004432}
4433
Chia-I Wu01ca2372016-05-13 14:37:49 +08004434VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4435 const VkClearAttachment *pAttachments, uint32_t rectCount,
4436 const VkClearRect *pRects) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004437 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004438 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004439 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004440
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004441 skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004442
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004443 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004444 get_dispatch_table(pc_device_table_map, commandBuffer)
4445 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004446 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004447}
4448
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004449bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4450 if (pRegions != nullptr) {
4451 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4452 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4453 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004454 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004455 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004456 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4457 return false;
4458 }
4459 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4460 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4461 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004462 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004463 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004464 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4465 return false;
4466 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004467 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004468
4469 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004470}
4471
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004472VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4473 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4474 const VkImageResolve *pRegions) {
4475 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004476 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004477 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004478
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004479 skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4480 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004481
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004482 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004483 PreCmdResolveImage(commandBuffer, pRegions);
4484
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004485 get_dispatch_table(pc_device_table_map, commandBuffer)
4486 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004487 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004488}
4489
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004490VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4491 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004492 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4493 assert(my_data != NULL);
4494
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004495 skip_call |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004496
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004497 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004498 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4499 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004500}
4501
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004502VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4503 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004504 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4505 assert(my_data != NULL);
4506
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004507 skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004508
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004509 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004510 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4511 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004512}
4513
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004514VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4515 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4516 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4517 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4518 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4519 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004520 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004521 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004522
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004523 skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4524 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4525 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004526
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004527 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004528 get_dispatch_table(pc_device_table_map, commandBuffer)
4529 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4530 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004531 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004532}
4533
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004534VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4535 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4536 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4537 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4538 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4539 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004540 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004541 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004542
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004543 skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4544 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4545 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004546
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004547 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004548 get_dispatch_table(pc_device_table_map, commandBuffer)
4549 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4550 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004551 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004552}
4553
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004554VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4555 VkQueryControlFlags flags) {
4556 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004557 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4558 assert(my_data != NULL);
4559
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004560 skip_call |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004561
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004562 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004563 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4564 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004565}
4566
Chia-I Wu01ca2372016-05-13 14:37:49 +08004567VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004568 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004569 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4570 assert(my_data != NULL);
4571
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004572 skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004573
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004574 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004575 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4576 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004577}
4578
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004579VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4580 uint32_t queryCount) {
4581 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004582 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4583 assert(my_data != NULL);
4584
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004585 skip_call |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004586
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004587 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004588 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4589 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004590}
4591
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004592bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4593 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004594
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004595 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004596
4597 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004598}
4599
Chia-I Wu01ca2372016-05-13 14:37:49 +08004600VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4601 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004602 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004603 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4604 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004605
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004606 skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004607
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004608 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004609 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4610
4611 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4612 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004613}
4614
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004615VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4616 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4617 VkDeviceSize stride, VkQueryResultFlags flags) {
4618 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004619 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4620 assert(my_data != NULL);
4621
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004622 skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4623 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004624
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004625 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004626 get_dispatch_table(pc_device_table_map, commandBuffer)
4627 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4628 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004629}
4630
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004631VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4632 uint32_t offset, uint32_t size, const void *pValues) {
4633 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004634 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004635 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004636
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004637 skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004638
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004639 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004640 get_dispatch_table(pc_device_table_map, commandBuffer)
4641 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004642 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004643}
4644
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004645VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4646 VkSubpassContents contents) {
4647 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004648 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004649 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004650
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004651 skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004652
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004653 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004654 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004655 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004656}
4657
Chia-I Wu01ca2372016-05-13 14:37:49 +08004658VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004659 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004660 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4661 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004662
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004663 skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004664
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004665 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004666 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4667 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004668}
4669
Chia-I Wu01ca2372016-05-13 14:37:49 +08004670VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004671 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004672}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004673
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004674VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4675 const VkCommandBuffer *pCommandBuffers) {
4676 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004677 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004678 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004679
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004680 skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004681
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004682 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004683 get_dispatch_table(pc_device_table_map, commandBuffer)
4684 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004685 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004686}
4687
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004688VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004689 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4690}
4691
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004692VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4693 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004694 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4695}
4696
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004697VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4698 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004699 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4700 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4701
4702 return VK_ERROR_LAYER_NOT_PRESENT;
4703}
4704
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004705VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4706 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004707 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004708 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004709 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004710
4711 assert(physicalDevice);
4712
4713 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4714 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004715}
4716
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004717// WSI Extension Functions
4718
4719VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004720 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004721 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004722 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004723 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4724 assert(my_data != NULL);
4725
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004726 skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004727
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004728 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004729 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4730
4731 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4732 }
4733
4734 return result;
4735}
4736
4737VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004738 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004739 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004740 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004741 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4742 assert(my_data != NULL);
4743
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004744 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004745 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4746
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004747 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004748 result = get_dispatch_table(pc_device_table_map, device)
4749 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4750
4751 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4752 }
4753
4754 return result;
4755}
4756
4757VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004758 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004759 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004760 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004761 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4762 assert(my_data != NULL);
4763
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004764 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004765 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4766
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004767 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004768 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004769 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004770
4771 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4772 }
4773
4774 return result;
4775}
4776
4777VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4778 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004779 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004780 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4781 assert(my_data != NULL);
4782
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004783 skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004784
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004785 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004786 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4787
4788 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4789 }
4790
4791 return result;
4792}
4793
4794VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4795 VkSurfaceKHR surface, VkBool32 *pSupported) {
4796 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004797 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004798 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4799 assert(my_data != NULL);
4800
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004801 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004802 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4803
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004804 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004805 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4806 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4807
4808 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4809 }
4810
4811 return result;
4812}
4813
4814VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4815 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4816 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004817 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004818 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4819 assert(my_data != NULL);
4820
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004821 skip_call |=
4822 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004823
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004824 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004825 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4826 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4827
4828 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4829 }
4830
4831 return result;
4832}
4833
4834VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4835 uint32_t *pSurfaceFormatCount,
4836 VkSurfaceFormatKHR *pSurfaceFormats) {
4837 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004838 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004839 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4840 assert(my_data != NULL);
4841
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004842 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4843 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004844
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004845 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004846 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4847 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4848
4849 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4850 }
4851
4852 return result;
4853}
4854
4855VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4856 uint32_t *pPresentModeCount,
4857 VkPresentModeKHR *pPresentModes) {
4858 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004859 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004860 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4861 assert(my_data != NULL);
4862
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004863 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4864 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004865
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004866 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004867 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4868 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4869
4870 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4871 }
4872
4873 return result;
4874}
4875
4876#ifdef VK_USE_PLATFORM_WIN32_KHR
4877VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4878 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4879 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4880
4881 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4882 assert(my_data != NULL);
4883
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004884 bool skip_call = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004885
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004886 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004887 result =
4888 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4889 }
4890
4891 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4892
4893 return result;
4894}
4895#endif // VK_USE_PLATFORM_WIN32_KHR
4896
4897#ifdef VK_USE_PLATFORM_XCB_KHR
4898VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
4899 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4900 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4901
4902 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4903 assert(my_data != NULL);
4904
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004905 bool skip_call = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004906
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004907 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004908 result =
4909 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4910 }
4911
4912 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
4913
4914 return result;
4915}
4916
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004917VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4918 uint32_t queueFamilyIndex, xcb_connection_t *connection,
4919 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004920 VkBool32 result = false;
4921
4922 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4923 assert(my_data != NULL);
4924
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004925 bool skip_call = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
4926 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004927
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004928 if (!skip_call) {
4929 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4930 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004931 }
4932
4933 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004934}
4935#endif // VK_USE_PLATFORM_XCB_KHR
4936
4937#ifdef VK_USE_PLATFORM_XLIB_KHR
4938VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004939 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004940 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4941
4942 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4943 assert(my_data != NULL);
4944
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004945 bool skip_call = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004946
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004947 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004948 result =
4949 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4950 }
4951
4952 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
4953
4954 return result;
4955}
4956
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004957VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4958 uint32_t queueFamilyIndex, Display *dpy,
4959 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004960 VkBool32 result = false;
4961
4962 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4963 assert(my_data != NULL);
4964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004965 bool skip_call =
4966 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004967
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004968 if (!skip_call) {
4969 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4970 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004971 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06004972 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004973}
4974#endif // VK_USE_PLATFORM_XLIB_KHR
4975
4976#ifdef VK_USE_PLATFORM_MIR_KHR
4977VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004978 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004979 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4980
4981 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4982 assert(my_data != NULL);
4983
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004984 bool skip_call = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004985
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004986 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004987 result =
4988 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4989 }
4990
4991 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
4992
4993 return result;
4994}
4995
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004996VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4997 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004998 VkBool32 result = false;
4999
5000 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5001 assert(my_data != NULL);
5002
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005003 bool skip_call =
5004 parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005005
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005006 if (!skip_call) {
5007 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5008 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005009 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005010}
5011#endif // VK_USE_PLATFORM_MIR_KHR
5012
5013#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5014VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005015 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005016 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5017
5018 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5019 assert(my_data != NULL);
5020
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005021 bool skip_call = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005022
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005023 if (!skip_call) {
5024 result = get_dispatch_table(pc_instance_table_map, instance)
5025 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005026 }
5027
5028 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5029
5030 return result;
5031}
5032
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005033VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5034 uint32_t queueFamilyIndex,
5035 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005036 VkBool32 result = false;
5037
5038 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5039 assert(my_data != NULL);
5040
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005041 bool skip_call =
5042 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005043
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005044 if (!skip_call) {
5045 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5046 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005047 }
5048}
5049#endif // VK_USE_PLATFORM_WAYLAND_KHR
5050
5051#ifdef VK_USE_PLATFORM_ANDROID_KHR
5052VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005053 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005054 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5055
5056 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5057 assert(my_data != NULL);
5058
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005059 bool skip_call = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005060
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005061 if (!skip_call) {
5062 result = get_dispatch_table(pc_instance_table_map, instance)
5063 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005064 }
5065
5066 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5067
5068 return result;
5069}
5070#endif // VK_USE_PLATFORM_ANDROID_KHR
5071
Mark Youngead9b932016-09-08 12:28:38 -06005072VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5073 const VkSwapchainCreateInfoKHR *pCreateInfos,
5074 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5075 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5076 bool skip_call = false;
5077 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5078 assert(my_data != NULL);
5079
5080 skip_call |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
5081 pSwapchains);
5082
5083 if (!skip_call) {
5084 result = get_dispatch_table(pc_device_table_map, device)
5085 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5086
5087 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5088 }
5089
5090 return result;
5091}
5092
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005093// VK_EXT_debug_marker Extension
5094VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5095 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5096 bool skip_call = false;
5097 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5098 assert(my_data != NULL);
5099
5100 skip_call |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
5101
5102 if (!skip_call) {
5103 result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5104
5105 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5106 }
5107
5108 return result;
5109}
5110
5111VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5112 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5113 bool skip_call = false;
5114 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5115 assert(my_data != NULL);
5116
5117 skip_call |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
5118
5119 if (!skip_call) {
5120 VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5121
5122 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5123 }
5124
5125 return result;
5126}
5127
5128VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5129 bool skip_call = false;
5130 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5131 assert(my_data != NULL);
5132
5133 skip_call |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
5134
5135 if (!skip_call) {
5136 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5137 }
5138}
5139
5140VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5141 bool skip_call = false;
5142 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5143 assert(my_data != NULL);
5144
5145 skip_call |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
5146
5147 if (!skip_call) {
5148 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5149 }
5150}
5151
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005152// VK_NV_external_memory_capabilities Extension
5153VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5154 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5155 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5156 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5157
5158 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5159 bool skip_call = false;
5160 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5161 assert(my_data != NULL);
5162
5163 skip_call |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
5164 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5165
5166 if (!skip_call) {
5167 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5168 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
5169 externalHandleType, pExternalImageFormatProperties);
5170
5171 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5172 }
5173
5174 return result;
5175}
5176
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005177#ifdef VK_USE_PLATFORM_WIN32_KHR
5178// VK_NV_external_memory_win32 Extension
5179VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5180 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5181
5182 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5183 bool skip_call = false;
5184 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5185 assert(my_data != NULL);
5186
5187 skip_call |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
5188
5189 if (!skip_call) {
5190 result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5191 }
5192
5193 return result;
5194}
5195#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005196
5197
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005198
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005199static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005200
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005201static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005202
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005203static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005204
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005205static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005206
Chia-I Wu01ca2372016-05-13 14:37:49 +08005207VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005208 assert(device);
5209
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005210 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5211
Dustin Graves080069b2016-04-05 13:48:15 -06005212 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005213 return NULL;
5214 }
5215
Chia-I Wuf9b01382016-05-16 07:37:41 +08005216 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5217 if (proc)
5218 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005219
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005220 proc = InterceptWsiEnabledCommand(funcName, device);
5221 if (proc)
5222 return proc;
5223
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005224 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005225 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005226 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005227}
5228
Chia-I Wu01ca2372016-05-13 14:37:49 +08005229VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005230 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005231 if (!proc)
5232 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005233
5234 if (!proc)
5235 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005236
Chia-I Wu617f2a42016-05-16 07:41:17 +08005237 if (proc)
5238 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005239
Chia-I Wu617f2a42016-05-16 07:41:17 +08005240 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005241
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005242 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005243
Chia-I Wu617f2a42016-05-16 07:41:17 +08005244 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005245 if (!proc)
5246 proc = InterceptWsiEnabledCommand(funcName, instance);
5247
Chia-I Wu617f2a42016-05-16 07:41:17 +08005248 if (proc)
5249 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005250
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005251 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005252 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005253 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005254}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005255
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005256static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005257 static const struct {
5258 const char *name;
5259 PFN_vkVoidFunction proc;
5260 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005261 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5262 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5263 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5264 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5265 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5266 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5267 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5268 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5269 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5270 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5271 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5272 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5273 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5274 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5275 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5276 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5277 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005278 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005279 };
5280
5281 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5282 if (!strcmp(core_instance_commands[i].name, name))
5283 return core_instance_commands[i].proc;
5284 }
5285
5286 return nullptr;
5287}
5288
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005289static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005290 static const struct {
5291 const char *name;
5292 PFN_vkVoidFunction proc;
5293 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005294 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5295 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5296 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5297 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5298 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5299 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5300 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5301 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5302 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5303 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5304 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5305 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5306 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5307 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5308 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5309 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5310 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5311 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5312 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5313 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5314 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5315 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5316 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5317 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5318 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5319 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5320 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5321 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5322 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5323 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5324 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5325 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5326 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5327 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5328 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5329 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5330 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5331 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5332 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5333 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5334 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5335 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5336 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5337 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5338 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5339 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5340 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5341 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5342 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5343 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5344 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5345 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5346 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5347 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5348 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5349 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5350 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5351 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5352 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5353 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5354 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5355 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5356 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5357 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5358 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5359 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5360 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5361 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5362 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5363 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5364 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5365 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5366 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5367 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5368 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5369 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5370 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5371 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5372 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5373 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5374 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5375 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5376 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5377 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5378 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5379 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5380 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5381 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5382 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5383 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5384 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5385 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5386 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5387 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5388 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5389 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5390 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5391 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5392 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5393 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5394 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5395 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5396 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5397 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5398 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5399 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5400 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5401 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5402 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5403 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5404 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5405 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5406 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5407 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5408 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5409 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5410 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005411 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5412 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5413 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5414 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005415#ifdef VK_USE_PLATFORM_WIN32_KHR
5416 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5417#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005418};
5419
Chia-I Wuf9b01382016-05-16 07:37:41 +08005420
5421 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5422 if (!strcmp(core_device_commands[i].name, name))
5423 return core_device_commands[i].proc;
5424 }
5425
5426 return nullptr;
5427}
5428
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005429static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005430 static const struct {
5431 const char *name;
5432 PFN_vkVoidFunction proc;
5433 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005434 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5435 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5436 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5437 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005438 };
5439
5440 if (device) {
5441 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005442
Mark Youngead9b932016-09-08 12:28:38 -06005443 if (device_data->wsi_enabled) {
5444 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5445 if (!strcmp(wsi_device_commands[i].name, name))
5446 return wsi_device_commands[i].proc;
5447 }
5448 }
5449
5450 if (device_data->wsi_display_swapchain_enabled) {
5451 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
5452 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
5453 }
5454 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005455 }
5456
5457 return nullptr;
5458}
5459
5460static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5461 static const struct {
5462 const char *name;
5463 PFN_vkVoidFunction proc;
5464 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005465 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5466 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5467 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5468 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5469 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5470 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005471 };
5472
5473 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005474 if (instance_extension_map.size() == 0 || !instance_extension_map[pTable].wsi_enabled)
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005475 return nullptr;
5476
5477 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5478 if (!strcmp(wsi_instance_commands[i].name, name))
5479 return wsi_instance_commands[i].proc;
5480 }
5481
5482#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005483 if ((instance_extension_map[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005484 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
5485#endif // VK_USE_PLATFORM_WIN32_KHR
5486#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005487 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005488 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005489 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005490 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5491#endif // VK_USE_PLATFORM_XCB_KHR
5492#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005493 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005494 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005495 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005496 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5497#endif // VK_USE_PLATFORM_XLIB_KHR
5498#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005499 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005500 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005501 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005502 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5503#endif // VK_USE_PLATFORM_MIR_KHR
5504#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005505 if ((instance_extension_map[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005506 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005507 if ((instance_extension_map[pTable].wayland_enabled == true) &&
5508 !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005509 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5510#endif // VK_USE_PLATFORM_WAYLAND_KHR
5511#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005512 if ((instance_extension_map[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005513 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5514#endif // VK_USE_PLATFORM_ANDROID_KHR
5515
5516 return nullptr;
5517}
5518
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005519} // namespace parameter_validation
5520
5521// vk_layer_logging.h expects these to be defined
5522
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005523VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5524 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5525 const VkAllocationCallbacks *pAllocator,
5526 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005527 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005528}
5529
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005530VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5531 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005532 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005533}
5534
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005535VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5536 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5537 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005538 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005539}
5540
5541// loader-layer interface v0
5542
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005543VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5544 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005545 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005546}
5547
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005548VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5549 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005550 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005551}
5552
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005553VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5554 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005555 // the layer command handles VK_NULL_HANDLE just fine internally
5556 assert(physicalDevice == VK_NULL_HANDLE);
5557 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005558}
5559
5560VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5561 const char *pLayerName, uint32_t *pCount,
5562 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005563 // the layer command handles VK_NULL_HANDLE just fine internally
5564 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005565 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005566}
5567
5568VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005569 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005570}
5571
5572VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005573 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005574}