blob: 2bc8d3861eb8283531d7c33f5a14ba47e5029c64 [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
Dustin Gravesc900f572016-05-16 11:07:59 -06002364 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002365
Dustin Gravesc900f572016-05-16 11:07:59 -06002366 if (pCreateInfo != nullptr) {
2367 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2368 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2369 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2370 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2371 skip_call |=
2372 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2373 INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2374 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2375 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002376
Dustin Gravesc900f572016-05-16 11:07:59 -06002377 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2378 // queueFamilyIndexCount uint32_t values
2379 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2380 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2381 __LINE__, REQUIRED_PARAMETER, LayerName,
2382 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2383 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2384 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2385 }
2386
2387 // Ensure that the queue family indices were specified at device creation
2388 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2389 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2390 }
2391 }
2392
2393 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002394 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2395
Dustin Gravesc900f572016-05-16 11:07:59 -06002396 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002397 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002398
2399 return result;
2400}
2401
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002402VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
2403 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002404 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002405 assert(my_data != NULL);
2406
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002407 skip_call |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002408
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002409 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002410 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002411 }
2412}
2413
Chia-I Wu01ca2372016-05-13 14:37:49 +08002414VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2415 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002416 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002417 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002418 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002419 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002420
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002421 skip_call |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002422
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002423 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002424 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2425
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002426 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002427 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002428
2429 return result;
2430}
2431
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002432VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
2433 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002434 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002435 assert(my_data != NULL);
2436
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002437 skip_call |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002438
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002439 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002440 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002441 }
2442}
2443
Chia-I Wu01ca2372016-05-13 14:37:49 +08002444VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2445 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002446 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2447 bool skip_call = false;
2448 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002449 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002450 debug_report_data *report_data = device_data->report_data;
2451
2452 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2453
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002454 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002455 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002456 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002457 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2458 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2459 skip_call |=
2460 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2461 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2462 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2463 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002464
Dustin Gravesc900f572016-05-16 11:07:59 -06002465 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2466 // queueFamilyIndexCount uint32_t values
2467 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2468 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2469 __LINE__, REQUIRED_PARAMETER, LayerName,
2470 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2471 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2472 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2473 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002474
2475 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2476 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2477 }
2478
2479 // width, height, and depth members of extent must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002480 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2481 skip_call |=
2482 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
2483 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002484
2485 // mipLevels must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002486 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002487
2488 // arrayLayers must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002489 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002490
2491 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2492 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2493 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2494 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002495 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002496 }
2497
2498 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2499 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2500 // extent.height must be equal
2501 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2502 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002503 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2504 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2505 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2506 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002507 }
2508
2509 if (pCreateInfo->extent.depth != 1) {
2510 skip_call |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002511 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002512 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2513 }
2514 }
2515
2516 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2517 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2518 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002519 skip_call |=
2520 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2521 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2522 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002523 }
2524
2525 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2526 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2527 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2528 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002529 skip_call |=
2530 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2531 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2532 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002533 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002534 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002535
Dustin Gravesf8032f22016-05-11 18:31:44 -06002536 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002537 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2538
Dustin Gravesf8032f22016-05-11 18:31:44 -06002539 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002540 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002541
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002542 return result;
2543}
2544
Chia-I Wu01ca2372016-05-13 14:37:49 +08002545VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002546 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002547 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002548 assert(my_data != NULL);
2549
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002550 skip_call |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002551
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002552 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002553 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002554 }
2555}
2556
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002557bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2558 if (pSubresource != nullptr) {
2559 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2560 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002561 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 -06002562 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002563 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2564 return false;
2565 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002566 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002567
2568 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002569}
2570
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002571VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2572 VkSubresourceLayout *pLayout) {
2573 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002574 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002575 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002576
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002577 skip_call |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002578
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002579 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002580 PreGetImageSubresourceLayout(device, pSubresource);
2581
2582 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002583 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002584}
2585
Chia-I Wu01ca2372016-05-13 14:37:49 +08002586VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2587 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002588 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002589 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002590 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002591 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002592 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002593
Dustin Graves0b70a632016-04-27 17:44:56 -06002594 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002595
Dustin Graves0b70a632016-04-27 17:44:56 -06002596 if (pCreateInfo != nullptr) {
2597 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002598 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2599 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002600 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2601 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2602 "pCreateInfo->subresourceRange.layerCount must be 1",
2603 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2604 }
2605 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002606 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2607 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2608 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002609 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2610 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2611 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2612 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2613 }
2614 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002615 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2616 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002617 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2618 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2619 "pCreateInfo->subresourceRange.layerCount must be 6");
2620 }
2621 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002622 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2623 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002624 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2625 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2626 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2627 }
2628 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2629 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2630 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_3D, "
2632 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2633 }
2634
Dustin Graves2a80dc62016-07-12 13:57:02 -06002635 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
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_3D, "
2639 "pCreateInfo->subresourceRange.layerCount must be 1");
2640 }
2641 }
2642 }
2643
2644 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002645 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2646
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002647 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002648 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002649
2650 return result;
2651}
2652
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002653VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
2654 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002655 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002656 assert(my_data != NULL);
2657
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002658 skip_call |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002659
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002660 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002661 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002662 }
2663}
2664
Chia-I Wu01ca2372016-05-13 14:37:49 +08002665VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002666 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002667 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002668 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002669 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002670 assert(my_data != NULL);
2671
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002672 skip_call |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002673
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002674 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002675 result =
2676 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002677
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002678 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002679 }
2680
Michael Lentine03d8e572015-09-15 14:59:14 -05002681 return result;
2682}
2683
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002684VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2685 const VkAllocationCallbacks *pAllocator) {
2686 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002687 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002688 assert(my_data != NULL);
2689
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002690 skip_call |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002691
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002692 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002693 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002694 }
2695}
2696
Chia-I Wu01ca2372016-05-13 14:37:49 +08002697VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002698 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002699 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002700 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002701 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002702 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002703
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002704 skip_call |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002705
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002706 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002707 result =
2708 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002709
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002710 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002711 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002712
2713 return result;
2714}
2715
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002716VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2717 const VkAllocationCallbacks *pAllocator) {
2718 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002719 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002720 assert(my_data != NULL);
2721
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002722 skip_call |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002723
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002724 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002725 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002726 }
2727}
2728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002729VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2730 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002731 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002732 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002733 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002734 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002735
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002736 skip_call |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002737
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002738 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002739 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2740
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002741 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002742 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002743
2744 return result;
2745}
2746
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002747VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2748 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002749 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002750 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002751 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002752 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002753
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002754 skip_call |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002755
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002756 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002757 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2758
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002759 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002760 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002761
2762 return result;
2763}
2764
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002765bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002766 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2767
2768 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002769 if (pCreateInfos != nullptr) {
2770 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2771 if (pCreateInfos->basePipelineIndex != -1) {
2772 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002773 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 -06002774 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002775 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2776 "pCreateInfos->flags "
2777 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2778 return false;
2779 }
2780 }
2781
2782 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2783 if (pCreateInfos->basePipelineIndex != -1) {
2784 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06002785 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002786 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002787 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2788 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2789 "VK_NULL_HANDLE");
2790 return false;
2791 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002792 }
2793 }
2794
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002795 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002796 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Dustin Gravesf233e502016-05-05 13:44:21 -06002797 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 -06002798 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002799 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2800 "unrecognized enumerator");
2801 return false;
2802 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002803
2804 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2805 (data->physical_device_features.fillModeNonSolid == false)) {
2806 log_msg(
2807 mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2808 DEVICE_FEATURE, LayerName,
2809 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2810 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2811 return false;
2812 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002813 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002814
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002815 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002816 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002817 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2818 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002819 pCreateInfos[i].pStages[j].pName);
2820 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002821 }
2822
2823 return true;
2824}
2825
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002826VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2827 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2828 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002829 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002830 bool skip_call = false;
2831 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2832 assert(device_data != nullptr);
2833 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002834
Dustin Gravesc900f572016-05-16 11:07:59 -06002835 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2836 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002837
Dustin Gravesc900f572016-05-16 11:07:59 -06002838 if (pCreateInfos != nullptr) {
2839 for (uint32_t i = 0; i < createInfoCount; ++i) {
2840 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2841 if (pCreateInfos[i].pTessellationState == nullptr) {
2842 if (pCreateInfos[i].pStages != nullptr) {
2843 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2844 // pTessellationState must not be NULL
2845 bool has_control = false;
2846 bool has_eval = false;
2847
2848 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2849 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2850 has_control = true;
2851 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2852 has_eval = true;
2853 }
2854 }
2855
2856 if (has_control && has_eval) {
2857 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2858 __LINE__, REQUIRED_PARAMETER, LayerName,
2859 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2860 "control shader stage and a tessellation evaluation shader stage, "
2861 "pCreateInfos[%d].pTessellationState must not be NULL",
2862 i, i);
2863 }
2864 }
Dustin Graves629259b2016-05-30 16:14:27 -06002865 } else {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002866 skip_call |= validate_struct_pnext(
2867 report_data, "vkCreateGraphicsPipelines",
2868 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2869 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002870
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002871 skip_call |= validate_reserved_flags(
2872 report_data, "vkCreateGraphicsPipelines",
2873 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2874 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002875
2876 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2877 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2878 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2879 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2880 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2881 i);
2882 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002883 }
2884
2885 if (pCreateInfos[i].pViewportState == nullptr) {
2886 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2887 // valid VkPipelineViewportStateCreateInfo structure
2888 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2889 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2890 skip_call |= log_msg(
2891 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2892 REQUIRED_PARAMETER, LayerName,
2893 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2894 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2895 i, i);
2896 }
2897 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002898 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002899 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2900 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2901 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002902
2903 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002904 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2905 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002906 pCreateInfos[i].pViewportState->flags);
2907
Dustin Gravesc900f572016-05-16 11:07:59 -06002908 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2909 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2910 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2911 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2912 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2913 i);
2914 }
2915
2916 if (pCreateInfos[i].pDynamicState != nullptr) {
2917 bool has_dynamic_viewport = false;
2918 bool has_dynamic_scissor = false;
2919
2920 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2921 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2922 has_dynamic_viewport = true;
2923 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2924 has_dynamic_scissor = true;
2925 }
2926 }
2927
2928 // viewportCount must be greater than 0
2929 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2930 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2931 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2932 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002933 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2934 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002935 "must be greater than 0",
2936 i, i);
2937 }
2938
2939 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2940 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2941 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2942 skip_call |=
2943 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2944 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002945 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002946 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2947 i, i);
2948 }
2949
2950 // scissorCount must be greater than 0
2951 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2952 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2953 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2954 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002955 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2956 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002957 "must be greater than 0",
2958 i, i);
2959 }
2960
2961 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2962 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2963 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2964 skip_call |=
2965 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2966 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002967 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002968 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2969 i, i);
2970 }
2971 }
2972 }
2973
2974 if (pCreateInfos[i].pMultisampleState == nullptr) {
2975 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2976 // a valid VkPipelineMultisampleStateCreateInfo structure
2977 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2978 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2979 skip_call |=
2980 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2981 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2982 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2983 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2984 i, i);
2985 }
Dustin Graves629259b2016-05-30 16:14:27 -06002986 } else {
2987 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002988 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2989 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002990 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002991
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002992 skip_call |= validate_reserved_flags(
2993 report_data, "vkCreateGraphicsPipelines",
2994 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
2995 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002996
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002997 skip_call |= validate_bool32(
2998 report_data, "vkCreateGraphicsPipelines",
2999 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
3000 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003001
3002 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003003 report_data, "vkCreateGraphicsPipelines",
3004 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3005 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3006 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3007 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003008
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003009 skip_call |= validate_bool32(
3010 report_data, "vkCreateGraphicsPipelines",
3011 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3012 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003013
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003014 skip_call |= validate_bool32(
3015 report_data, "vkCreateGraphicsPipelines",
3016 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3017 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003018
3019 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3020 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3021 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3022 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3023 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3024 i);
3025 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003026 }
3027
3028 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003029 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003030 skip_call |= validate_struct_pnext(
3031 report_data, "vkCreateGraphicsPipelines",
3032 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3033 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003034
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003035 skip_call |= validate_reserved_flags(
3036 report_data, "vkCreateGraphicsPipelines",
3037 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3038 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003039
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003040 skip_call |= validate_bool32(
3041 report_data, "vkCreateGraphicsPipelines",
3042 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3043 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003044
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003045 skip_call |= validate_bool32(
3046 report_data, "vkCreateGraphicsPipelines",
3047 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3048 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003049
3050 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003051 report_data, "vkCreateGraphicsPipelines",
3052 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3053 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3054 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003055
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003056 skip_call |= validate_bool32(
3057 report_data, "vkCreateGraphicsPipelines",
3058 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3059 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003060
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003061 skip_call |= validate_bool32(
3062 report_data, "vkCreateGraphicsPipelines",
3063 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3064 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003065
3066 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003067 report_data, "vkCreateGraphicsPipelines",
3068 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3069 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3070 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003071
3072 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003073 report_data, "vkCreateGraphicsPipelines",
3074 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3075 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3076 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003077
3078 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003079 report_data, "vkCreateGraphicsPipelines",
3080 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3081 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3082 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003083
3084 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003085 report_data, "vkCreateGraphicsPipelines",
3086 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3087 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3088 pCreateInfos[i].pDepthStencilState->front.compareOp);
3089
3090 skip_call |= validate_ranged_enum(
3091 report_data, "vkCreateGraphicsPipelines",
3092 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003093 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3094
3095 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003096 report_data, "vkCreateGraphicsPipelines",
3097 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003098 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3099
3100 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003101 report_data, "vkCreateGraphicsPipelines",
3102 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3103 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3104 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003105
3106 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003107 report_data, "vkCreateGraphicsPipelines",
3108 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3109 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3110 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003111
3112 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3113 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3114 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3115 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3116 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3117 i);
3118 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003119 }
3120
3121 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3122 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003123 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003124 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3125 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3126 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003127
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003128 skip_call |= validate_reserved_flags(
3129 report_data, "vkCreateGraphicsPipelines",
3130 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3131 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003132
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003133 skip_call |= validate_bool32(
3134 report_data, "vkCreateGraphicsPipelines",
3135 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3136 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003137
3138 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003139 report_data, "vkCreateGraphicsPipelines",
3140 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3141 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3142 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003143
3144 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3145 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3146 ++attachmentIndex) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003147 skip_call |=
3148 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3149 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3150 ParameterName::IndexVector{i, attachmentIndex}),
3151 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003152
3153 skip_call |= validate_ranged_enum(
3154 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003155 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3156 ParameterName::IndexVector{i, attachmentIndex}),
3157 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003158 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3159
3160 skip_call |= validate_ranged_enum(
3161 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003162 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3163 ParameterName::IndexVector{i, attachmentIndex}),
3164 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003165 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3166
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003167 skip_call |=
3168 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3169 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3170 ParameterName::IndexVector{i, attachmentIndex}),
3171 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3172 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003173
3174 skip_call |= validate_ranged_enum(
3175 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003176 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3177 ParameterName::IndexVector{i, attachmentIndex}),
3178 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003179 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3180
3181 skip_call |= validate_ranged_enum(
3182 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003183 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3184 ParameterName::IndexVector{i, attachmentIndex}),
3185 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003186 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3187
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003188 skip_call |=
3189 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3190 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3191 ParameterName::IndexVector{i, attachmentIndex}),
3192 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3193 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003194
3195 skip_call |=
3196 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003197 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3198 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003199 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3200 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3201 }
3202 }
3203
Dustin Gravesc900f572016-05-16 11:07:59 -06003204 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3205 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3206 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3207 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3208 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3209 i);
3210 }
3211
3212 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3213 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3214 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003215 report_data, "vkCreateGraphicsPipelines",
3216 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003217 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3218 }
3219 }
3220 }
3221 }
3222
3223 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003224 PreCreateGraphicsPipelines(device, pCreateInfos);
3225
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003226 result = get_dispatch_table(pc_device_table_map, device)
3227 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003228
Dustin Gravesc900f572016-05-16 11:07:59 -06003229 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003230 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003231
3232 return result;
3233}
3234
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003235bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003236 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3237
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003238 if (pCreateInfos != nullptr) {
3239 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003240 uint32_t i = 0;
3241 validate_string(data->report_data, "vkCreateComputePipelines",
3242 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003243 }
3244
3245 return true;
3246}
3247
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003248VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3249 const VkComputePipelineCreateInfo *pCreateInfos,
3250 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003251 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003252 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003253 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003254 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003255
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003256 skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3257 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003258
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003259 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003260 PreCreateComputePipelines(device, pCreateInfos);
3261
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003262 result = get_dispatch_table(pc_device_table_map, device)
3263 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003264
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003265 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003266 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003267
3268 return result;
3269}
3270
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003271VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3272 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003273 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003274 assert(my_data != NULL);
3275
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003276 skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003277
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003278 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003279 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003280 }
3281}
3282
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003283VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3284 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003285 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003286 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003287 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003288 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003289
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003290 skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003291
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003292 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003293 result =
3294 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003295
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003296 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003297 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003298
3299 return result;
3300}
3301
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003302VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3303 const VkAllocationCallbacks *pAllocator) {
3304 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003305 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003306 assert(my_data != NULL);
3307
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003308 skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003309
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003310 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003311 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003312 }
3313}
3314
Chia-I Wu01ca2372016-05-13 14:37:49 +08003315VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3316 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003317 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003318 bool skip_call = false;
3319 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3320 assert(device_data != NULL);
3321 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003322
Dustin Gravesc900f572016-05-16 11:07:59 -06003323 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003324
Dustin Gravesc900f572016-05-16 11:07:59 -06003325 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3326 if (pCreateInfo != nullptr) {
3327 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3328 if (pCreateInfo->compareEnable == VK_TRUE) {
3329 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3330 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3331 }
3332
3333 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3334 // valid VkBorderColor value
3335 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3336 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3337 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3338 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3339 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3340 }
3341 }
3342
3343 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003344 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3345
Dustin Gravesc900f572016-05-16 11:07:59 -06003346 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003347 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003348
3349 return result;
3350}
3351
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003352VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3353 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003354 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003355 assert(my_data != NULL);
3356
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003357 skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003358
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003359 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003360 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003361 }
3362}
3363
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003364VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3365 const VkAllocationCallbacks *pAllocator,
3366 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003367 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003368 bool skip_call = false;
3369 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3370 assert(device_data != nullptr);
3371 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003372
Dustin Gravesc900f572016-05-16 11:07:59 -06003373 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003374
Dustin Gravesc900f572016-05-16 11:07:59 -06003375 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3376 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3377 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3378 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3379 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3380 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3381 // valid VkSampler handles
3382 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3383 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3384 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3385 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3386 ++descriptor_index) {
3387 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3388 skip_call |=
3389 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3390 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3391 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3392 " specified as VK_NULL_HANDLE",
3393 i, descriptor_index);
3394 }
3395 }
3396 }
3397
3398 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3399 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3400 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3401 skip_call |=
3402 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3403 UNRECOGNIZED_VALUE, LayerName,
3404 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3405 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3406 i, i);
3407 }
3408 }
3409 }
3410 }
3411
3412 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003413 result =
3414 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003415
Dustin Gravesc900f572016-05-16 11:07:59 -06003416 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003417 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003418
3419 return result;
3420}
3421
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003422VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3423 const VkAllocationCallbacks *pAllocator) {
3424 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003425 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003426 assert(my_data != NULL);
3427
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003428 skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003429
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003430 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003431 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003432 }
3433}
3434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003435VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3436 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003437 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003438 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003439 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003440 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003441
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003442 skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003443
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003444 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3445
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003446 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003447 result =
3448 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003449
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003450 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003451 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003452
3453 return result;
3454}
3455
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003456VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3457 const VkAllocationCallbacks *pAllocator) {
3458 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003459 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003460 assert(my_data != NULL);
3461
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003462 skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003463
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003464 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003465 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003466 }
3467}
3468
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003469VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3470 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003471 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003472 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003473 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3474 assert(my_data != NULL);
3475
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003476 skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003477
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003478 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003479 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3480
3481 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3482 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003483
3484 return result;
3485}
3486
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003487VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3488 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003489 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003490 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003491 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003492 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003493
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003494 skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003495
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003496 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003497 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3498
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003499 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003500 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003501
3502 return result;
3503}
3504
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003505VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003506 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003507 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003508 bool skip_call = false;
3509 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3510 assert(device_data != nullptr);
3511 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003512
Dustin Gravesc900f572016-05-16 11:07:59 -06003513 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003514
Dustin Gravesc900f572016-05-16 11:07:59 -06003515 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3516 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3517 // validate_array()
3518 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3519 pDescriptorSets, true, true);
3520
3521 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003522 result = get_dispatch_table(pc_device_table_map, device)
3523 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003524
Dustin Gravesc900f572016-05-16 11:07:59 -06003525 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003526 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003527
3528 return result;
3529}
3530
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003531VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3532 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3533 const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003534 bool skip_call = false;
3535 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3536 assert(device_data != NULL);
3537 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003538
Dustin Gravesc900f572016-05-16 11:07:59 -06003539 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3540 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003541
Dustin Gravesc900f572016-05-16 11:07:59 -06003542 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3543 if (pDescriptorWrites != NULL) {
3544 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3545 // descriptorCount must be greater than 0
3546 if (pDescriptorWrites[i].descriptorCount == 0) {
3547 skip_call |=
3548 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3549 REQUIRED_PARAMETER, LayerName,
3550 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3551 }
3552
3553 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3554 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3555 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3556 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3557 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3558 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3559 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3560 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3561 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3562 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3563 __LINE__, REQUIRED_PARAMETER, LayerName,
3564 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3565 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3566 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3567 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3568 i, i);
3569 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3570 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3571 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3572 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3573 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3574 ++descriptor_index) {
3575 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003576 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3577 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003578 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3579 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003580 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3581 ParameterName::IndexVector{i, descriptor_index}),
3582 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003583 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3584 }
3585 }
3586 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3587 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3588 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3589 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3590 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3591 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3592 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3593 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3594 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3595 __LINE__, REQUIRED_PARAMETER, LayerName,
3596 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3597 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3598 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3599 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3600 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003601 } else {
3602 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3603 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003604 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3605 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003606 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3607 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003608 }
3609 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3610 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3611 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3612 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3613 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3614 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3615 __LINE__, REQUIRED_PARAMETER, LayerName,
3616 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3617 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3618 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3619 i, i);
3620 } else {
3621 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3622 ++descriptor_index) {
3623 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003624 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3625 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003626 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3627 }
3628 }
3629 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003630
3631 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3632 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3633 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3634 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3635 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3636 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3637 skip_call |=
3638 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003639 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003640 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3641 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3642 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3643 }
3644 }
3645 }
3646 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3647 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3648 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3649 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3650 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3651 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3652 skip_call |=
3653 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003654 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003655 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3656 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3657 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3658 }
3659 }
3660 }
3661 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003662 }
3663 }
3664
3665 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003666 get_dispatch_table(pc_device_table_map, device)
3667 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003668 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003669}
3670
Chia-I Wu01ca2372016-05-13 14:37:49 +08003671VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003672 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003673 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003674 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003675 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003676 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003677
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003678 skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003679
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003680 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003681 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3682
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003683 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003684 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003685
3686 return result;
3687}
3688
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003689VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3690 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003691 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003692 assert(my_data != NULL);
3693
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003694 skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003695
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003696 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003697 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003698 }
3699}
3700
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003701bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3702 bool skip_call = false;
3703 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3704
3705 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3706 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3707 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 -06003708 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003709 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3710 }
3711 }
3712 return skip_call;
3713}
3714
Chia-I Wu01ca2372016-05-13 14:37:49 +08003715VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003716 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003717 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003718 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003719 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003720 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003721
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003722 skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3723 skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003724
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003725 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003726 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3727
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003728 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003729 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003730
3731 return result;
3732}
3733
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003734VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
3735 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003736 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003737 assert(my_data != NULL);
3738
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003739 skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003740
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003741 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003742 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003743 }
3744}
3745
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003746VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3747 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003748 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003749 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003750
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003751 skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003752
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003753 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003754 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003755 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003756}
3757
Chia-I Wu01ca2372016-05-13 14:37:49 +08003758VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003759 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003760 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003761 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003762 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003763 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003764
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003765 skip_call |=
Dustin Gravesde628532016-04-21 16:30:17 -06003766 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003767
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003768 skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003769
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003770 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003771 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3772
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003773 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003774 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003775
3776 return result;
3777}
3778
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003779VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3780 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003781 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003782 assert(my_data != NULL);
3783
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003784 skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003786 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003787 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003788 }
3789}
3790
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003791VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003792 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003793 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003794 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3795 assert(my_data != NULL);
3796
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003797 skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003798
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003799 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003800 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3801
3802 validate_result(my_data->report_data, "vkResetCommandPool", result);
3803 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003804
3805 return result;
3806}
3807
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003808VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3809 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003810 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003811 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003812 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003813 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003814
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003815 skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003816
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003817 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003818 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3819
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003820 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003821 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003822
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003823 return result;
3824}
3825
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003826VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003827 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003828 bool skip_call = false;
3829 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3830 assert(device_data != nullptr);
3831 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003832
Dustin Gravesc900f572016-05-16 11:07:59 -06003833 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003834
Dustin Gravesc900f572016-05-16 11:07:59 -06003835 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3836 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3837 // validate_array()
3838 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3839 pCommandBuffers, true, true);
3840
3841 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003842 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003843 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003844 }
3845}
3846
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003847bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3848 bool skip_call = false;
3849 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3850 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3851
3852 if (pInfo != NULL) {
3853 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3854 skip_call |=
3855 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 -06003856 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003857 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3858 "inheritedQueries.");
3859 }
3860
3861 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3862 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3863 skip_call |=
3864 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 -06003865 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003866 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3867 "valid combination of VkQueryControlFlagBits.",
3868 pInfo->queryFlags);
3869 }
3870 }
3871 return skip_call;
3872}
3873
3874VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003875 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003876 bool skip_call = false;
3877 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3878 assert(device_data != nullptr);
3879 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003880
Dustin Gravesc900f572016-05-16 11:07:59 -06003881 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003882
Dustin Gravesc900f572016-05-16 11:07:59 -06003883 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3884 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3885 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3886 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3887 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3888
3889 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003890 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003891 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003892
3893 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3894 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3895
Dustin Gravesc900f572016-05-16 11:07:59 -06003896 // TODO: This only needs to be validated when the inherited queries feature is enabled
3897 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3898 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3899
3900 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3901 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3902 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3903 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3904 }
3905
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003906 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3907
Dustin Gravesc900f572016-05-16 11:07:59 -06003908 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003909 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3910
Dustin Gravesc900f572016-05-16 11:07:59 -06003911 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003912 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003913
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003914 return result;
3915}
3916
Chia-I Wu01ca2372016-05-13 14:37:49 +08003917VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003918 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3919 assert(my_data != NULL);
3920
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003921 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003922
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003923 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003924
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003925 return result;
3926}
3927
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003928VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003929 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003930 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3931 assert(my_data != NULL);
3932
Dustin Graves16d18972016-05-09 17:36:57 -06003933 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003934
Dustin Graves16d18972016-05-09 17:36:57 -06003935 if (!skip_call) {
3936 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3937
3938 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3939 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003940
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003941 return result;
3942}
3943
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003944VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3945 VkPipeline pipeline) {
3946 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003947 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3948 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003949
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003950 skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003951
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003952 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003953 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3954 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003955}
3956
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003957VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3958 const VkViewport *pViewports) {
3959 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003960 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003961 assert(my_data != NULL);
3962
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003963 skip_call |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003965 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003966 get_dispatch_table(pc_device_table_map, commandBuffer)
3967 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003968 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003969}
3970
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003971VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3972 const VkRect2D *pScissors) {
3973 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003974 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003975 assert(my_data != NULL);
3976
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003977 skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003978
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003979 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003980 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3981 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003982}
3983
Chia-I Wu01ca2372016-05-13 14:37:49 +08003984VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003985 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003986}
3987
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003988VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
3989 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003990 get_dispatch_table(pc_device_table_map, commandBuffer)
3991 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003992}
3993
Chia-I Wu01ca2372016-05-13 14:37:49 +08003994VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003995 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003996 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003997 assert(my_data != NULL);
3998
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003999 skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004000
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004001 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004002 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4003 }
Cody Northrop12365112015-08-17 11:10:49 -06004004}
4005
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004006VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004007 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004008}
4009
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004010VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4011 uint32_t compareMask) {
4012 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004013 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4014 assert(my_data != NULL);
4015
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004016 skip_call |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004017
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004018 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004019 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4020 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004021}
4022
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004023VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
4024 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004025 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4026 assert(my_data != NULL);
4027
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004028 skip_call |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004029
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004030 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004031 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4032 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004033}
4034
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004035VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
4036 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004037 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4038 assert(my_data != NULL);
4039
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004040 skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004041
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004042 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004043 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4044 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004045}
4046
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004047VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4048 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4049 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4050 const uint32_t *pDynamicOffsets) {
4051 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004052 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004053 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004054
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004055 skip_call |=
4056 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4057 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004058
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004059 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004060 get_dispatch_table(pc_device_table_map, commandBuffer)
4061 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4062 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004063 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004064}
4065
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004066VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4067 VkIndexType indexType) {
4068 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004069 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4070 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004071
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004072 skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004073
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004074 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004075 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4076 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004077}
4078
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004079VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4080 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4081 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004082 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004083 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004084
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004085 skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004086
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004087 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004088 get_dispatch_table(pc_device_table_map, commandBuffer)
4089 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004090 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004091}
4092
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004093bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4094 uint32_t firstInstance) {
Michael Lentine55a913f2015-11-24 09:48:23 -06004095 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004096 // 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 -07004097 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004098 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 -06004099 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004100 return false;
4101 }
4102
4103 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004104 // 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 -07004105 // this an error or leave as is.
Dustin Gravesf233e502016-05-05 13:44:21 -06004106 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 -06004107 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004108 return false;
4109 }
4110
4111 return true;
4112}
4113
Chia-I Wu01ca2372016-05-13 14:37:49 +08004114VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4115 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004116 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004117
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004118 get_dispatch_table(pc_device_table_map, commandBuffer)
4119 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004120}
4121
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004122VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4123 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004124 get_dispatch_table(pc_device_table_map, commandBuffer)
4125 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004126}
4127
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004128VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4129 uint32_t stride) {
4130 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004131 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4132 assert(my_data != NULL);
4133
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004134 skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004135
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004136 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004137 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4138 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004139}
4140
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004141VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4142 uint32_t count, 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_vkCmdDrawIndexedIndirect(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)
4151 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4152 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004153}
4154
Chia-I Wu01ca2372016-05-13 14:37:49 +08004155VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004156 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004157}
4158
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004159VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4160 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004161 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4162 assert(my_data != NULL);
4163
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004164 skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004165
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004166 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004167 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4168 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004169}
4170
Chia-I Wu01ca2372016-05-13 14:37:49 +08004171VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4172 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004173 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004174 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004175 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004176
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004177 skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004178
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004179 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004180 get_dispatch_table(pc_device_table_map, commandBuffer)
4181 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004182 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004183}
4184
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004185bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4186 if (pRegions != nullptr) {
4187 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4188 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004189 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 -06004190 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004191 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4192 return false;
4193 }
4194 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4195 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004196 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 -06004197 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004198 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4199 return false;
4200 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004201 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004202
4203 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004204}
4205
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004206VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4207 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4208 const VkImageCopy *pRegions) {
4209 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004210 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004211 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004212
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004213 skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4214 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004215
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004216 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004217 PreCmdCopyImage(commandBuffer, pRegions);
4218
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004219 get_dispatch_table(pc_device_table_map, commandBuffer)
4220 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004221 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004222}
4223
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004224bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4225 if (pRegions != nullptr) {
4226 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4227 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004228 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 -06004229 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004230 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4231 return false;
4232 }
4233 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4234 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004235 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 -06004236 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004237 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4238 return false;
4239 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004240 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004241
4242 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004243}
4244
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004245VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4246 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4247 const VkImageBlit *pRegions, VkFilter filter) {
4248 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004249 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004250 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004251
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004252 skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4253 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004254
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004255 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004256 PreCmdBlitImage(commandBuffer, pRegions);
4257
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004258 get_dispatch_table(pc_device_table_map, commandBuffer)
4259 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004260 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004261}
4262
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004263bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4264 if (pRegions != nullptr) {
4265 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4266 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004267 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 -06004268 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004269 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4270 "enumerator");
4271 return false;
4272 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004273 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004274
4275 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004276}
4277
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004278VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4279 VkImageLayout dstImageLayout, uint32_t regionCount,
4280 const VkBufferImageCopy *pRegions) {
4281 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004282 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004283 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004284
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004285 skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4286 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004287
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004288 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004289 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4290
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004291 get_dispatch_table(pc_device_table_map, commandBuffer)
4292 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004293 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004294}
4295
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004296bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4297 if (pRegions != nullptr) {
4298 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4299 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Dustin Gravesf233e502016-05-05 13:44:21 -06004300 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 -06004301 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004302 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4303 "enumerator");
4304 return false;
4305 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004306 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004307
4308 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004309}
4310
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004311VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4312 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4313 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004314 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004315 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004316
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004317 skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4318 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004319
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004320 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004321 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4322
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004323 get_dispatch_table(pc_device_table_map, commandBuffer)
4324 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004325 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004326}
4327
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004328VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4329 VkDeviceSize dataSize, const uint32_t *pData) {
4330 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004331 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004332 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004333
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004334 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004335
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004336 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004337 skip_call |= log_msg(
4338 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4339 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004340 }
4341
4342 if ((dataSize <= 0) || (dataSize > 65536)) {
4343 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 -06004344 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4345 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004346 dataSize);
4347 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004348 skip_call |= log_msg(
4349 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4350 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004351 }
4352
4353 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004354 get_dispatch_table(pc_device_table_map, commandBuffer)
4355 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004356 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004357}
4358
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004359VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4360 VkDeviceSize size, uint32_t data) {
4361 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004362 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4363 assert(my_data != NULL);
4364
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004365 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004366
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004367 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004368 skip_call |= log_msg(
4369 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4370 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004371 }
4372
4373 if (size != VK_WHOLE_SIZE) {
4374 if (size <= 0) {
4375 skip_call |= log_msg(
4376 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004377 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004378 } else if (size & 3) {
4379 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 -06004380 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004381 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4382 }
4383 }
4384
4385 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004386 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4387 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004388}
4389
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004390VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4391 const VkClearColorValue *pColor, uint32_t rangeCount,
4392 const VkImageSubresourceRange *pRanges) {
4393 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004394 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004395 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004396
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004397 skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004398
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004399 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004400 get_dispatch_table(pc_device_table_map, commandBuffer)
4401 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004402 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004403}
4404
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004405VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4406 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4407 const VkImageSubresourceRange *pRanges) {
4408 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004409 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004410 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004411
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004412 skip_call |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4413 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004414
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004415 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004416 get_dispatch_table(pc_device_table_map, commandBuffer)
4417 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004418 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004419}
4420
Chia-I Wu01ca2372016-05-13 14:37:49 +08004421VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4422 const VkClearAttachment *pAttachments, uint32_t rectCount,
4423 const VkClearRect *pRects) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004424 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004425 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004426 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004427
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004428 skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004429
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004430 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004431 get_dispatch_table(pc_device_table_map, commandBuffer)
4432 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004433 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004434}
4435
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004436bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4437 if (pRegions != nullptr) {
4438 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4439 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4440 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004441 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004442 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004443 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4444 return false;
4445 }
4446 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4447 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4448 log_msg(
Dustin Gravesf233e502016-05-05 13:44:21 -06004449 mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004450 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004451 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4452 return false;
4453 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004454 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004455
4456 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004457}
4458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004459VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4460 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4461 const VkImageResolve *pRegions) {
4462 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004463 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004464 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004465
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004466 skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4467 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004468
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004469 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004470 PreCmdResolveImage(commandBuffer, pRegions);
4471
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004472 get_dispatch_table(pc_device_table_map, commandBuffer)
4473 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004474 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004475}
4476
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004477VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4478 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004479 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4480 assert(my_data != NULL);
4481
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004482 skip_call |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004483
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004484 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004485 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4486 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004487}
4488
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004489VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4490 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004491 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4492 assert(my_data != NULL);
4493
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004494 skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004495
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004496 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004497 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4498 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004499}
4500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004501VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4502 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4503 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4504 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4505 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4506 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004507 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004508 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004509
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004510 skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4511 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4512 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004513
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004514 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004515 get_dispatch_table(pc_device_table_map, commandBuffer)
4516 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4517 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004518 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004519}
4520
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004521VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4522 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4523 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4524 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4525 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4526 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004527 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004528 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004529
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004530 skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4531 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4532 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004533
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004534 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004535 get_dispatch_table(pc_device_table_map, commandBuffer)
4536 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4537 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004538 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004539}
4540
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004541VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4542 VkQueryControlFlags flags) {
4543 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004544 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4545 assert(my_data != NULL);
4546
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004547 skip_call |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004548
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004549 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004550 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4551 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004552}
4553
Chia-I Wu01ca2372016-05-13 14:37:49 +08004554VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004555 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004556 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4557 assert(my_data != NULL);
4558
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004559 skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004560
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004561 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004562 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4563 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004564}
4565
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004566VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4567 uint32_t queryCount) {
4568 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_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
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)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4576 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004577}
4578
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004579bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4580 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004581
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004582 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004583
4584 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004585}
4586
Chia-I Wu01ca2372016-05-13 14:37:49 +08004587VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4588 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004589 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004590 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4591 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004592
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004593 skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004594
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004595 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004596 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4597
4598 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4599 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004600}
4601
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004602VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4603 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4604 VkDeviceSize stride, VkQueryResultFlags flags) {
4605 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004606 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4607 assert(my_data != NULL);
4608
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004609 skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4610 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004611
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004612 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004613 get_dispatch_table(pc_device_table_map, commandBuffer)
4614 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4615 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004616}
4617
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004618VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4619 uint32_t offset, uint32_t size, const void *pValues) {
4620 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004621 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004622 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004623
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004624 skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004625
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004626 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004627 get_dispatch_table(pc_device_table_map, commandBuffer)
4628 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004629 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004630}
4631
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004632VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4633 VkSubpassContents contents) {
4634 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004635 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004636 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004637
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004638 skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004639
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004640 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004641 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004642 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004643}
4644
Chia-I Wu01ca2372016-05-13 14:37:49 +08004645VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004646 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004647 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4648 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004649
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004650 skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004651
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004652 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004653 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4654 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004655}
4656
Chia-I Wu01ca2372016-05-13 14:37:49 +08004657VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004658 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004659}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004660
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004661VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4662 const VkCommandBuffer *pCommandBuffers) {
4663 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004664 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004665 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004666
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004667 skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004668
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004669 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004670 get_dispatch_table(pc_device_table_map, commandBuffer)
4671 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004672 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004673}
4674
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004675VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004676 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4677}
4678
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004679VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4680 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004681 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4682}
4683
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004684VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4685 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004686 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4687 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4688
4689 return VK_ERROR_LAYER_NOT_PRESENT;
4690}
4691
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004692VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4693 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004694 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004695 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004696 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004697
4698 assert(physicalDevice);
4699
4700 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4701 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004702}
4703
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004704// WSI Extension Functions
4705
4706VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004707 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004708 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004709 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004710 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4711 assert(my_data != NULL);
4712
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004713 skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004714
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004715 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004716 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4717
4718 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4719 }
4720
4721 return result;
4722}
4723
4724VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004725 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004726 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004727 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004728 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4729 assert(my_data != NULL);
4730
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004731 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004732 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4733
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004734 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004735 result = get_dispatch_table(pc_device_table_map, device)
4736 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4737
4738 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4739 }
4740
4741 return result;
4742}
4743
4744VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004745 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004746 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004747 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004748 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4749 assert(my_data != NULL);
4750
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004751 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004752 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4753
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004754 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004755 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004756 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004757
4758 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4759 }
4760
4761 return result;
4762}
4763
4764VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4765 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004766 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004767 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4768 assert(my_data != NULL);
4769
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004770 skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004771
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004772 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004773 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4774
4775 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4776 }
4777
4778 return result;
4779}
4780
4781VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4782 VkSurfaceKHR surface, VkBool32 *pSupported) {
4783 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004784 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004785 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4786 assert(my_data != NULL);
4787
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004788 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004789 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4790
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004791 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004792 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4793 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4794
4795 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4796 }
4797
4798 return result;
4799}
4800
4801VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4802 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4803 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004804 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004805 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4806 assert(my_data != NULL);
4807
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004808 skip_call |=
4809 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004810
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004811 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004812 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4813 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4814
4815 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4816 }
4817
4818 return result;
4819}
4820
4821VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4822 uint32_t *pSurfaceFormatCount,
4823 VkSurfaceFormatKHR *pSurfaceFormats) {
4824 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004825 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004826 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4827 assert(my_data != NULL);
4828
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004829 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4830 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004831
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004832 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004833 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4834 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4835
4836 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4837 }
4838
4839 return result;
4840}
4841
4842VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4843 uint32_t *pPresentModeCount,
4844 VkPresentModeKHR *pPresentModes) {
4845 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004846 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004847 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4848 assert(my_data != NULL);
4849
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004850 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4851 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004852
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004853 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004854 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4855 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4856
4857 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4858 }
4859
4860 return result;
4861}
4862
4863#ifdef VK_USE_PLATFORM_WIN32_KHR
4864VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4865 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4866 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4867
4868 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4869 assert(my_data != NULL);
4870
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004871 bool skip_call = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004872
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004873 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004874 result =
4875 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4876 }
4877
4878 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4879
4880 return result;
4881}
4882#endif // VK_USE_PLATFORM_WIN32_KHR
4883
4884#ifdef VK_USE_PLATFORM_XCB_KHR
4885VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
4886 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4887 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4888
4889 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4890 assert(my_data != NULL);
4891
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004892 bool skip_call = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004893
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004894 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004895 result =
4896 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4897 }
4898
4899 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
4900
4901 return result;
4902}
4903
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004904VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4905 uint32_t queueFamilyIndex, xcb_connection_t *connection,
4906 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004907 VkBool32 result = false;
4908
4909 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4910 assert(my_data != NULL);
4911
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004912 bool skip_call = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
4913 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004914
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004915 if (!skip_call) {
4916 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4917 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004918 }
4919
4920 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004921}
4922#endif // VK_USE_PLATFORM_XCB_KHR
4923
4924#ifdef VK_USE_PLATFORM_XLIB_KHR
4925VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004926 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004927 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4928
4929 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4930 assert(my_data != NULL);
4931
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004932 bool skip_call = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004933
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004934 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004935 result =
4936 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4937 }
4938
4939 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
4940
4941 return result;
4942}
4943
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004944VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4945 uint32_t queueFamilyIndex, Display *dpy,
4946 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004947 VkBool32 result = false;
4948
4949 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4950 assert(my_data != NULL);
4951
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004952 bool skip_call =
4953 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004954
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004955 if (!skip_call) {
4956 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4957 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004958 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06004959 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004960}
4961#endif // VK_USE_PLATFORM_XLIB_KHR
4962
4963#ifdef VK_USE_PLATFORM_MIR_KHR
4964VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004965 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004966 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4967
4968 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4969 assert(my_data != NULL);
4970
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004971 bool skip_call = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004972
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004973 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004974 result =
4975 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4976 }
4977
4978 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
4979
4980 return result;
4981}
4982
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004983VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4984 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004985 VkBool32 result = false;
4986
4987 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4988 assert(my_data != NULL);
4989
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004990 bool skip_call =
4991 parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004992
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004993 if (!skip_call) {
4994 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4995 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004996 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004997}
4998#endif // VK_USE_PLATFORM_MIR_KHR
4999
5000#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5001VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005002 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005003 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5004
5005 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5006 assert(my_data != NULL);
5007
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005008 bool skip_call = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005009
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005010 if (!skip_call) {
5011 result = get_dispatch_table(pc_instance_table_map, instance)
5012 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005013 }
5014
5015 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5016
5017 return result;
5018}
5019
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005020VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5021 uint32_t queueFamilyIndex,
5022 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005023 VkBool32 result = false;
5024
5025 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5026 assert(my_data != NULL);
5027
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005028 bool skip_call =
5029 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005030
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005031 if (!skip_call) {
5032 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5033 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005034 }
5035}
5036#endif // VK_USE_PLATFORM_WAYLAND_KHR
5037
5038#ifdef VK_USE_PLATFORM_ANDROID_KHR
5039VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005040 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005041 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5042
5043 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5044 assert(my_data != NULL);
5045
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005046 bool skip_call = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005047
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005048 if (!skip_call) {
5049 result = get_dispatch_table(pc_instance_table_map, instance)
5050 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005051 }
5052
5053 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5054
5055 return result;
5056}
5057#endif // VK_USE_PLATFORM_ANDROID_KHR
5058
Mark Youngead9b932016-09-08 12:28:38 -06005059VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5060 const VkSwapchainCreateInfoKHR *pCreateInfos,
5061 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5062 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5063 bool skip_call = false;
5064 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5065 assert(my_data != NULL);
5066
5067 skip_call |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
5068 pSwapchains);
5069
5070 if (!skip_call) {
5071 result = get_dispatch_table(pc_device_table_map, device)
5072 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5073
5074 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5075 }
5076
5077 return result;
5078}
5079
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005080static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005081
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005082static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005083
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005084static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005085
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005086static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005087
Chia-I Wu01ca2372016-05-13 14:37:49 +08005088VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005089 assert(device);
5090
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005091 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5092
Dustin Graves080069b2016-04-05 13:48:15 -06005093 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005094 return NULL;
5095 }
5096
Chia-I Wuf9b01382016-05-16 07:37:41 +08005097 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5098 if (proc)
5099 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005100
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005101 proc = InterceptWsiEnabledCommand(funcName, device);
5102 if (proc)
5103 return proc;
5104
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005105 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005106 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005107 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005108}
5109
Chia-I Wu01ca2372016-05-13 14:37:49 +08005110VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005111 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005112 if (!proc)
5113 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005114
5115 if (!proc)
5116 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005117
Chia-I Wu617f2a42016-05-16 07:41:17 +08005118 if (proc)
5119 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005120
Chia-I Wu617f2a42016-05-16 07:41:17 +08005121 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005122
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005123 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005124
Chia-I Wu617f2a42016-05-16 07:41:17 +08005125 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005126 if (!proc)
5127 proc = InterceptWsiEnabledCommand(funcName, instance);
5128
Chia-I Wu617f2a42016-05-16 07:41:17 +08005129 if (proc)
5130 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005131
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005132 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005133 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005134 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005135}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005136
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005137static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005138 static const struct {
5139 const char *name;
5140 PFN_vkVoidFunction proc;
5141 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005142 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5143 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5144 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5145 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5146 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5147 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5148 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5149 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5150 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5151 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5152 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5153 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5154 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5155 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5156 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5157 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5158 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Chia-I Wu617f2a42016-05-16 07:41:17 +08005159 };
5160
5161 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5162 if (!strcmp(core_instance_commands[i].name, name))
5163 return core_instance_commands[i].proc;
5164 }
5165
5166 return nullptr;
5167}
5168
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005169static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005170 static const struct {
5171 const char *name;
5172 PFN_vkVoidFunction proc;
5173 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005174 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5175 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5176 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5177 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5178 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5179 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5180 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5181 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5182 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5183 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5184 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5185 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5186 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5187 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5188 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5189 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5190 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5191 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5192 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5193 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5194 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5195 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5196 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5197 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5198 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5199 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5200 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5201 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5202 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5203 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5204 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5205 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5206 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5207 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5208 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5209 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5210 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5211 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5212 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5213 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5214 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5215 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5216 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5217 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5218 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5219 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5220 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5221 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5222 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5223 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5224 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5225 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5226 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5227 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5228 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5229 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5230 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5231 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5232 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5233 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5234 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5235 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5236 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5237 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5238 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5239 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5240 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5241 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5242 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5243 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5244 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5245 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5246 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5247 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5248 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5249 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5250 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5251 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5252 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5253 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5254 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5255 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5256 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5257 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5258 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5259 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5260 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5261 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5262 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5263 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5264 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5265 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5266 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5267 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5268 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5269 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5270 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5271 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5272 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5273 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5274 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5275 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5276 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5277 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5278 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5279 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5280 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5281 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5282 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5283 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5284 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5285 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5286 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5287 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5288 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5289 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5290 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Chia-I Wuf9b01382016-05-16 07:37:41 +08005291 };
5292
5293 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5294 if (!strcmp(core_device_commands[i].name, name))
5295 return core_device_commands[i].proc;
5296 }
5297
5298 return nullptr;
5299}
5300
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005301static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005302 static const struct {
5303 const char *name;
5304 PFN_vkVoidFunction proc;
5305 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005306 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5307 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5308 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5309 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005310 };
5311
5312 if (device) {
5313 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005314
Mark Youngead9b932016-09-08 12:28:38 -06005315 if (device_data->wsi_enabled) {
5316 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5317 if (!strcmp(wsi_device_commands[i].name, name))
5318 return wsi_device_commands[i].proc;
5319 }
5320 }
5321
5322 if (device_data->wsi_display_swapchain_enabled) {
5323 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
5324 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
5325 }
5326 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005327 }
5328
5329 return nullptr;
5330}
5331
5332static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5333 static const struct {
5334 const char *name;
5335 PFN_vkVoidFunction proc;
5336 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005337 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5338 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5339 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5340 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5341 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5342 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005343 };
5344
5345 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005346 if (instance_extension_map.size() == 0 || !instance_extension_map[pTable].wsi_enabled)
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005347 return nullptr;
5348
5349 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5350 if (!strcmp(wsi_instance_commands[i].name, name))
5351 return wsi_instance_commands[i].proc;
5352 }
5353
5354#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005355 if ((instance_extension_map[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005356 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
5357#endif // VK_USE_PLATFORM_WIN32_KHR
5358#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005359 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005360 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005361 if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005362 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5363#endif // VK_USE_PLATFORM_XCB_KHR
5364#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005365 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005366 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005367 if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005368 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5369#endif // VK_USE_PLATFORM_XLIB_KHR
5370#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005371 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005372 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005373 if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005374 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5375#endif // VK_USE_PLATFORM_MIR_KHR
5376#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005377 if ((instance_extension_map[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005378 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005379 if ((instance_extension_map[pTable].wayland_enabled == true) &&
5380 !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005381 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5382#endif // VK_USE_PLATFORM_WAYLAND_KHR
5383#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005384 if ((instance_extension_map[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005385 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5386#endif // VK_USE_PLATFORM_ANDROID_KHR
5387
5388 return nullptr;
5389}
5390
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005391} // namespace parameter_validation
5392
5393// vk_layer_logging.h expects these to be defined
5394
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005395VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5396 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5397 const VkAllocationCallbacks *pAllocator,
5398 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005399 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005400}
5401
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005402VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5403 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005404 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005405}
5406
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005407VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5408 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5409 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005410 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005411}
5412
5413// loader-layer interface v0
5414
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005415VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5416 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005417 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005418}
5419
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005420VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5421 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005422 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005423}
5424
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005425VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5426 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005427 // the layer command handles VK_NULL_HANDLE just fine internally
5428 assert(physicalDevice == VK_NULL_HANDLE);
5429 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005430}
5431
5432VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5433 const char *pLayerName, uint32_t *pCount,
5434 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005435 // the layer command handles VK_NULL_HANDLE just fine internally
5436 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005437 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005438}
5439
5440VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005441 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005442}
5443
5444VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005445 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005446}