blob: b76a58150d5a933a9b999cf32195bccfba63d177 [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>
Chris Forbesb93e59e2016-11-24 14:52:24 +130022 * Author: Chris Forbes <chrisforbes@google.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060023 */
24
Dustin Gravesf8032f22016-05-11 18:31:44 -060025#define NOMINMAX
26
Mike Weiblena4742dc2016-10-31 11:05:56 -060027#include <limits.h>
Dustin Gravesf8032f22016-05-11 18:31:44 -060028#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060029#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32
33#include <iostream>
34#include <string>
35#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050036#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060037#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060038#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060039
Chris Forbesf90cef92016-11-29 09:49:19 +130040#include "vk_loader_platform.h"
41#include "vulkan/vk_layer.h"
42#include "vk_layer_config.h"
Chris Forbes6444bba2016-11-24 14:15:23 +130043#include "vk_dispatch_table_helper.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060044#include "vk_enum_validate_helper.h"
45#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060046
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060047#include "vk_layer_table.h"
48#include "vk_layer_data.h"
49#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060050#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070051#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060052
Dustin Graves8ffbbf62016-07-22 13:19:46 -060053#include "parameter_name.h"
Mark Lobodzinski739391a2016-03-17 15:08:18 -060054#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070055
Chia-I Wu1a6b1932016-05-13 14:07:36 +080056namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060057
Chris Forbes7b58a712016-11-24 11:35:31 +130058struct instance_layer_data {
Chris Forbes7b57a392016-11-02 17:56:50 +130059 VkInstance instance = VK_NULL_HANDLE;
Chia-I Wua570b7c2016-05-16 07:48:14 +080060
Chris Forbes7b57a392016-11-02 17:56:50 +130061 debug_report_data *report_data = nullptr;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070062 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060063
Ian Elliotted6b5ac2016-04-28 09:08:13 -060064 // The following are for keeping track of the temporary callbacks that can
65 // be used in vkCreateInstance and vkDestroyInstance:
Chris Forbes7b57a392016-11-02 17:56:50 +130066 uint32_t num_tmp_callbacks = 0;
67 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos = nullptr;
68 VkDebugReportCallbackEXT *tmp_callbacks = nullptr;
Chris Forbes6be763e2016-11-24 12:42:33 +130069 instance_extension_enables extensions = {};
Chris Forbes6444bba2016-11-24 14:15:23 +130070
71 VkLayerInstanceDispatchTable dispatch_table = {};
Chris Forbes7b58a712016-11-24 11:35:31 +130072};
Ian Elliotted6b5ac2016-04-28 09:08:13 -060073
Chris Forbes7b58a712016-11-24 11:35:31 +130074struct layer_data {
Chris Forbes7b58a712016-11-24 11:35:31 +130075 debug_report_data *report_data = nullptr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070076 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060077 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Chris Forbes7b57a392016-11-02 17:56:50 +130078 VkPhysicalDeviceLimits device_limits = {};
79 VkPhysicalDeviceFeatures physical_device_features = {};
80 VkPhysicalDevice physical_device = VK_NULL_HANDLE;
Michael Lentinebdf744f2016-01-27 15:43:43 -060081
Chris Forbes7b57a392016-11-02 17:56:50 +130082 bool swapchain_enabled = false;
83 bool display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -060084 bool amd_negative_viewport_height_enabled = false;
Chris Forbese58c9fe2016-11-24 14:44:17 +130085
86 VkLayerDispatchTable dispatch_table = {};
Cody Northrop55443ef2015-09-28 15:09:32 -060087};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050088
Jon Ashburn5484e0c2016-03-08 17:48:44 -070089static std::unordered_map<void *, layer_data *> layer_data_map;
Chris Forbes7b58a712016-11-24 11:35:31 +130090static std::unordered_map<void *, instance_layer_data *> instance_layer_data_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060091
Chris Forbes7b58a712016-11-24 11:35:31 +130092static void init_parameter_validation(instance_layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060093
Mark Lobodzinski739391a2016-03-17 15:08:18 -060094 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -060095}
96
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060097VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
98 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
99 const VkAllocationCallbacks *pAllocator,
100 VkDebugReportCallbackEXT *pMsgCallback) {
Chris Forbes6444bba2016-11-24 14:15:23 +1300101 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
102 VkResult result = data->dispatch_table.CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600103
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700104 if (result == VK_SUCCESS) {
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600105 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600106 }
107
108 return result;
109}
110
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600111VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800112 const VkAllocationCallbacks *pAllocator) {
Chris Forbes7b58a712016-11-24 11:35:31 +1300113 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6444bba2016-11-24 14:15:23 +1300114 data->dispatch_table.DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
115
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700116 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600117}
118
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600119VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
120 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
121 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chris Forbes6444bba2016-11-24 14:15:23 +1300122 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
123 data->dispatch_table.DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700124}
125
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700126static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600127
Chia-I Wu3384db82016-05-16 07:30:58 +0800128static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600129 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800130};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700131
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700132static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600133 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700134 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
135 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
136 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
137 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
138 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 -0700139 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700140 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600141 return false;
142 }
143
144 return true;
145}
146
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700147static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
148 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600149 return "unrecognized enumerator";
150 }
151
152 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700153 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600154 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
155 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700156 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600157 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
158 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700159 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600160 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
161 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700162 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600163 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
164 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700165 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600166 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
167 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700168 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600169 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
170 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700171 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600172 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
173 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700174 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600175 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
176 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700177 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600178 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
179 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700180 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600181 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
182 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700183 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800184 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600185 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700186 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800187 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600188 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700189 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700190 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
191 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600192
193 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700194 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600195 enumeratorString += string;
196
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700197 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600198 enumeratorString += '|';
199 }
200 }
201
202 return enumeratorString;
203}
204
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700205static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
206 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
207 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
208 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
209 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
210 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600211 return false;
212 }
213
214 return true;
215}
216
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700217static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
218 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600219 return "unrecognized enumerator";
220 }
221
222 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700223 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600224 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
225 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700226 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600227 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600228 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700229 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600230 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
231 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700232 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600233 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
234 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700235 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600236 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
237 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700238 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800239 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600240 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700241 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600242 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
243 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700244 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800245 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600246 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600247
248 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700249 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600250 enumeratorString += string;
251
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700252 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600253 enumeratorString += '|';
254 }
255 }
256
257 return enumeratorString;
258}
259
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700260static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
261 VkQueueFlagBits allFlags =
262 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
263 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600264 return false;
265 }
266
267 return true;
268}
269
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700270static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
271 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600272 return "unrecognized enumerator";
273 }
274
275 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700276 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800277 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600278 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700279 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600280 strings.push_back("VK_QUEUE_COMPUTE_BIT");
281 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700282 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800283 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600284 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700285 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600286 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
287 }
288
289 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700290 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600291 enumeratorString += string;
292
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700293 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600294 enumeratorString += '|';
295 }
296 }
297
298 return enumeratorString;
299}
300
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700301static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
302 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
303 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
304 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
305 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600306 return false;
307 }
308
309 return true;
310}
311
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700312static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
313 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600314 return "unrecognized enumerator";
315 }
316
317 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700318 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600319 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
320 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700321 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800322 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600323 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700324 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600325 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
326 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700327 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800328 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600329 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700330 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800331 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600332 }
333
334 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700335 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600336 enumeratorString += string;
337
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700338 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600339 enumeratorString += '|';
340 }
341 }
342
343 return enumeratorString;
344}
345
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700346static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700347 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700348 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600349 return false;
350 }
351
352 return true;
353}
354
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700355static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
356 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600357 return "unrecognized enumerator";
358 }
359
360 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700361 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800362 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600363 }
364
365 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700366 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600367 enumeratorString += string;
368
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700369 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600370 enumeratorString += '|';
371 }
372 }
373
374 return enumeratorString;
375}
376
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700377static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
378 VkSparseImageFormatFlagBits allFlags =
379 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
380 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
381 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600382 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600383 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600384
385 return true;
386}
387
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700388static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
389 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600390 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600391 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600392
393 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700394 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800395 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600396 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700397 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800398 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600399 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700400 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800401 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600402 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600403
404 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700405 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600406 enumeratorString += string;
407
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700408 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600409 enumeratorString += '|';
410 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600411 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600412
413 return enumeratorString;
414}
415
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700416static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700417 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700418 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600419 return false;
420 }
421
422 return true;
423}
424
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700425static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
426 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600427 return "unrecognized enumerator";
428 }
429
430 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700431 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600432 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
433 }
434
435 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700436 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600437 enumeratorString += string;
438
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700439 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600440 enumeratorString += '|';
441 }
442 }
443
444 return enumeratorString;
445}
446
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700447static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
448 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
449 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
450 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
451 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
452 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600453 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
454 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
455 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700456 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600457 return false;
458 }
459
460 return true;
461}
462
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700463static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
464 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600465 return "unrecognized enumerator";
466 }
467
468 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700469 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700470 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600471 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700472 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700473 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600474 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700475 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700476 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600477 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700478 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700479 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600480 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700481 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700482 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600483 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700484 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700485 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600486 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700487 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700488 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600489 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700490 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700491 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600492 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700493 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700494 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600495 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700496 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700497 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600498 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700499 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700500 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600501 }
502
503 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700504 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600505 enumeratorString += string;
506
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700507 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600508 enumeratorString += '|';
509 }
510 }
511
512 return enumeratorString;
513}
514
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700515static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
516 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
517 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
518 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600519 return false;
520 }
521
522 return true;
523}
524
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700525static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
526 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600527 return "unrecognized enumerator";
528 }
529
530 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700531 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600532 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
533 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700534 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600535 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
536 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700537 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600538 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
539 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700540 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600541 strings.push_back("VK_QUERY_RESULT_64_BIT");
542 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600543
544 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700545 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600546 enumeratorString += string;
547
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700548 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600549 enumeratorString += '|';
550 }
551 }
552
553 return enumeratorString;
554}
555
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700556static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
557 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
558 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
559 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
560 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
561 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600562 return false;
563 }
564
565 return true;
566}
567
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700568static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
569 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600570 return "unrecognized enumerator";
571 }
572
573 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700574 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600575 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
576 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700577 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600578 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
579 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700580 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600581 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
582 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700583 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600584 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
585 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700586 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600587 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
588 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700589 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800590 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600591 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700592 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600593 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
594 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700595 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800596 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600597 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700598 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600599 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
600 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600601
602 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700603 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600604 enumeratorString += string;
605
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700606 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600607 enumeratorString += '|';
608 }
609 }
610
611 return enumeratorString;
612}
613
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700614static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
615 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
616 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
617 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600618 return false;
619 }
620
621 return true;
622}
623
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700624static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
625 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600626 return "unrecognized enumerator";
627 }
628
629 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700630 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600631 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
632 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700633 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600634 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
635 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700636 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600637 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600638 }
639
640 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700641 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600642 enumeratorString += string;
643
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700644 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600645 enumeratorString += '|';
646 }
647 }
648
649 return enumeratorString;
650}
651
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700652static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
653 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
654 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
655 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
656 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600657 return false;
658 }
659
660 return true;
661}
662
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700663static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
664 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600665 return "unrecognized enumerator";
666 }
667
668 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700669 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600670 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
671 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700672 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600673 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
674 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700675 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600676 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
677 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700678 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600679 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
680 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700681 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600682 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600683 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600684
685 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700686 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600687 enumeratorString += string;
688
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700689 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600690 enumeratorString += '|';
691 }
692 }
693
694 return enumeratorString;
695}
696
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700697static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
698 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
699 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
700 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600701 return false;
702 }
703
704 return true;
705}
706
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700707static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
708 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600709 return "unrecognized enumerator";
710 }
711
712 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700713 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800714 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600715 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700716 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800717 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600718 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700719 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800720 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600721 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700722 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800723 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600724 }
725
726 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700727 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600728 enumeratorString += string;
729
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700730 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600731 enumeratorString += '|';
732 }
733 }
734
735 return enumeratorString;
736}
737
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700738static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
739 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
740 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
741 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600742 return false;
743 }
744
745 return true;
746}
747
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700748static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
749 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600750 return "unrecognized enumerator";
751 }
752
753 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700754 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600755 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
756 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700757 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600758 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
759 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700760 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600761 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600762 }
763
764 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700765 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600766 enumeratorString += string;
767
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700768 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600769 enumeratorString += '|';
770 }
771 }
772
773 return enumeratorString;
774}
775
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700776static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
777 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
778 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
779 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
780 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600781 return false;
782 }
783
784 return true;
785}
786
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700787static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
788 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600789 return "unrecognized enumerator";
790 }
791
792 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700793 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600794 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600795 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700796 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600797 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600798 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700799 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600800 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
801 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700802 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600803 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
804 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700805 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600806 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600807 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700808 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600809 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600810 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700811 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600812 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600813 }
814
815 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700816 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600817 enumeratorString += string;
818
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700819 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600820 enumeratorString += '|';
821 }
822 }
823
824 return enumeratorString;
825}
826
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700827static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800828 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700829 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
830 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
831 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
832 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
833 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
834 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 -0700835 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700836 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600837 return false;
838 }
839
840 return true;
841}
842
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700843static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
844 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600845 return "unrecognized enumerator";
846 }
847
848 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700849 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800850 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
851 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700852 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800853 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600854 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700855 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600856 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600857 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700858 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600859 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600860 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700861 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600862 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600863 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700864 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700865 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600866 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700867 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600868 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600869 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700870 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600871 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600872 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700873 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600874 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600875 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700876 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600877 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600878 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700879 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600880 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
881 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700882 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600883 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
884 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700885 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700886 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600887 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700888 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600889 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
890 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700891 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600892 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
893 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700894 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600895 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
896 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700897 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600898 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600899 }
900
901 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700902 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600903 enumeratorString += string;
904
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700905 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600906 enumeratorString += '|';
907 }
908 }
909
910 return enumeratorString;
911}
912
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700913static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800914 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700915 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
916 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
917 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
918 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
919 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 +0800920
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700921 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600922 return false;
923 }
924
925 return true;
926}
927
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700928static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
929 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600930 return "unrecognized enumerator";
931 }
932
933 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700934 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800935 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600936 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700937 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800938 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600939 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700940 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800941 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600942 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700943 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800944 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600945 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700946 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800947 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600948 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700949 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800950 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600951 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700952 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800953 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600954 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700955 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800956 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600957 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700958 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800959 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600960 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700961 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800962 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600963 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700964 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800965 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600966 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700967 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800968 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600969 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700970 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800971 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600972 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700973 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800974 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600975 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700976 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800977 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600978 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700979 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800980 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600981 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700982 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800983 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600984 }
985
986 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700987 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600988 enumeratorString += string;
989
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700990 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600991 enumeratorString += '|';
992 }
993 }
994
995 return enumeratorString;
996}
997
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700998static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
999 VkCommandPoolCreateFlagBits allFlags =
1000 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1001 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001002 return false;
1003 }
1004
1005 return true;
1006}
1007
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001008static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1009 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001010 return "unrecognized enumerator";
1011 }
1012
1013 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001014 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001015 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001016 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001017 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001018 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001019 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001020
1021 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001022 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001023 enumeratorString += string;
1024
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001025 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001026 enumeratorString += '|';
1027 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001028 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001029
1030 return enumeratorString;
1031}
1032
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001033static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001034 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001035 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001036 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001037 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001038
1039 return true;
1040}
1041
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001042static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1043 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001044 return "unrecognized enumerator";
1045 }
1046
1047 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001048 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001049 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001050 }
1051
1052 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001053 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001054 enumeratorString += string;
1055
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001056 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001057 enumeratorString += '|';
1058 }
1059 }
1060
1061 return enumeratorString;
1062}
1063
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001064static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1065 VkCommandBufferUsageFlags allFlags =
1066 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1067 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1068 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001069 return false;
1070 }
1071
1072 return true;
1073}
1074
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001075static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1076 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001077 return "unrecognized enumerator";
1078 }
1079
1080 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001081 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001082 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001083 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001084 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001085 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001086 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001087 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001088 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001089 }
1090
1091 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001092 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001093 enumeratorString += string;
1094
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001095 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001096 enumeratorString += '|';
1097 }
1098 }
1099
1100 return enumeratorString;
1101}
1102
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001103static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001104 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001105 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001106 return false;
1107 }
1108
1109 return true;
1110}
1111
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001112static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1113 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001114 return "unrecognized enumerator";
1115 }
1116
1117 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001118 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001119 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001120 }
1121
1122 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001123 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001124 enumeratorString += string;
1125
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001126 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001127 enumeratorString += '|';
1128 }
1129 }
1130
1131 return enumeratorString;
1132}
1133
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001134static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1135 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1136 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1137 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001138 return false;
1139 }
1140
1141 return true;
1142}
1143
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001144static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1145 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001146 return "unrecognized enumerator";
1147 }
1148
1149 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001150 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001151 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1152 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001153 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001154 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1155 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001156 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001157 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1158 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001159 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001160 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1161 }
1162
1163 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001164 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001165 enumeratorString += string;
1166
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001167 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001168 enumeratorString += '|';
1169 }
1170 }
1171
1172 return enumeratorString;
1173}
1174
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001175static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001176 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001177 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001178 return false;
1179 }
1180
1181 return true;
1182}
1183
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001184static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1185 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001186 return "unrecognized enumerator";
1187 }
1188
1189 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001190 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001191 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001192 }
1193
1194 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001195 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001196 enumeratorString += string;
1197
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001198 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001199 enumeratorString += '|';
1200 }
1201 }
1202
1203 return enumeratorString;
1204}
1205
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001206static const int MaxParamCheckerStringLength = 256;
1207
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001208static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001209 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001210 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001211 assert(validateString != nullptr);
1212
Chris Forbes04b61da2016-11-03 09:53:59 +13001213 bool skip = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001214
1215 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1216
1217 if (result == VK_STRING_ERROR_NONE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001218 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001219 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001220
Chris Forbes04b61da2016-11-03 09:53:59 +13001221 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001222 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1223 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001224 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001225 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001226 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1227 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001228 }
Chris Forbes04b61da2016-11-03 09:53:59 +13001229 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001230}
1231
Dustin Gravesde628532016-04-21 16:30:17 -06001232static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1233 uint32_t index) {
1234 assert(device_data != nullptr);
1235 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001236 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001237
1238 if (index == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001239 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001240 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001241 } else {
1242 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1243 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001244 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001245 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1246 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001247 function_name, parameter_name, index);
1248 return false;
1249 }
1250 }
1251
Chris Forbes04b61da2016-11-03 09:53:59 +13001252 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001253}
1254
1255static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1256 const uint32_t count, const uint32_t *indices) {
1257 assert(device_data != nullptr);
1258 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001259 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001260
1261 if (indices != nullptr) {
1262 for (uint32_t i = 0; i < count; i++) {
1263 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001264 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001265 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001266 } else {
1267 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1268 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001269 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001270 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1271 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001272 function_name, parameter_name, i, indices[i]);
1273 return false;
1274 }
1275 }
1276 }
1277 }
1278
Chris Forbes04b61da2016-11-03 09:53:59 +13001279 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001280}
1281
Chris Forbes6be763e2016-11-24 12:42:33 +13001282static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001283
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001284VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1285 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001286 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001287
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001288 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001289 assert(chain_info != nullptr);
1290 assert(chain_info->u.pLayerInfo != nullptr);
1291
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001292 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1293 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001294 if (fpCreateInstance == NULL) {
1295 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001296 }
1297
Dustin Graves842621d2016-03-03 14:17:08 -07001298 // Advance the link info for the next element on the chain
1299 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1300
1301 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001302
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001303 if (result == VK_SUCCESS) {
Chris Forbes7b58a712016-11-24 11:35:31 +13001304 auto my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), instance_layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001305 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001306
Chris Forbes6444bba2016-11-24 14:15:23 +13001307 layer_init_instance_dispatch_table(*pInstance, &my_instance_data->dispatch_table, fpGetInstanceProcAddr);
Chia-I Wua570b7c2016-05-16 07:48:14 +08001308 my_instance_data->instance = *pInstance;
Chris Forbes6444bba2016-11-24 14:15:23 +13001309 my_instance_data->report_data =
1310 debug_report_create_instance(&my_instance_data->dispatch_table, *pInstance, pCreateInfo->enabledExtensionCount,
1311 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001312
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001313 // Look for one or more debug report create info structures
1314 // and setup a callback(s) for each one found.
1315 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1316 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1317 if (my_instance_data->num_tmp_callbacks > 0) {
1318 // Setup the temporary callback(s) here to catch early issues:
1319 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1320 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1321 // Failure of setting up one or more of the callback.
1322 // Therefore, clean up and don't use those callbacks:
1323 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1324 my_instance_data->num_tmp_callbacks = 0;
1325 }
1326 }
1327 }
1328
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001329 init_parameter_validation(my_instance_data, pAllocator);
Chris Forbes6be763e2016-11-24 12:42:33 +13001330 CheckInstanceRegisterExtensions(pCreateInfo, my_instance_data);
Dustin Graves842621d2016-03-03 14:17:08 -07001331
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001332 // Ordinarily we'd check these before calling down the chain, but none of the layer
1333 // support is in place until now, if we survive we can report the issue now.
1334 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001335
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001336 if (pCreateInfo->pApplicationInfo) {
1337 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1338 validate_string(my_instance_data->report_data, "vkCreateInstance",
1339 "pCreateInfo->VkApplicationInfo->pApplicationName",
1340 pCreateInfo->pApplicationInfo->pApplicationName);
1341 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001342
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001343 if (pCreateInfo->pApplicationInfo->pEngineName) {
1344 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1345 pCreateInfo->pApplicationInfo->pEngineName);
1346 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001347 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001348
1349 // Disable the tmp callbacks:
1350 if (my_instance_data->num_tmp_callbacks > 0) {
1351 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1352 my_instance_data->tmp_callbacks);
1353 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001354 }
1355
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001356 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001357}
1358
Chia-I Wu01ca2372016-05-13 14:37:49 +08001359VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001360 // Grab the key before the instance is destroyed.
1361 dispatch_key key = get_dispatch_key(instance);
Chris Forbes04b61da2016-11-03 09:53:59 +13001362 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001363 auto my_data = get_my_data_ptr(key, instance_layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001364 assert(my_data != NULL);
1365
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001366 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1367 bool callback_setup = false;
1368 if (my_data->num_tmp_callbacks > 0) {
1369 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1370 my_data->tmp_callbacks)) {
1371 callback_setup = true;
1372 }
1373 }
1374
Chris Forbes04b61da2016-11-03 09:53:59 +13001375 skip |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001376
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001377 // Disable and cleanup the temporary callback(s):
1378 if (callback_setup) {
1379 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1380 }
1381 if (my_data->num_tmp_callbacks > 0) {
1382 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1383 my_data->num_tmp_callbacks = 0;
1384 }
1385
Chris Forbes04b61da2016-11-03 09:53:59 +13001386 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001387 my_data->dispatch_table.DestroyInstance(instance, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001388
1389 // Clean up logging callback, if any
1390 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001391 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1392 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001393 my_data->logging_callback.pop_back();
1394 }
1395
Chris Forbes78a56b02016-11-02 16:13:01 +13001396 layer_debug_report_destroy_instance(my_data->report_data);
Chris Forbes6444bba2016-11-24 14:15:23 +13001397 instance_layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001398 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001399}
1400
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001401VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1402 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001403 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001404 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001405 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001406 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001407
Chris Forbes04b61da2016-11-03 09:53:59 +13001408 skip |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001409
Chris Forbes04b61da2016-11-03 09:53:59 +13001410 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001411 result = my_data->dispatch_table.EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001412 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001413 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001414 return result;
1415}
1416
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001417VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001418 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001419 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001420 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001421
Chris Forbes04b61da2016-11-03 09:53:59 +13001422 skip |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001423
Chris Forbes04b61da2016-11-03 09:53:59 +13001424 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001425 my_data->dispatch_table.GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001426 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001427}
1428
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001429VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1430 VkFormatProperties *pFormatProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001431 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001432 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001433 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001434
Chris Forbes04b61da2016-11-03 09:53:59 +13001435 skip |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001436
Chris Forbes04b61da2016-11-03 09:53:59 +13001437 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001438 my_data->dispatch_table.GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001439 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001440}
1441
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001442VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1443 VkImageType type, VkImageTiling tiling,
1444 VkImageUsageFlags usage, VkImageCreateFlags flags,
1445 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001446 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001447 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001448 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001449 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001450
Chris Forbes04b61da2016-11-03 09:53:59 +13001451 skip |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001452 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001453
Chris Forbes04b61da2016-11-03 09:53:59 +13001454 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001455 result = my_data->dispatch_table.GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1456 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001457
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001458 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001459 }
Chia-I Wu17241042015-10-31 00:31:16 +08001460
1461 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001462}
1463
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001464VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001465 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001466 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001467 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001468
Chris Forbes04b61da2016-11-03 09:53:59 +13001469 skip |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001470
Chris Forbes04b61da2016-11-03 09:53:59 +13001471 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001472 my_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001473 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001474}
1475
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001476VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1477 uint32_t *pQueueFamilyPropertyCount,
1478 VkQueueFamilyProperties *pQueueFamilyProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001479 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001480 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001481 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001482
Chris Forbes04b61da2016-11-03 09:53:59 +13001483 skip |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001484 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001485
Chris Forbes04b61da2016-11-03 09:53:59 +13001486 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001487 my_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount,
1488 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001489 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001490}
1491
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001492VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1493 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001494 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001495 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001496 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001497
Chris Forbes04b61da2016-11-03 09:53:59 +13001498 skip |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001499
Chris Forbes04b61da2016-11-03 09:53:59 +13001500 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001501 my_data->dispatch_table.GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001502 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001503}
1504
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001505void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1506 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001507 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001508
Chris Forbes7b58a712016-11-24 11:35:31 +13001509 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes0e0161a2016-11-02 16:21:28 +13001510
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001511 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1512 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1513 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001514 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001515 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001516 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1517 "structure.",
1518 i);
1519 } else {
1520 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001521 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001522
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001523 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1524 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1525 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1526 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001527 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001528 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001529 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1530 "between 0 and 1. Actual value is %f",
1531 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1532 }
1533 }
1534 }
1535
1536 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1537 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001538 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001539 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001540 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1541 "of queue families.",
1542 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001543 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1544 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1545 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001546 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001547 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001548 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1549 "queues for the given family index.",
1550 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001551 }
Michael Lentine774704f2016-01-27 13:36:46 -06001552 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001553 }
1554}
1555
Chris Forbes6be763e2016-11-24 12:42:33 +13001556static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001557
1558 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001559 auto name = pCreateInfo->ppEnabledExtensionNames[i];
1560
1561 if (strcmp(name, VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
1562 instance_data->extensions.surface_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001563 }
1564#ifdef VK_USE_PLATFORM_XLIB_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001565 if (strcmp(name, VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
1566 instance_data->extensions.xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001567 }
1568#endif
1569#ifdef VK_USE_PLATFORM_XCB_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001570 if (strcmp(name, VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
1571 instance_data->extensions.xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001572 }
1573#endif
1574#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001575 if (strcmp(name, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
1576 instance_data->extensions.wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001577 }
1578#endif
1579#ifdef VK_USE_PLATFORM_MIR_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001580 if (strcmp(name, VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
1581 instance_data->extensions.mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001582 }
1583#endif
1584#ifdef VK_USE_PLATFORM_ANDROID_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001585 if (strcmp(name, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
1586 instance_data->extensions.android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001587 }
1588#endif
1589#ifdef VK_USE_PLATFORM_WIN32_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001590 if (strcmp(name, VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
1591 instance_data->extensions.win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001592 }
1593#endif
Chris Forbes6be763e2016-11-24 12:42:33 +13001594 if (strcmp(name, VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
1595 instance_data->extensions.display_enabled = true;
Chris Forbes2e47f432016-11-03 10:18:18 +13001596 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001597 }
1598}
1599
1600static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1601 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes27e49622016-11-02 17:54:21 +13001602 device_data->swapchain_enabled = false;
1603 device_data->display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001604 device_data->amd_negative_viewport_height_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001605
1606 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1607 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001608 device_data->swapchain_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001609 }
Mark Youngead9b932016-09-08 12:28:38 -06001610 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001611 device_data->display_swapchain_enabled = true;
Mark Youngead9b932016-09-08 12:28:38 -06001612 }
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001613 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME) == 0) {
1614 device_data->amd_negative_viewport_height_enabled = true;
1615 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001616 }
1617}
1618
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001619void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001620 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001621
1622 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1623 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1624 my_device_data->queueFamilyIndexMap.insert(
1625 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1626 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001627 }
1628}
1629
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001630VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001631 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001632 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001633 * NOTE: We do not validate physicalDevice or any dispatchable
1634 * object as the first parameter. We couldn't get here if it was wrong!
1635 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001636
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001637 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001638 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001639 auto my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001640 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001641
Chris Forbes04b61da2016-11-03 09:53:59 +13001642 skip |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001643
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001644 if (pCreateInfo != NULL) {
1645 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001646 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001647 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001648 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001649 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001650 }
Michael Lentine774704f2016-01-27 13:36:46 -06001651
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001652 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001653 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001654 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001655 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001656 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001657 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001658 }
1659
Chris Forbes04b61da2016-11-03 09:53:59 +13001660 if (!skip) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001661 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001662 assert(chain_info != nullptr);
1663 assert(chain_info->u.pLayerInfo != nullptr);
1664
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001665 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1666 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001667 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001668 if (fpCreateDevice == NULL) {
1669 return VK_ERROR_INITIALIZATION_FAILED;
1670 }
1671
1672 // Advance the link info for the next element on the chain
1673 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1674
1675 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001676
1677 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1678
1679 if (result == VK_SUCCESS) {
1680 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1681 assert(my_device_data != nullptr);
1682
1683 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
Chris Forbese58c9fe2016-11-24 14:44:17 +13001684 layer_init_device_dispatch_table(*pDevice, &my_device_data->dispatch_table, fpGetDeviceProcAddr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001685
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001686 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1687
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001688 uint32_t count;
Chris Forbes6444bba2016-11-24 14:15:23 +13001689 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001690 std::vector<VkQueueFamilyProperties> properties(count);
Chris Forbes6444bba2016-11-24 14:15:23 +13001691 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001692
1693 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1694 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001695
1696 // Query and save physical device limits for this device
1697 VkPhysicalDeviceProperties device_properties = {};
Chris Forbes6444bba2016-11-24 14:15:23 +13001698 my_instance_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, &device_properties);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001699 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001700 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001701
1702 // Save app-enabled features in this device's layer_data structure
1703 if (pCreateInfo->pEnabledFeatures) {
1704 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1705 } else {
1706 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1707 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001708 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001709 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001710
Jeremy Hayes99a96322015-06-26 12:48:09 -06001711 return result;
1712}
1713
Chia-I Wu01ca2372016-05-13 14:37:49 +08001714VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001715 dispatch_key key = get_dispatch_key(device);
Chris Forbes04b61da2016-11-03 09:53:59 +13001716 bool skip = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001717 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1718 assert(my_data != NULL);
1719
Chris Forbes04b61da2016-11-03 09:53:59 +13001720 skip |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001721
Chris Forbes04b61da2016-11-03 09:53:59 +13001722 if (!skip) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001723 layer_debug_report_destroy_device(device);
1724
Jeremy Hayes99a96322015-06-26 12:48:09 -06001725#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001726 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001727#endif
1728
Chris Forbese58c9fe2016-11-24 14:44:17 +13001729 my_data->dispatch_table.DestroyDevice(device, pAllocator);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001730 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001731 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001732}
1733
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001734bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001735 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001736 assert(my_device_data != nullptr);
1737
Dustin Gravesde628532016-04-21 16:30:17 -06001738 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001739
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001740 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001741 if (queue_data->second <= queueIndex) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001742 log_msg(my_device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001743 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001744 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1745 "was created.",
1746 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001747 return false;
1748 }
1749 return true;
1750}
1751
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001752VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001753 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001754 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001755 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001756
Chris Forbes04b61da2016-11-03 09:53:59 +13001757 skip |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001758
Chris Forbes04b61da2016-11-03 09:53:59 +13001759 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001760 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1761
Chris Forbese58c9fe2016-11-24 14:44:17 +13001762 my_data->dispatch_table.GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001763 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001764}
1765
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001766VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001767 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001768 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001769 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001770 assert(my_data != NULL);
1771
Chris Forbes04b61da2016-11-03 09:53:59 +13001772 skip |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001773
Chris Forbes04b61da2016-11-03 09:53:59 +13001774 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001775 result = my_data->dispatch_table.QueueSubmit(queue, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001776
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001777 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001778 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001779
Jeremy Hayes99a96322015-06-26 12:48:09 -06001780 return result;
1781}
1782
Chia-I Wu01ca2372016-05-13 14:37:49 +08001783VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001784 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1785 assert(my_data != NULL);
1786
Chris Forbese58c9fe2016-11-24 14:44:17 +13001787 VkResult result = my_data->dispatch_table.QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001788
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001789 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001790
1791 return result;
1792}
1793
Chia-I Wu01ca2372016-05-13 14:37:49 +08001794VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001795 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1796 assert(my_data != NULL);
1797
Chris Forbese58c9fe2016-11-24 14:44:17 +13001798 VkResult result = my_data->dispatch_table.DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001799
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001800 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001801
1802 return result;
1803}
1804
Chia-I Wu01ca2372016-05-13 14:37:49 +08001805VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001806 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001807 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001808 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001809 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001810 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001811
Chris Forbes04b61da2016-11-03 09:53:59 +13001812 skip |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001813
Chris Forbes04b61da2016-11-03 09:53:59 +13001814 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001815 result = my_data->dispatch_table.AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001816
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001817 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001818 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001819
1820 return result;
1821}
1822
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001823VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001824 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001825 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001826 assert(my_data != NULL);
1827
Chris Forbes04b61da2016-11-03 09:53:59 +13001828 skip |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001829
Chris Forbes04b61da2016-11-03 09:53:59 +13001830 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001831 my_data->dispatch_table.FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001832 }
1833}
1834
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001835VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1836 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001837 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001838 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001839 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001840 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001841
Chris Forbes04b61da2016-11-03 09:53:59 +13001842 skip |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001843
Chris Forbes04b61da2016-11-03 09:53:59 +13001844 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001845 result = my_data->dispatch_table.MapMemory(device, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001846
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001847 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001848 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001849
1850 return result;
1851}
1852
Chia-I Wu01ca2372016-05-13 14:37:49 +08001853VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001854 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001855 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1856 assert(my_data != NULL);
1857
Chris Forbes04b61da2016-11-03 09:53:59 +13001858 skip |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001859
Chris Forbes04b61da2016-11-03 09:53:59 +13001860 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001861 my_data->dispatch_table.UnmapMemory(device, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001862 }
1863}
1864
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001865VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1866 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001867 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001868 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001869 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001870 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001871
Chris Forbes04b61da2016-11-03 09:53:59 +13001872 skip |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001873
Chris Forbes04b61da2016-11-03 09:53:59 +13001874 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001875 result = my_data->dispatch_table.FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001876
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001877 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001878 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001879
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001880 return result;
1881}
1882
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001883VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1884 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001885 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001886 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001887 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001888 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001889
Chris Forbes04b61da2016-11-03 09:53:59 +13001890 skip |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001891
Chris Forbes04b61da2016-11-03 09:53:59 +13001892 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001893 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13001894 my_data->dispatch_table.InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001895
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001896 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001897 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001898
Tony Barbourb1250542015-04-16 19:23:13 -06001899 return result;
1900}
1901
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001902VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1903 VkDeviceSize *pCommittedMemoryInBytes) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001904 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001905 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001906 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001907
Chris Forbes04b61da2016-11-03 09:53:59 +13001908 skip |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001909
Chris Forbes04b61da2016-11-03 09:53:59 +13001910 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001911 my_data->dispatch_table.GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001912 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001913}
1914
Chia-I Wu01ca2372016-05-13 14:37:49 +08001915VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1916 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001917 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001918 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001919 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1920 assert(my_data != NULL);
1921
Chris Forbes04b61da2016-11-03 09:53:59 +13001922 skip |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001923
Chris Forbes04b61da2016-11-03 09:53:59 +13001924 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001925 result = my_data->dispatch_table.BindBufferMemory(device, buffer, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001926
1927 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1928 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001929
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001930 return result;
1931}
1932
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001933VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001934 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001935 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001936 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1937 assert(my_data != NULL);
1938
Chris Forbes04b61da2016-11-03 09:53:59 +13001939 skip |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001940
Chris Forbes04b61da2016-11-03 09:53:59 +13001941 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001942 result = my_data->dispatch_table.BindImageMemory(device, image, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001943
1944 validate_result(my_data->report_data, "vkBindImageMemory", result);
1945 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001946
1947 return result;
1948}
1949
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001950VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1951 VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001952 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001953 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001954 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001955
Chris Forbes04b61da2016-11-03 09:53:59 +13001956 skip |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001957
Chris Forbes04b61da2016-11-03 09:53:59 +13001958 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001959 my_data->dispatch_table.GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001960 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001961}
1962
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001963VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001964 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001965 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001966 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001967
Chris Forbes04b61da2016-11-03 09:53:59 +13001968 skip |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001969
Chris Forbes04b61da2016-11-03 09:53:59 +13001970 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001971 my_data->dispatch_table.GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001972 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001973}
1974
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001975bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1976 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001977 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001978 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001979 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001980 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1981 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001982 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001983 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001984 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1985 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001986 return false;
1987 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001988 }
1989
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001990 return true;
1991}
1992
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001993VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1994 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001995 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001996 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001997 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001998
Chris Forbes04b61da2016-11-03 09:53:59 +13001999 skip |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002000 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002001
Chris Forbes04b61da2016-11-03 09:53:59 +13002002 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002003 my_data->dispatch_table.GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002004
2005 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2006 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002007}
2008
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002009bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2010 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2011 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Chris Forbes7b58a712016-11-24 11:35:31 +13002012 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002013 if (pProperties != nullptr) {
2014 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2015 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002016 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002017 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002018 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2019 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002020 return false;
2021 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002022 }
2023
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002024 return true;
2025}
2026
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002027VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2028 VkImageType type, VkSampleCountFlagBits samples,
2029 VkImageUsageFlags usage, VkImageTiling tiling,
2030 uint32_t *pPropertyCount,
2031 VkSparseImageFormatProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002032 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13002033 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002034 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002035
Chris Forbes04b61da2016-11-03 09:53:59 +13002036 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002037 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002038
Chris Forbes04b61da2016-11-03 09:53:59 +13002039 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13002040 my_data->dispatch_table.GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling,
2041 pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002042
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002043 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2044 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002045 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002046}
2047
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002048VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2049 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002050 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002051 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002052 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002053 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002054
Chris Forbes04b61da2016-11-03 09:53:59 +13002055 skip |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002056
Chris Forbes04b61da2016-11-03 09:53:59 +13002057 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002058 result = my_data->dispatch_table.QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002059
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002060 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002061 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002062
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002063 return result;
2064}
2065
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002066VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2067 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002068 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002069 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002070 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002071 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002072
Chris Forbes04b61da2016-11-03 09:53:59 +13002073 skip |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002074
Chris Forbes04b61da2016-11-03 09:53:59 +13002075 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002076 result = my_data->dispatch_table.CreateFence(device, pCreateInfo, pAllocator, pFence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002077
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002078 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002079 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002080
2081 return result;
2082}
2083
Chia-I Wu01ca2372016-05-13 14:37:49 +08002084VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002085 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002086 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002087 assert(my_data != NULL);
2088
Chris Forbes04b61da2016-11-03 09:53:59 +13002089 skip |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002090
Chris Forbes04b61da2016-11-03 09:53:59 +13002091 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002092 my_data->dispatch_table.DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002093 }
2094}
2095
Chia-I Wu01ca2372016-05-13 14:37:49 +08002096VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002097 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002098 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002099 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002100 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002101
Chris Forbes04b61da2016-11-03 09:53:59 +13002102 skip |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002103
Chris Forbes04b61da2016-11-03 09:53:59 +13002104 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002105 result = my_data->dispatch_table.ResetFences(device, fenceCount, pFences);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002106
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002107 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002108 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002109
2110 return result;
2111}
2112
Chia-I Wu01ca2372016-05-13 14:37:49 +08002113VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002114 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002115 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002116 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2117 assert(my_data != NULL);
2118
Chris Forbes04b61da2016-11-03 09:53:59 +13002119 skip |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002120
Chris Forbes04b61da2016-11-03 09:53:59 +13002121 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002122 result = my_data->dispatch_table.GetFenceStatus(device, fence);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002123
2124 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2125 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002126
2127 return result;
2128}
2129
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002130VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2131 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002132 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002133 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002134 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002135 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002136
Chris Forbes04b61da2016-11-03 09:53:59 +13002137 skip |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002138
Chris Forbes04b61da2016-11-03 09:53:59 +13002139 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002140 result = my_data->dispatch_table.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002141
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002142 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002143 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002144
2145 return result;
2146}
2147
Chia-I Wu01ca2372016-05-13 14:37:49 +08002148VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002149 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002150 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002151 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002152 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002153 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002154
Chris Forbes04b61da2016-11-03 09:53:59 +13002155 skip |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002156
Chris Forbes04b61da2016-11-03 09:53:59 +13002157 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002158 result = my_data->dispatch_table.CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002159
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002160 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002161 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002162
2163 return result;
2164}
2165
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002166VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002167 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002168 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002169 assert(my_data != NULL);
2170
Chris Forbes04b61da2016-11-03 09:53:59 +13002171 skip |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002172
Chris Forbes04b61da2016-11-03 09:53:59 +13002173 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002174 my_data->dispatch_table.DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002175 }
2176}
2177
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002178VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2179 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002180 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002181 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002182 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002183 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002184
Chris Forbes04b61da2016-11-03 09:53:59 +13002185 skip |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002186
Chris Forbes04b61da2016-11-03 09:53:59 +13002187 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002188 result = my_data->dispatch_table.CreateEvent(device, pCreateInfo, pAllocator, pEvent);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002189
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002190 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002191 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002192
2193 return result;
2194}
2195
Chia-I Wu01ca2372016-05-13 14:37:49 +08002196VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002197 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002198 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002199 assert(my_data != NULL);
2200
Chris Forbes04b61da2016-11-03 09:53:59 +13002201 skip |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002202
Chris Forbes04b61da2016-11-03 09:53:59 +13002203 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002204 my_data->dispatch_table.DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002205 }
2206}
2207
Chia-I Wu01ca2372016-05-13 14:37:49 +08002208VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002209 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002210 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002211 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2212 assert(my_data != NULL);
2213
Chris Forbes04b61da2016-11-03 09:53:59 +13002214 skip |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002215
Chris Forbes04b61da2016-11-03 09:53:59 +13002216 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002217 result = my_data->dispatch_table.GetEventStatus(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002218
2219 validate_result(my_data->report_data, "vkGetEventStatus", result);
2220 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002221
2222 return result;
2223}
2224
Chia-I Wu01ca2372016-05-13 14:37:49 +08002225VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002226 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002227 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002228 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2229 assert(my_data != NULL);
2230
Chris Forbes04b61da2016-11-03 09:53:59 +13002231 skip |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002232
Chris Forbes04b61da2016-11-03 09:53:59 +13002233 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002234 result = my_data->dispatch_table.SetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002235
2236 validate_result(my_data->report_data, "vkSetEvent", result);
2237 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002238
2239 return result;
2240}
2241
Chia-I Wu01ca2372016-05-13 14:37:49 +08002242VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002243 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002244 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002245 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2246 assert(my_data != NULL);
2247
Chris Forbes04b61da2016-11-03 09:53:59 +13002248 skip |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002249
Chris Forbes04b61da2016-11-03 09:53:59 +13002250 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002251 result = my_data->dispatch_table.ResetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002252
2253 validate_result(my_data->report_data, "vkResetEvent", result);
2254 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002255
2256 return result;
2257}
2258
Chia-I Wu01ca2372016-05-13 14:37:49 +08002259VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002260 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002261 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002262 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002263 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2264 assert(device_data != nullptr);
2265 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002266
Chris Forbes04b61da2016-11-03 09:53:59 +13002267 skip |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002268
Dustin Gravesc900f572016-05-16 11:07:59 -06002269 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2270 if (pCreateInfo != nullptr) {
2271 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2272 // VkQueryPipelineStatisticFlagBits values
2273 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2274 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002275 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002276 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2277 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2278 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2279 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2280 }
2281 }
2282
Chris Forbes04b61da2016-11-03 09:53:59 +13002283 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002284 result = device_data->dispatch_table.CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002285
Dustin Gravesc900f572016-05-16 11:07:59 -06002286 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002287 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002288
2289 return result;
2290}
2291
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002292VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002293 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002294 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002295 assert(my_data != NULL);
2296
Chris Forbes04b61da2016-11-03 09:53:59 +13002297 skip |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002298
Chris Forbes04b61da2016-11-03 09:53:59 +13002299 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002300 my_data->dispatch_table.DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002301 }
2302}
2303
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002304VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2305 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002306 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002307 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002308 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002309 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002310
Chris Forbes04b61da2016-11-03 09:53:59 +13002311 skip |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002312 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002313
Chris Forbes04b61da2016-11-03 09:53:59 +13002314 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002315 result = my_data->dispatch_table.GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002316
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002317 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002318 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002319
2320 return result;
2321}
2322
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002323VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2324 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002325 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002326 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002327 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2328 assert(device_data != nullptr);
2329 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002330
Karl Schultza9ef1e52016-10-06 17:53:48 -06002331 // TODO: Add check for VALIDATION_ERROR_00660
2332 // TODO: Add check for VALIDATION_ERROR_00661
2333 // TODO: Add check for VALIDATION_ERROR_00662
2334 // TODO: Add check for VALIDATION_ERROR_00670
2335 // TODO: Add check for VALIDATION_ERROR_00671
2336 // TODO: Add check for VALIDATION_ERROR_00672
2337 // TODO: Add check for VALIDATION_ERROR_00673
2338 // TODO: Add check for VALIDATION_ERROR_00674
2339 // TODO: Add check for VALIDATION_ERROR_00675
2340 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2341 // TODO: Add check for VALIDATION_ERROR_00663
Chris Forbes04b61da2016-11-03 09:53:59 +13002342 skip |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002343
Dustin Gravesc900f572016-05-16 11:07:59 -06002344 if (pCreateInfo != nullptr) {
2345 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2346 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2347 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2348 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002349 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Karl Schultza9ef1e52016-10-06 17:53:48 -06002350 __LINE__, VALIDATION_ERROR_00665, LayerName,
2351 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2352 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2353 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002354 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002355
Dustin Gravesc900f572016-05-16 11:07:59 -06002356 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2357 // queueFamilyIndexCount uint32_t values
2358 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002359 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Karl Schultza9ef1e52016-10-06 17:53:48 -06002360 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002361 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2362 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002363 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2364 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002365 }
2366
2367 // Ensure that the queue family indices were specified at device creation
Chris Forbes04b61da2016-11-03 09:53:59 +13002368 skip |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesc900f572016-05-16 11:07:59 -06002369 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2370 }
2371 }
2372
Chris Forbes04b61da2016-11-03 09:53:59 +13002373 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002374 result = device_data->dispatch_table.CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002375
Dustin Gravesc900f572016-05-16 11:07:59 -06002376 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002377 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002378
2379 return result;
2380}
2381
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002382VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002383 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002384 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002385 assert(my_data != NULL);
2386
Chris Forbes04b61da2016-11-03 09:53:59 +13002387 skip |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002388
Chris Forbes04b61da2016-11-03 09:53:59 +13002389 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002390 my_data->dispatch_table.DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002391 }
2392}
2393
Chia-I Wu01ca2372016-05-13 14:37:49 +08002394VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2395 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002396 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002397 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002398 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002399 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002400
Chris Forbes04b61da2016-11-03 09:53:59 +13002401 skip |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002402
Chris Forbes04b61da2016-11-03 09:53:59 +13002403 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002404 result = my_data->dispatch_table.CreateBufferView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002405
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002406 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002407 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002408
2409 return result;
2410}
2411
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002412VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002413 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002414 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002415 assert(my_data != NULL);
2416
Chris Forbes04b61da2016-11-03 09:53:59 +13002417 skip |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002418
Chris Forbes04b61da2016-11-03 09:53:59 +13002419 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002420 my_data->dispatch_table.DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002421 }
2422}
2423
Chia-I Wu01ca2372016-05-13 14:37:49 +08002424VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2425 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002426 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002427 bool skip = false;
Dustin Gravesf8032f22016-05-11 18:31:44 -06002428 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002429 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002430 debug_report_data *report_data = device_data->report_data;
2431
Chris Forbes04b61da2016-11-03 09:53:59 +13002432 skip |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002433
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002434 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002435 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002436 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002437 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2438 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002439 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002440 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2441 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2442 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2443 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002444
Dustin Gravesc900f572016-05-16 11:07:59 -06002445 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2446 // queueFamilyIndexCount uint32_t values
2447 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002448 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002449 __LINE__, REQUIRED_PARAMETER, LayerName,
2450 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2451 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2452 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2453 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002454
Chris Forbes04b61da2016-11-03 09:53:59 +13002455 skip |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesf8032f22016-05-11 18:31:44 -06002456 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2457 }
2458
2459 // width, height, and depth members of extent must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002460 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2461 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002462 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
Chris Forbes04b61da2016-11-03 09:53:59 +13002463 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002464
2465 // mipLevels must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002466 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002467
2468 // arrayLayers must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002469 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002470
2471 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2472 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002473 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002474 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002475 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002476 }
2477
2478 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2479 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2480 // extent.height must be equal
2481 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2482 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002483 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002484 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2485 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2486 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002487 }
2488
2489 if (pCreateInfo->extent.depth != 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002490 skip |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002491 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002492 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2493 }
2494 }
2495
2496 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2497 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2498 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002499 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002500 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2501 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2502 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002503 }
2504
2505 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2506 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2507 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2508 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002509 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002510 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2511 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2512 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002513 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002514 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002515
Chris Forbes04b61da2016-11-03 09:53:59 +13002516 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002517 result = device_data->dispatch_table.CreateImage(device, pCreateInfo, pAllocator, pImage);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002518
Dustin Gravesf8032f22016-05-11 18:31:44 -06002519 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002520 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002521
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002522 return result;
2523}
2524
Chia-I Wu01ca2372016-05-13 14:37:49 +08002525VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002526 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002527 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002528 assert(my_data != NULL);
2529
Chris Forbes04b61da2016-11-03 09:53:59 +13002530 skip |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002531
Chris Forbes04b61da2016-11-03 09:53:59 +13002532 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002533 my_data->dispatch_table.DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002534 }
2535}
2536
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002537bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002538 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002539 if (pSubresource != nullptr) {
2540 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2541 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002542 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002543 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002544 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2545 return false;
2546 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002547 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002548
2549 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002550}
2551
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002552VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2553 VkSubresourceLayout *pLayout) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002554 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002555 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002556 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002557
Chris Forbes04b61da2016-11-03 09:53:59 +13002558 skip |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002559
Chris Forbes04b61da2016-11-03 09:53:59 +13002560 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002561 PreGetImageSubresourceLayout(device, pSubresource);
2562
Chris Forbese58c9fe2016-11-24 14:44:17 +13002563 my_data->dispatch_table.GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002564 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002565}
2566
Chia-I Wu01ca2372016-05-13 14:37:49 +08002567VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2568 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002569 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002570 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002571 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002572 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002573 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002574
Chris Forbes04b61da2016-11-03 09:53:59 +13002575 skip |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002576
Dustin Graves0b70a632016-04-27 17:44:56 -06002577 if (pCreateInfo != nullptr) {
2578 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002579 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2580 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002581 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002582 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2583 "pCreateInfo->subresourceRange.layerCount must be 1",
2584 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2585 }
2586 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002587 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2588 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2589 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002590 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002591 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2592 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2593 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2594 }
2595 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002596 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2597 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002598 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002599 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2600 "pCreateInfo->subresourceRange.layerCount must be 6");
2601 }
2602 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002603 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2604 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002605 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002606 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2607 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2608 }
2609 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2610 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002611 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002612 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2613 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2614 }
2615
Dustin Graves2a80dc62016-07-12 13:57:02 -06002616 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2617 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002618 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002619 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2620 "pCreateInfo->subresourceRange.layerCount must be 1");
2621 }
2622 }
2623 }
2624
Chris Forbes04b61da2016-11-03 09:53:59 +13002625 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002626 result = my_data->dispatch_table.CreateImageView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002627
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002628 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002629 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002630
2631 return result;
2632}
2633
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002634VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002635 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002636 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002637 assert(my_data != NULL);
2638
Chris Forbes04b61da2016-11-03 09:53:59 +13002639 skip |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002640
Chris Forbes04b61da2016-11-03 09:53:59 +13002641 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002642 my_data->dispatch_table.DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002643 }
2644}
2645
Chia-I Wu01ca2372016-05-13 14:37:49 +08002646VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002647 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002648 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002649 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002650 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002651 assert(my_data != NULL);
2652
Chris Forbes04b61da2016-11-03 09:53:59 +13002653 skip |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002654
Chris Forbes04b61da2016-11-03 09:53:59 +13002655 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002656 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13002657 my_data->dispatch_table.CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002658
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002659 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002660 }
2661
Michael Lentine03d8e572015-09-15 14:59:14 -05002662 return result;
2663}
2664
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002665VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2666 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002667 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002668 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002669 assert(my_data != NULL);
2670
Chris Forbes04b61da2016-11-03 09:53:59 +13002671 skip |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002672
Chris Forbes04b61da2016-11-03 09:53:59 +13002673 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002674 my_data->dispatch_table.DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002675 }
2676}
2677
Chia-I Wu01ca2372016-05-13 14:37:49 +08002678VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002679 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002680 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002681 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002682 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002683 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002684
Chris Forbes04b61da2016-11-03 09:53:59 +13002685 skip |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002686
Chris Forbes04b61da2016-11-03 09:53:59 +13002687 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002688 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13002689 my_data->dispatch_table.CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002690
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002691 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002692 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002693
2694 return result;
2695}
2696
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002697VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2698 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002699 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002700 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002701 assert(my_data != NULL);
2702
Chris Forbes04b61da2016-11-03 09:53:59 +13002703 skip |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002704
Chris Forbes04b61da2016-11-03 09:53:59 +13002705 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002706 my_data->dispatch_table.DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002707 }
2708}
2709
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002710VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2711 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002712 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002713 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002714 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002715 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002716
Chris Forbes04b61da2016-11-03 09:53:59 +13002717 skip |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002718
Chris Forbes04b61da2016-11-03 09:53:59 +13002719 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002720 result = my_data->dispatch_table.GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002721
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002722 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002723 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002724
2725 return result;
2726}
2727
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002728VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2729 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002730 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002731 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002732 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002733 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002734
Chris Forbes04b61da2016-11-03 09:53:59 +13002735 skip |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002736
Chris Forbes04b61da2016-11-03 09:53:59 +13002737 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002738 result = my_data->dispatch_table.MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002739
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002740 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002741 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002742
2743 return result;
2744}
2745
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002746bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002747 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2748
2749 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002750 if (pCreateInfos != nullptr) {
2751 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2752 if (pCreateInfos->basePipelineIndex != -1) {
2753 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002754 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002755 VALIDATION_ERROR_00526, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002756 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2757 "pCreateInfos->flags "
Mike Weiblen9858d962016-10-31 23:59:10 -06002758 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1. %s",
2759 validation_error_map[VALIDATION_ERROR_00526]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002760 return false;
2761 }
2762 }
2763
2764 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2765 if (pCreateInfos->basePipelineIndex != -1) {
2766 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002767 data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002768 VALIDATION_ERROR_00528, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002769 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2770 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
Mike Weiblen9858d962016-10-31 23:59:10 -06002771 "VK_NULL_HANDLE. %s",
2772 validation_error_map[VALIDATION_ERROR_00528]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002773 return false;
2774 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002775 }
2776 }
2777
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002778 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002779 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002780 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002781 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002782 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2783 "unrecognized enumerator");
2784 return false;
2785 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002786
2787 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2788 (data->physical_device_features.fillModeNonSolid == false)) {
2789 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002790 data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002791 DEVICE_FEATURE, LayerName,
2792 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2793 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2794 return false;
2795 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002796 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002797
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002798 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002799 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002800 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2801 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002802 pCreateInfos[i].pStages[j].pName);
2803 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002804 }
2805
2806 return true;
2807}
2808
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002809VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2810 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2811 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002812 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002813 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002814 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2815 assert(device_data != nullptr);
2816 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002817
Chris Forbes04b61da2016-11-03 09:53:59 +13002818 skip |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
Dustin Gravesc900f572016-05-16 11:07:59 -06002819 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002820
Dustin Gravesc900f572016-05-16 11:07:59 -06002821 if (pCreateInfos != nullptr) {
2822 for (uint32_t i = 0; i < createInfoCount; ++i) {
2823 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2824 if (pCreateInfos[i].pTessellationState == nullptr) {
2825 if (pCreateInfos[i].pStages != nullptr) {
2826 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2827 // pTessellationState must not be NULL
2828 bool has_control = false;
2829 bool has_eval = false;
2830
2831 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2832 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2833 has_control = true;
2834 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2835 has_eval = true;
2836 }
2837 }
2838
2839 if (has_control && has_eval) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002840 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002841 __LINE__, VALIDATION_ERROR_00536, LayerName,
2842 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2843 "control shader stage and a tessellation evaluation shader stage, "
2844 "pCreateInfos[%d].pTessellationState must not be NULL. %s",
2845 i, i, validation_error_map[VALIDATION_ERROR_00536]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002846 }
2847 }
Dustin Graves629259b2016-05-30 16:14:27 -06002848 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002849 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002850 report_data, "vkCreateGraphicsPipelines",
2851 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2852 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002853
Chris Forbes04b61da2016-11-03 09:53:59 +13002854 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002855 report_data, "vkCreateGraphicsPipelines",
2856 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2857 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002858
2859 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002860 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002861 __LINE__, VALIDATION_ERROR_00538, LayerName,
2862 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2863 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO. %s",
2864 i, validation_error_map[VALIDATION_ERROR_00538]);
Dustin Graves629259b2016-05-30 16:14:27 -06002865 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002866 }
2867
2868 if (pCreateInfos[i].pViewportState == nullptr) {
2869 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2870 // valid VkPipelineViewportStateCreateInfo structure
2871 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2872 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002873 skip |= log_msg(
Dustin Gravesc900f572016-05-16 11:07:59 -06002874 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002875 VALIDATION_ERROR_02113, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002876 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
Mike Weiblen9858d962016-10-31 23:59:10 -06002877 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure. "
2878 "%s",
2879 i, i, validation_error_map[VALIDATION_ERROR_02113]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002880 }
2881 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002882 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002883 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2884 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2885 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002886
Chris Forbes04b61da2016-11-03 09:53:59 +13002887 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002888 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2889 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002890 pCreateInfos[i].pViewportState->flags);
2891
Dustin Gravesc900f572016-05-16 11:07:59 -06002892 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002893 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002894 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2895 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2896 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2897 i);
2898 }
2899
2900 if (pCreateInfos[i].pDynamicState != nullptr) {
2901 bool has_dynamic_viewport = false;
2902 bool has_dynamic_scissor = false;
2903
2904 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2905 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2906 has_dynamic_viewport = true;
2907 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2908 has_dynamic_scissor = true;
2909 }
2910 }
2911
2912 // viewportCount must be greater than 0
2913 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2914 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002915 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002916 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002917 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2918 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002919 "must be greater than 0",
2920 i, i);
2921 }
2922
2923 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2924 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2925 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002926 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002927 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002928 __LINE__, VALIDATION_ERROR_02110, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002929 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002930 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL. %s",
2931 i, i, validation_error_map[VALIDATION_ERROR_02110]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002932 }
2933
2934 // scissorCount must be greater than 0
2935 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2936 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002937 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002938 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002939 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2940 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002941 "must be greater than 0",
2942 i, i);
2943 }
2944
2945 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2946 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2947 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002948 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002949 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002950 __LINE__, VALIDATION_ERROR_02111, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002951 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002952 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL. %s",
2953 i, i, validation_error_map[VALIDATION_ERROR_02111]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002954 }
2955 }
2956 }
2957
2958 if (pCreateInfos[i].pMultisampleState == nullptr) {
2959 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2960 // a valid VkPipelineMultisampleStateCreateInfo structure
2961 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2962 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
Mike Weiblen9858d962016-10-31 23:59:10 -06002963 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2964 __LINE__, VALIDATION_ERROR_02114, LayerName,
2965 "vkCreateGraphicsPipelines: if "
2966 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2967 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL. %s",
2968 i, i, validation_error_map[VALIDATION_ERROR_02114]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002969 }
Dustin Graves629259b2016-05-30 16:14:27 -06002970 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002971 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002972 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2973 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002974 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002975
Chris Forbes04b61da2016-11-03 09:53:59 +13002976 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002977 report_data, "vkCreateGraphicsPipelines",
2978 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
2979 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002980
Chris Forbes04b61da2016-11-03 09:53:59 +13002981 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002982 report_data, "vkCreateGraphicsPipelines",
2983 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
2984 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06002985
Chris Forbes04b61da2016-11-03 09:53:59 +13002986 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002987 report_data, "vkCreateGraphicsPipelines",
2988 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
2989 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
2990 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
2991 false);
Dustin Graves629259b2016-05-30 16:14:27 -06002992
Chris Forbes04b61da2016-11-03 09:53:59 +13002993 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002994 report_data, "vkCreateGraphicsPipelines",
2995 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
2996 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06002997
Chris Forbes04b61da2016-11-03 09:53:59 +13002998 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002999 report_data, "vkCreateGraphicsPipelines",
3000 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3001 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003002
3003 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003004 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Graves629259b2016-05-30 16:14:27 -06003005 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3006 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3007 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3008 i);
3009 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003010 }
3011
3012 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003013 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003014 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003015 report_data, "vkCreateGraphicsPipelines",
3016 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3017 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003018
Chris Forbes04b61da2016-11-03 09:53:59 +13003019 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003020 report_data, "vkCreateGraphicsPipelines",
3021 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3022 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003023
Chris Forbes04b61da2016-11-03 09:53:59 +13003024 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003025 report_data, "vkCreateGraphicsPipelines",
3026 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3027 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003028
Chris Forbes04b61da2016-11-03 09:53:59 +13003029 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003030 report_data, "vkCreateGraphicsPipelines",
3031 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3032 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003033
Chris Forbes04b61da2016-11-03 09:53:59 +13003034 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003035 report_data, "vkCreateGraphicsPipelines",
3036 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3037 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3038 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003039
Chris Forbes04b61da2016-11-03 09:53:59 +13003040 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003041 report_data, "vkCreateGraphicsPipelines",
3042 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3043 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003044
Chris Forbes04b61da2016-11-03 09:53:59 +13003045 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003046 report_data, "vkCreateGraphicsPipelines",
3047 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3048 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003049
Chris Forbes04b61da2016-11-03 09:53:59 +13003050 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003051 report_data, "vkCreateGraphicsPipelines",
3052 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3053 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3054 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003055
Chris Forbes04b61da2016-11-03 09:53:59 +13003056 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003057 report_data, "vkCreateGraphicsPipelines",
3058 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3059 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3060 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003061
Chris Forbes04b61da2016-11-03 09:53:59 +13003062 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003063 report_data, "vkCreateGraphicsPipelines",
3064 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3065 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3066 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003067
Chris Forbes04b61da2016-11-03 09:53:59 +13003068 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003069 report_data, "vkCreateGraphicsPipelines",
3070 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3071 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3072 pCreateInfos[i].pDepthStencilState->front.compareOp);
3073
Chris Forbes04b61da2016-11-03 09:53:59 +13003074 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003075 report_data, "vkCreateGraphicsPipelines",
3076 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003077 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3078
Chris Forbes04b61da2016-11-03 09:53:59 +13003079 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003080 report_data, "vkCreateGraphicsPipelines",
3081 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003082 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3083
Chris Forbes04b61da2016-11-03 09:53:59 +13003084 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003085 report_data, "vkCreateGraphicsPipelines",
3086 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3087 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3088 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003089
Chris Forbes04b61da2016-11-03 09:53:59 +13003090 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003091 report_data, "vkCreateGraphicsPipelines",
3092 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3093 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3094 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003095
3096 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003097 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Graves629259b2016-05-30 16:14:27 -06003098 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3099 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3100 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3101 i);
3102 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003103 }
3104
3105 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3106 if (pCreateInfos[i].pColorBlendState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003107 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003108 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3109 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3110 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003111
Chris Forbes04b61da2016-11-03 09:53:59 +13003112 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003113 report_data, "vkCreateGraphicsPipelines",
3114 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3115 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003116
Chris Forbes04b61da2016-11-03 09:53:59 +13003117 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003118 report_data, "vkCreateGraphicsPipelines",
3119 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3120 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003121
Chris Forbes04b61da2016-11-03 09:53:59 +13003122 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003123 report_data, "vkCreateGraphicsPipelines",
3124 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3125 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3126 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003127
3128 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3129 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3130 ++attachmentIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003131 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003132 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3133 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3134 ParameterName::IndexVector{i, attachmentIndex}),
3135 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003136
Chris Forbes04b61da2016-11-03 09:53:59 +13003137 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003138 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003139 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3140 ParameterName::IndexVector{i, attachmentIndex}),
3141 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003142 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3143
Chris Forbes04b61da2016-11-03 09:53:59 +13003144 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003145 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003146 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3147 ParameterName::IndexVector{i, attachmentIndex}),
3148 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003149 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3150
Chris Forbes04b61da2016-11-03 09:53:59 +13003151 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003152 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3153 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3154 ParameterName::IndexVector{i, attachmentIndex}),
3155 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3156 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003157
Chris Forbes04b61da2016-11-03 09:53:59 +13003158 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003159 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003160 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3161 ParameterName::IndexVector{i, attachmentIndex}),
3162 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003163 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3164
Chris Forbes04b61da2016-11-03 09:53:59 +13003165 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003166 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003167 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3168 ParameterName::IndexVector{i, attachmentIndex}),
3169 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003170 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3171
Chris Forbes04b61da2016-11-03 09:53:59 +13003172 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003173 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3174 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3175 ParameterName::IndexVector{i, attachmentIndex}),
3176 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3177 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003178
Chris Forbes04b61da2016-11-03 09:53:59 +13003179 skip |=
Dustin Graves629259b2016-05-30 16:14:27 -06003180 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003181 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3182 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003183 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3184 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3185 }
3186 }
3187
Dustin Gravesc900f572016-05-16 11:07:59 -06003188 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003189 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003190 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3191 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3192 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3193 i);
3194 }
3195
3196 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3197 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003198 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003199 report_data, "vkCreateGraphicsPipelines",
3200 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003201 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3202 }
3203 }
3204 }
3205 }
3206
Chris Forbes04b61da2016-11-03 09:53:59 +13003207 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003208 PreCreateGraphicsPipelines(device, pCreateInfos);
3209
Chris Forbese58c9fe2016-11-24 14:44:17 +13003210 result = device_data->dispatch_table.CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003211
Dustin Gravesc900f572016-05-16 11:07:59 -06003212 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003213 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003214
3215 return result;
3216}
3217
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003218bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003219 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3220
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003221 if (pCreateInfos != nullptr) {
3222 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003223 uint32_t i = 0;
3224 validate_string(data->report_data, "vkCreateComputePipelines",
3225 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003226 }
3227
3228 return true;
3229}
3230
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003231VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3232 const VkComputePipelineCreateInfo *pCreateInfos,
3233 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003234 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003235 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003236 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003237 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003238
Chris Forbes04b61da2016-11-03 09:53:59 +13003239 skip |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003240 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003241
Chris Forbes04b61da2016-11-03 09:53:59 +13003242 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003243 PreCreateComputePipelines(device, pCreateInfos);
3244
Chris Forbese58c9fe2016-11-24 14:44:17 +13003245 result = my_data->dispatch_table.CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003246
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003247 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003248 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003249
3250 return result;
3251}
3252
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003253VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003254 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003255 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003256 assert(my_data != NULL);
3257
Chris Forbes04b61da2016-11-03 09:53:59 +13003258 skip |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003259
Chris Forbes04b61da2016-11-03 09:53:59 +13003260 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003261 my_data->dispatch_table.DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003262 }
3263}
3264
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003265VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3266 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003267 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003268 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003269 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003270 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003271
Chris Forbes04b61da2016-11-03 09:53:59 +13003272 skip |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003273
Chris Forbes04b61da2016-11-03 09:53:59 +13003274 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003275 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13003276 my_data->dispatch_table.CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003277
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003278 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003279 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003280
3281 return result;
3282}
3283
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003284VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3285 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003286 bool skip = 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 Graves27a912a2016-03-07 17:52:14 -07003288 assert(my_data != NULL);
3289
Chris Forbes04b61da2016-11-03 09:53:59 +13003290 skip |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003291
Chris Forbes04b61da2016-11-03 09:53:59 +13003292 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003293 my_data->dispatch_table.DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003294 }
3295}
3296
Chia-I Wu01ca2372016-05-13 14:37:49 +08003297VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3298 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003299 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003300 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003301 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3302 assert(device_data != NULL);
3303 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003304
Chris Forbes04b61da2016-11-03 09:53:59 +13003305 skip |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003306
Dustin Gravesc900f572016-05-16 11:07:59 -06003307 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3308 if (pCreateInfo != nullptr) {
3309 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3310 if (pCreateInfo->compareEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003311 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003312 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3313 }
3314
3315 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3316 // valid VkBorderColor value
3317 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3318 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3319 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003320 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
Dustin Gravesc900f572016-05-16 11:07:59 -06003321 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3322 }
3323 }
3324
Chris Forbes04b61da2016-11-03 09:53:59 +13003325 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003326 result = device_data->dispatch_table.CreateSampler(device, pCreateInfo, pAllocator, pSampler);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003327
Dustin Gravesc900f572016-05-16 11:07:59 -06003328 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003329 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003330
3331 return result;
3332}
3333
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003334VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003335 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003336 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003337 assert(my_data != NULL);
3338
Chris Forbes04b61da2016-11-03 09:53:59 +13003339 skip |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003340
Chris Forbes04b61da2016-11-03 09:53:59 +13003341 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003342 my_data->dispatch_table.DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003343 }
3344}
3345
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003346VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3347 const VkAllocationCallbacks *pAllocator,
3348 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003349 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003350 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003351 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3352 assert(device_data != nullptr);
3353 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003354
Chris Forbes04b61da2016-11-03 09:53:59 +13003355 skip |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003356
Dustin Gravesc900f572016-05-16 11:07:59 -06003357 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3358 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3359 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3360 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3361 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3362 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3363 // valid VkSampler handles
3364 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3365 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3366 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3367 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3368 ++descriptor_index) {
3369 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003370 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003371 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3372 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3373 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3374 " specified as VK_NULL_HANDLE",
3375 i, descriptor_index);
3376 }
3377 }
3378 }
3379
3380 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3381 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3382 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003383 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003384 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3385 UNRECOGNIZED_VALUE, LayerName,
3386 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3387 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3388 i, i);
3389 }
3390 }
3391 }
3392 }
3393
Chris Forbes04b61da2016-11-03 09:53:59 +13003394 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003395 result = device_data->dispatch_table.CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003396
Dustin Gravesc900f572016-05-16 11:07:59 -06003397 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003398 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003399
3400 return result;
3401}
3402
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003403VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3404 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003405 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003406 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003407 assert(my_data != NULL);
3408
Chris Forbes04b61da2016-11-03 09:53:59 +13003409 skip |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003410
Chris Forbes04b61da2016-11-03 09:53:59 +13003411 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003412 my_data->dispatch_table.DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003413 }
3414}
3415
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003416VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3417 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003418 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003419 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003420 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003421 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003422
Chris Forbes04b61da2016-11-03 09:53:59 +13003423 skip |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003424
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003425 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3426
Chris Forbes04b61da2016-11-03 09:53:59 +13003427 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003428 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13003429 my_data->dispatch_table.CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003430
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003431 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003432 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003433
3434 return result;
3435}
3436
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003437VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3438 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003439 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003440 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003441 assert(my_data != NULL);
3442
Chris Forbes04b61da2016-11-03 09:53:59 +13003443 skip |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003444
Chris Forbes04b61da2016-11-03 09:53:59 +13003445 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003446 my_data->dispatch_table.DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003447 }
3448}
3449
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003450VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3451 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003452 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003453 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003454 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3455 assert(my_data != NULL);
3456
Chris Forbes04b61da2016-11-03 09:53:59 +13003457 skip |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003458
Chris Forbes04b61da2016-11-03 09:53:59 +13003459 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003460 result = my_data->dispatch_table.ResetDescriptorPool(device, descriptorPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06003461
3462 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3463 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003464
3465 return result;
3466}
3467
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003468VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3469 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003470 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003471 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003472 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003473 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003474
Chris Forbes04b61da2016-11-03 09:53:59 +13003475 skip |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003476
Chris Forbes04b61da2016-11-03 09:53:59 +13003477 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003478 result = my_data->dispatch_table.AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003479
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003480 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003481 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003482
3483 return result;
3484}
3485
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003486VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003487 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003488 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003489 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003490 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3491 assert(device_data != nullptr);
3492 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003493
Chris Forbes04b61da2016-11-03 09:53:59 +13003494 skip |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003495
Dustin Gravesc900f572016-05-16 11:07:59 -06003496 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3497 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3498 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003499 skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003500 pDescriptorSets, true, true);
3501
Chris Forbes04b61da2016-11-03 09:53:59 +13003502 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003503 result = device_data->dispatch_table.FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003504
Dustin Gravesc900f572016-05-16 11:07:59 -06003505 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003506 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003507
3508 return result;
3509}
3510
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003511VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3512 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3513 const VkCopyDescriptorSet *pDescriptorCopies) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003514 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003515 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3516 assert(device_data != NULL);
3517 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003518
Chris Forbes04b61da2016-11-03 09:53:59 +13003519 skip |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
Dustin Gravesc900f572016-05-16 11:07:59 -06003520 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003521
Dustin Gravesc900f572016-05-16 11:07:59 -06003522 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3523 if (pDescriptorWrites != NULL) {
3524 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3525 // descriptorCount must be greater than 0
3526 if (pDescriptorWrites[i].descriptorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003527 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003528 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3529 REQUIRED_PARAMETER, LayerName,
3530 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3531 }
3532
3533 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3534 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3535 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3536 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3537 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3538 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3539 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3540 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3541 if (pDescriptorWrites[i].pImageInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003542 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003543 __LINE__, REQUIRED_PARAMETER, LayerName,
3544 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3545 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3546 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3547 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3548 i, i);
3549 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3550 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3551 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3552 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3553 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3554 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003555 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003556 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3557 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003558 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
Chris Forbes04b61da2016-11-03 09:53:59 +13003559 skip |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003560 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3561 ParameterName::IndexVector{i, descriptor_index}),
3562 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003563 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3564 }
3565 }
3566 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3567 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3568 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3569 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3570 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3571 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3572 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3573 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003574 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003575 __LINE__, REQUIRED_PARAMETER, LayerName,
3576 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3577 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3578 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3579 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3580 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003581 } else {
3582 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003583 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003584 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3585 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003586 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3587 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003588 }
3589 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3590 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3591 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3592 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3593 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003594 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003595 __LINE__, REQUIRED_PARAMETER, LayerName,
3596 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3597 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3598 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3599 i, i);
3600 } else {
3601 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3602 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003603 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003604 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3605 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003606 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3607 }
3608 }
3609 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003610
3611 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3612 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3613 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3614 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3615 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3616 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003617 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003618 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003619 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003620 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3621 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3622 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3623 }
3624 }
3625 }
3626 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3627 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3628 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3629 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3630 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3631 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003632 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003633 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003634 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003635 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3636 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3637 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3638 }
3639 }
3640 }
3641 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003642 }
3643 }
3644
Chris Forbes04b61da2016-11-03 09:53:59 +13003645 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003646 device_data->dispatch_table.UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003647 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003648}
3649
Chia-I Wu01ca2372016-05-13 14:37:49 +08003650VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003651 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003652 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003653 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003654 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003655 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003656
Chris Forbes04b61da2016-11-03 09:53:59 +13003657 skip |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003658
Chris Forbes04b61da2016-11-03 09:53:59 +13003659 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003660 result = my_data->dispatch_table.CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003661
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003662 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003663 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003664
3665 return result;
3666}
3667
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003668VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003669 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003670 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003671 assert(my_data != NULL);
3672
Chris Forbes04b61da2016-11-03 09:53:59 +13003673 skip |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003674
Chris Forbes04b61da2016-11-03 09:53:59 +13003675 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003676 my_data->dispatch_table.DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003677 }
3678}
3679
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003680bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003681 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003682 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3683
3684 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3685 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003686 skip |= 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 -06003687 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003688 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3689 }
3690 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003691 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003692}
3693
Chia-I Wu01ca2372016-05-13 14:37:49 +08003694VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003695 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003696 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003697 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003698 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003699 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003700
Chris Forbes04b61da2016-11-03 09:53:59 +13003701 skip |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3702 skip |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003703
Chris Forbes04b61da2016-11-03 09:53:59 +13003704 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003705 result = my_data->dispatch_table.CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003706
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003707 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003708 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003709
3710 return result;
3711}
3712
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003713VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003714 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003715 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003716 assert(my_data != NULL);
3717
Chris Forbes04b61da2016-11-03 09:53:59 +13003718 skip |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003719
Chris Forbes04b61da2016-11-03 09:53:59 +13003720 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003721 my_data->dispatch_table.DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003722 }
3723}
3724
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003725VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003726 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003727 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003728 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003729
Chris Forbes04b61da2016-11-03 09:53:59 +13003730 skip |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003731
Chris Forbes04b61da2016-11-03 09:53:59 +13003732 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003733 my_data->dispatch_table.GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003734 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003735}
3736
Chia-I Wu01ca2372016-05-13 14:37:49 +08003737VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003738 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003739 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003740 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003741 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003742 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003743
Chris Forbes04b61da2016-11-03 09:53:59 +13003744 skip |=
Dustin Gravesde628532016-04-21 16:30:17 -06003745 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003746
Chris Forbes04b61da2016-11-03 09:53:59 +13003747 skip |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003748
Chris Forbes04b61da2016-11-03 09:53:59 +13003749 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003750 result = my_data->dispatch_table.CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003751
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003752 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003753 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003754
3755 return result;
3756}
3757
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003758VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003759 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003760 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003761 assert(my_data != NULL);
3762
Chris Forbes04b61da2016-11-03 09:53:59 +13003763 skip |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003764
Chris Forbes04b61da2016-11-03 09:53:59 +13003765 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003766 my_data->dispatch_table.DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003767 }
3768}
3769
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003770VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003771 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003772 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003773 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3774 assert(my_data != NULL);
3775
Chris Forbes04b61da2016-11-03 09:53:59 +13003776 skip |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003777
Chris Forbes04b61da2016-11-03 09:53:59 +13003778 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003779 result = my_data->dispatch_table.ResetCommandPool(device, commandPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06003780
3781 validate_result(my_data->report_data, "vkResetCommandPool", result);
3782 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003783
3784 return result;
3785}
3786
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003787VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3788 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003789 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003790 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003791 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003792 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003793
Chris Forbes04b61da2016-11-03 09:53:59 +13003794 skip |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003795
Chris Forbes04b61da2016-11-03 09:53:59 +13003796 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003797 result = my_data->dispatch_table.AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003798
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003799 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003800 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003801
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003802 return result;
3803}
3804
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003805VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003806 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003807 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003808 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3809 assert(device_data != nullptr);
3810 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003811
Chris Forbes04b61da2016-11-03 09:53:59 +13003812 skip |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003813
Dustin Gravesc900f572016-05-16 11:07:59 -06003814 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3815 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3816 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003817 skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003818 pCommandBuffers, true, true);
3819
Chris Forbes04b61da2016-11-03 09:53:59 +13003820 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003821 device_data->dispatch_table.FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003822 }
3823}
3824
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003825bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003826 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003827 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3828
3829 if (pInfo != NULL) {
Chris Forbesc5554a52016-11-24 14:45:16 +13003830 if ((dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003831 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003832 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 -06003833 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003834 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3835 "inheritedQueries.");
3836 }
3837
Chris Forbesc5554a52016-11-24 14:45:16 +13003838 if ((dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003839 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003840 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003841 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 -06003842 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003843 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3844 "valid combination of VkQueryControlFlagBits.",
3845 pInfo->queryFlags);
3846 }
3847 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003848 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003849}
3850
3851VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003852 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003853 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003854 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3855 assert(device_data != nullptr);
3856 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003857
Chris Forbes04b61da2016-11-03 09:53:59 +13003858 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003859
Dustin Gravesc900f572016-05-16 11:07:59 -06003860 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3861 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13003862 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Dustin Gravesc900f572016-05-16 11:07:59 -06003863 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3864 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3865
3866 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003867 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003868 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003869
Chris Forbes04b61da2016-11-03 09:53:59 +13003870 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Dustin Graves629259b2016-05-30 16:14:27 -06003871 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3872
Dustin Gravesc900f572016-05-16 11:07:59 -06003873 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003874 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06003875 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3876
3877 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003878 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Dustin Gravesc900f572016-05-16 11:07:59 -06003879 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3880 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3881 }
3882
Chris Forbes04b61da2016-11-03 09:53:59 +13003883 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003884
Chris Forbes04b61da2016-11-03 09:53:59 +13003885 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003886 result = device_data->dispatch_table.BeginCommandBuffer(commandBuffer, pBeginInfo);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003887
Dustin Gravesc900f572016-05-16 11:07:59 -06003888 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003889 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003890
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003891 return result;
3892}
3893
Chia-I Wu01ca2372016-05-13 14:37:49 +08003894VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003895 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3896 assert(my_data != NULL);
3897
Chris Forbese58c9fe2016-11-24 14:44:17 +13003898 VkResult result = my_data->dispatch_table.EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003899
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003900 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003901
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003902 return result;
3903}
3904
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003905VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003906 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003907 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3908 assert(my_data != NULL);
3909
Chris Forbes04b61da2016-11-03 09:53:59 +13003910 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003911
Chris Forbes04b61da2016-11-03 09:53:59 +13003912 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003913 result = my_data->dispatch_table.ResetCommandBuffer(commandBuffer, flags);
Dustin Graves16d18972016-05-09 17:36:57 -06003914
3915 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3916 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003917
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003918 return result;
3919}
3920
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003921VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3922 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003923 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003924 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3925 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003926
Chris Forbes04b61da2016-11-03 09:53:59 +13003927 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003928
Chris Forbes04b61da2016-11-03 09:53:59 +13003929 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003930 my_data->dispatch_table.CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003931 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003932}
3933
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003934bool preCmdSetViewport(layer_data *my_data, uint32_t viewport_count, const VkViewport *viewports) {
3935 debug_report_data *report_data = my_data->report_data;
3936
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003937 bool skip =
3938 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003939
3940 if (viewport_count > 0 && viewports != nullptr) {
3941 const VkPhysicalDeviceLimits &limits = my_data->device_limits;
3942 for (uint32_t viewportIndex = 0; viewportIndex < viewport_count; ++viewportIndex) {
3943 const VkViewport &viewport = viewports[viewportIndex];
3944
3945 if (viewport.width <= 0 || viewport.width > limits.maxViewportDimensions[0]) {
3946 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3947 VALIDATION_ERROR_01448, LayerName,
3948 "vkCmdSetViewport %d: width (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3949 viewport.width, limits.maxViewportDimensions[0], validation_error_map[VALIDATION_ERROR_01448]);
3950 }
3951
3952 bool invalid_height = (viewport.height <= 0 || viewport.height > limits.maxViewportDimensions[1]);
3953 if (my_data->amd_negative_viewport_height_enabled && (viewport.height < 0)) {
3954 // VALIDATION_ERROR_01790
3955 invalid_height = false;
3956 }
3957 if (invalid_height) {
3958 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3959 VALIDATION_ERROR_01449, LayerName,
3960 "vkCmdSetViewport %d: height (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3961 viewport.height, limits.maxViewportDimensions[1], validation_error_map[VALIDATION_ERROR_01449]);
3962 }
3963
3964 if (viewport.x < limits.viewportBoundsRange[0] || viewport.x > limits.viewportBoundsRange[1]) {
3965 skip |=
3966 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3967 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: x (%f) exceeds permitted bounds (%f,%f). %s",
3968 viewportIndex, viewport.x, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3969 validation_error_map[VALIDATION_ERROR_01450]);
3970 }
3971
3972 if (viewport.y < limits.viewportBoundsRange[0] || viewport.y > limits.viewportBoundsRange[1]) {
3973 skip |=
3974 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3975 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: y (%f) exceeds permitted bounds (%f,%f). %s",
3976 viewportIndex, viewport.y, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3977 validation_error_map[VALIDATION_ERROR_01450]);
3978 }
3979
3980 if (viewport.x + viewport.width > limits.viewportBoundsRange[1]) {
3981 skip |=
3982 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3983 VALIDATION_ERROR_01451, LayerName,
3984 "vkCmdSetViewport %d: x (%f) + width (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.x,
3985 viewport.width, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01451]);
3986 }
3987
3988 if (viewport.y + viewport.height > limits.viewportBoundsRange[1]) {
3989 skip |=
3990 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3991 VALIDATION_ERROR_01452, LayerName,
3992 "vkCmdSetViewport %d: y (%f) + height (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.y,
3993 viewport.height, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01452]);
3994 }
3995 }
3996 }
3997
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003998 return skip;
3999}
4000
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004001VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4002 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004003 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004004 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004005 assert(my_data != NULL);
4006
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004007 skip |= preCmdSetViewport(my_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004008
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004009 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004010 my_data->dispatch_table.CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004011 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004012}
4013
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004014VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
4015 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004016 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004017 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004018 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004019 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07004020
Chris Forbes04b61da2016-11-03 09:53:59 +13004021 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004022
Mike Weiblena4742dc2016-10-31 11:05:56 -06004023 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4024 const VkRect2D &pScissor = pScissors[scissorIndex];
4025
4026 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004027 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004028 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4029 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
4030 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004031 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004032 VALIDATION_ERROR_01490, LayerName,
4033 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4034 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
4035 }
4036
4037 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004038 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004039 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4040 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4041 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004042 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004043 VALIDATION_ERROR_01491, LayerName,
4044 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4045 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4046 }
4047 }
4048
Chris Forbes04b61da2016-11-03 09:53:59 +13004049 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004050 my_data->dispatch_table.CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004051 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004052}
4053
Chia-I Wu01ca2372016-05-13 14:37:49 +08004054VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004055 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4056 my_data->dispatch_table.CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004057}
4058
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004059VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4060 float depthBiasSlopeFactor) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004061 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4062 my_data->dispatch_table.CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004063}
4064
Chia-I Wu01ca2372016-05-13 14:37:49 +08004065VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004066 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004067 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004068 assert(my_data != NULL);
4069
Chris Forbes04b61da2016-11-03 09:53:59 +13004070 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004071
Chris Forbes04b61da2016-11-03 09:53:59 +13004072 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004073 my_data->dispatch_table.CmdSetBlendConstants(commandBuffer, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004074 }
Cody Northrop12365112015-08-17 11:10:49 -06004075}
4076
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004077VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004078 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4079 my_data->dispatch_table.CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004080}
4081
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004082VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4083 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004084 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004085 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4086 assert(my_data != NULL);
4087
Chris Forbes04b61da2016-11-03 09:53:59 +13004088 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004089
Chris Forbes04b61da2016-11-03 09:53:59 +13004090 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004091 my_data->dispatch_table.CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004092 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004093}
4094
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004095VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004096 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004097 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4098 assert(my_data != NULL);
4099
Chris Forbes04b61da2016-11-03 09:53:59 +13004100 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004101
Chris Forbes04b61da2016-11-03 09:53:59 +13004102 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004103 my_data->dispatch_table.CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004104 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004105}
4106
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004107VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004108 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004109 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4110 assert(my_data != NULL);
4111
Chris Forbes04b61da2016-11-03 09:53:59 +13004112 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004113
Chris Forbes04b61da2016-11-03 09:53:59 +13004114 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004115 my_data->dispatch_table.CmdSetStencilReference(commandBuffer, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004116 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004117}
4118
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004119VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4120 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4121 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4122 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004123 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004124 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004125 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004126
Chris Forbes04b61da2016-11-03 09:53:59 +13004127 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004128 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4129 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004130
Chris Forbes04b61da2016-11-03 09:53:59 +13004131 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004132 my_data->dispatch_table.CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004133 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004134 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004135}
4136
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004137VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4138 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004139 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004140 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4141 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004142
Chris Forbes04b61da2016-11-03 09:53:59 +13004143 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004144
Chris Forbes04b61da2016-11-03 09:53:59 +13004145 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004146 my_data->dispatch_table.CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004147 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004148}
4149
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004150VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4151 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004152 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004153 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004154 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004155
Chris Forbes04b61da2016-11-03 09:53:59 +13004156 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004157
Chris Forbes04b61da2016-11-03 09:53:59 +13004158 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004159 my_data->dispatch_table.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004160 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004161}
4162
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004163bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4164 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004165 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004166 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004167 // 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 -07004168 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004169 log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004170 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004171 return false;
4172 }
4173
4174 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004175 // 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 -07004176 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004177 log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004178 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004179 return false;
4180 }
4181
4182 return true;
4183}
4184
Chia-I Wu01ca2372016-05-13 14:37:49 +08004185VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4186 uint32_t firstVertex, uint32_t firstInstance) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004187 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004188 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004189
Chris Forbese58c9fe2016-11-24 14:44:17 +13004190 my_data->dispatch_table.CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004191}
4192
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004193VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4194 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004195 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4196 my_data->dispatch_table.CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004197}
4198
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004199VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4200 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004201 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004202 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4203 assert(my_data != NULL);
4204
Chris Forbes04b61da2016-11-03 09:53:59 +13004205 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004206
Chris Forbes04b61da2016-11-03 09:53:59 +13004207 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004208 my_data->dispatch_table.CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004209 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004210}
4211
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004212VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4213 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004214 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004215 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4216 assert(my_data != NULL);
4217
Chris Forbes04b61da2016-11-03 09:53:59 +13004218 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004219
Chris Forbes04b61da2016-11-03 09:53:59 +13004220 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004221 my_data->dispatch_table.CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004222 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004223}
4224
Chia-I Wu01ca2372016-05-13 14:37:49 +08004225VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004226 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4227 my_data->dispatch_table.CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004228}
4229
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004230VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004231 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004232 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4233 assert(my_data != NULL);
4234
Chris Forbes04b61da2016-11-03 09:53:59 +13004235 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004236
Chris Forbes04b61da2016-11-03 09:53:59 +13004237 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004238 my_data->dispatch_table.CmdDispatchIndirect(commandBuffer, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004239 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004240}
4241
Chia-I Wu01ca2372016-05-13 14:37:49 +08004242VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4243 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004244 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004245 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004246 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004247
Chris Forbes04b61da2016-11-03 09:53:59 +13004248 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004249
Chris Forbes04b61da2016-11-03 09:53:59 +13004250 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004251 my_data->dispatch_table.CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004252 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004253}
4254
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004255bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004256 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004257 if (pRegions != nullptr) {
4258 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4259 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004260 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004261 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004262 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4263 return false;
4264 }
4265 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4266 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004267 log_msg(my_data->report_data, 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 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4270 return false;
4271 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004272 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004273
4274 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004275}
4276
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004277VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4278 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4279 const VkImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004280 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004281 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004282 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004283
Chris Forbes04b61da2016-11-03 09:53:59 +13004284 skip |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004285 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004286
Chris Forbes04b61da2016-11-03 09:53:59 +13004287 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004288 PreCmdCopyImage(commandBuffer, pRegions);
4289
Chris Forbese58c9fe2016-11-24 14:44:17 +13004290 my_data->dispatch_table.CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004291 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004292}
4293
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004294bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004295 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004296 if (pRegions != nullptr) {
4297 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4298 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004299 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004300 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004301 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4302 return false;
4303 }
4304 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4305 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004306 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004307 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004308 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4309 return false;
4310 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004311 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004312
4313 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004314}
4315
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004316VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4317 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4318 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004319 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004320 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004321 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004322
Chris Forbes04b61da2016-11-03 09:53:59 +13004323 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004324 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004325
Chris Forbes04b61da2016-11-03 09:53:59 +13004326 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004327 PreCmdBlitImage(commandBuffer, pRegions);
4328
Chris Forbese58c9fe2016-11-24 14:44:17 +13004329 my_data->dispatch_table.CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004330 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004331}
4332
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004333bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004334 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004335 if (pRegions != nullptr) {
4336 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4337 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004338 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004339 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004340 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4341 "enumerator");
4342 return false;
4343 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004344 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004345
4346 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004347}
4348
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004349VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4350 VkImageLayout dstImageLayout, uint32_t regionCount,
4351 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004352 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004353 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004354 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004355
Chris Forbes04b61da2016-11-03 09:53:59 +13004356 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004357 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004358
Chris Forbes04b61da2016-11-03 09:53:59 +13004359 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004360 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4361
Chris Forbese58c9fe2016-11-24 14:44:17 +13004362 my_data->dispatch_table.CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004363 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004364}
4365
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004366bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004367 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004368 if (pRegions != nullptr) {
4369 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4370 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004371 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004372 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004373 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4374 "enumerator");
4375 return false;
4376 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004377 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004378
4379 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004380}
4381
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004382VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4383 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004384 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004385 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004386 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004387
Chris Forbes04b61da2016-11-03 09:53:59 +13004388 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004389 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004390
Chris Forbes04b61da2016-11-03 09:53:59 +13004391 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004392 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4393
Chris Forbese58c9fe2016-11-24 14:44:17 +13004394 my_data->dispatch_table.CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004395 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004396}
4397
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004398VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4399 VkDeviceSize dataSize, const uint32_t *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004400 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004401 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004402 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004403
Chris Forbes04b61da2016-11-03 09:53:59 +13004404 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004405
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004406 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004407 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004408 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4409 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004410 }
4411
4412 if ((dataSize <= 0) || (dataSize > 65536)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004413 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004414 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4415 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004416 dataSize);
4417 } else if (dataSize & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004418 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004419 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4420 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004421 }
4422
Chris Forbes04b61da2016-11-03 09:53:59 +13004423 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004424 my_data->dispatch_table.CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004425 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004426}
4427
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004428VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4429 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004430 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004431 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4432 assert(my_data != NULL);
4433
Chris Forbes04b61da2016-11-03 09:53:59 +13004434 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004435
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004436 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004437 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004438 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4439 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004440 }
4441
4442 if (size != VK_WHOLE_SIZE) {
4443 if (size <= 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004444 skip |= log_msg(
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004445 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004446 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004447 } else if (size & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004448 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004449 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004450 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4451 }
4452 }
4453
Chris Forbes04b61da2016-11-03 09:53:59 +13004454 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004455 my_data->dispatch_table.CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004456 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004457}
4458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004459VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4460 const VkClearColorValue *pColor, uint32_t rangeCount,
4461 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004462 bool skip = 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
Chris Forbes04b61da2016-11-03 09:53:59 +13004466 skip |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004467
Chris Forbes04b61da2016-11-03 09:53:59 +13004468 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004469 my_data->dispatch_table.CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004470 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004471}
4472
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004473VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4474 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4475 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004476 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004477 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004478 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004479
Chris Forbes04b61da2016-11-03 09:53:59 +13004480 skip |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004481 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004482
Chris Forbes04b61da2016-11-03 09:53:59 +13004483 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004484 my_data->dispatch_table.CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004485 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004486}
4487
Chia-I Wu01ca2372016-05-13 14:37:49 +08004488VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4489 const VkClearAttachment *pAttachments, uint32_t rectCount,
4490 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004491 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004492 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004493 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004494
Chris Forbes04b61da2016-11-03 09:53:59 +13004495 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004496
Chris Forbes04b61da2016-11-03 09:53:59 +13004497 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004498 my_data->dispatch_table.CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004499 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004500}
4501
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004502bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004503 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004504 if (pRegions != nullptr) {
4505 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4506 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4507 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004508 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004509 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004510 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4511 return false;
4512 }
4513 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4514 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4515 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004516 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004517 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004518 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4519 return false;
4520 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004521 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004522
4523 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004524}
4525
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004526VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4527 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4528 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004529 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004530 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004531 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004532
Chris Forbes04b61da2016-11-03 09:53:59 +13004533 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004534 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004535
Chris Forbes04b61da2016-11-03 09:53:59 +13004536 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004537 PreCmdResolveImage(commandBuffer, pRegions);
4538
Chris Forbese58c9fe2016-11-24 14:44:17 +13004539 my_data->dispatch_table.CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004540 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004541}
4542
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004543VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004544 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004545 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4546 assert(my_data != NULL);
4547
Chris Forbes04b61da2016-11-03 09:53:59 +13004548 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004549
Chris Forbes04b61da2016-11-03 09:53:59 +13004550 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004551 my_data->dispatch_table.CmdSetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004552 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004553}
4554
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004555VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004556 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004557 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4558 assert(my_data != NULL);
4559
Chris Forbes04b61da2016-11-03 09:53:59 +13004560 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004561
Chris Forbes04b61da2016-11-03 09:53:59 +13004562 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004563 my_data->dispatch_table.CmdResetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004564 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004565}
4566
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004567VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4568 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4569 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4570 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4571 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004572 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004573 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004574 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004575
Chris Forbes04b61da2016-11-03 09:53:59 +13004576 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004577 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4578 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004579
Chris Forbes04b61da2016-11-03 09:53:59 +13004580 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004581 my_data->dispatch_table.CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004582 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004583 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004584}
4585
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004586VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4587 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4588 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4589 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4590 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004591 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004592 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004593 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004594
Chris Forbes04b61da2016-11-03 09:53:59 +13004595 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004596 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4597 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004598
Chris Forbes04b61da2016-11-03 09:53:59 +13004599 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004600 my_data->dispatch_table.CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004601 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004602 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004603}
4604
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004605VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4606 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004607 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004608 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4609 assert(my_data != NULL);
4610
Chris Forbes04b61da2016-11-03 09:53:59 +13004611 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004612
Chris Forbes04b61da2016-11-03 09:53:59 +13004613 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004614 my_data->dispatch_table.CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004615 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004616}
4617
Chia-I Wu01ca2372016-05-13 14:37:49 +08004618VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004619 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004620 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4621 assert(my_data != NULL);
4622
Chris Forbes04b61da2016-11-03 09:53:59 +13004623 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004624
Chris Forbes04b61da2016-11-03 09:53:59 +13004625 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004626 my_data->dispatch_table.CmdEndQuery(commandBuffer, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004627 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004628}
4629
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004630VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4631 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004632 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004633 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4634 assert(my_data != NULL);
4635
Chris Forbes04b61da2016-11-03 09:53:59 +13004636 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004637
Chris Forbes04b61da2016-11-03 09:53:59 +13004638 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004639 my_data->dispatch_table.CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004640 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004641}
4642
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004643bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4644 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004645
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004646 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004647
4648 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004649}
4650
Chia-I Wu01ca2372016-05-13 14:37:49 +08004651VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4652 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004653 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004654 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4655 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004656
Chris Forbes04b61da2016-11-03 09:53:59 +13004657 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004658
Chris Forbes04b61da2016-11-03 09:53:59 +13004659 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004660 my_data->dispatch_table.CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004661
4662 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4663 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004664}
4665
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004666VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4667 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4668 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004669 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004670 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4671 assert(my_data != NULL);
4672
Chris Forbes04b61da2016-11-03 09:53:59 +13004673 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004674 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004675
Chris Forbes04b61da2016-11-03 09:53:59 +13004676 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004677 my_data->dispatch_table.CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004678 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004679}
4680
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004681VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4682 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004683 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004684 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004685 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004686
Chris Forbes04b61da2016-11-03 09:53:59 +13004687 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004688
Chris Forbes04b61da2016-11-03 09:53:59 +13004689 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004690 my_data->dispatch_table.CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004691 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004692}
4693
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004694VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4695 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004696 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004697 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004698 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004699
Chris Forbes04b61da2016-11-03 09:53:59 +13004700 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004701
Chris Forbes04b61da2016-11-03 09:53:59 +13004702 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004703 my_data->dispatch_table.CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004704 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004705}
4706
Chia-I Wu01ca2372016-05-13 14:37:49 +08004707VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004708 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004709 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4710 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004711
Chris Forbes04b61da2016-11-03 09:53:59 +13004712 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004713
Chris Forbes04b61da2016-11-03 09:53:59 +13004714 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004715 my_data->dispatch_table.CmdNextSubpass(commandBuffer, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004716 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004717}
4718
Chia-I Wu01ca2372016-05-13 14:37:49 +08004719VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004720 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4721 my_data->dispatch_table.CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004722}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004723
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004724VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4725 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004726 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004727 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004728 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004729
Chris Forbes04b61da2016-11-03 09:53:59 +13004730 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004731
Chris Forbes04b61da2016-11-03 09:53:59 +13004732 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004733 my_data->dispatch_table.CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004734 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004735}
4736
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004737VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004738 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4739}
4740
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004741VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4742 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004743 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4744}
4745
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004746VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4747 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004748 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4749 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4750
4751 return VK_ERROR_LAYER_NOT_PRESENT;
4752}
4753
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004754VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4755 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004756 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004757 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004758 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004759
4760 assert(physicalDevice);
4761
Chris Forbes6444bba2016-11-24 14:15:23 +13004762 return get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map)
4763 ->dispatch_table.EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004764}
4765
Chris Forbes448ebcb2016-11-03 09:29:52 +13004766bool require_device_extension(layer_data *my_data, bool layer_data::*flag, char const *function_name, char const *extension_name)
4767{
4768 if (!(my_data->*flag)) {
4769 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4770 __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4771 "%s() called even though the %s extension was not enabled for this VkDevice.",
4772 function_name, extension_name);
4773 }
4774
4775 return false;
4776}
4777
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004778// WSI Extension Functions
4779
4780VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004781 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004782 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004783 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004784 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4785 assert(my_data != NULL);
4786
Chris Forbes04b61da2016-11-03 09:53:59 +13004787 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkCreateSwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004788
Chris Forbes04b61da2016-11-03 09:53:59 +13004789 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004790
Chris Forbes04b61da2016-11-03 09:53:59 +13004791 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004792 result = my_data->dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004793
4794 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4795 }
4796
4797 return result;
4798}
4799
4800VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004801 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004802 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004803 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004804 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4805 assert(my_data != NULL);
4806
Chris Forbes04b61da2016-11-03 09:53:59 +13004807 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkGetSwapchainImagesKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004808
Chris Forbes04b61da2016-11-03 09:53:59 +13004809 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004810 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4811
Chris Forbes04b61da2016-11-03 09:53:59 +13004812 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004813 result = my_data->dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004814
4815 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4816 }
4817
4818 return result;
4819}
4820
4821VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004822 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004823 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004824 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004825 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4826 assert(my_data != NULL);
4827
Chris Forbes04b61da2016-11-03 09:53:59 +13004828 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkAcquireNextImageKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004829
Chris Forbes04b61da2016-11-03 09:53:59 +13004830 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004831 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4832
Chris Forbes04b61da2016-11-03 09:53:59 +13004833 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004834 result = my_data->dispatch_table.AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004835
4836 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4837 }
4838
4839 return result;
4840}
4841
4842VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4843 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004844 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004845 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4846 assert(my_data != NULL);
4847
Chris Forbes04b61da2016-11-03 09:53:59 +13004848 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkQueuePresentKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004849
Chris Forbes04b61da2016-11-03 09:53:59 +13004850 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004851
Chris Forbes04b61da2016-11-03 09:53:59 +13004852 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004853 result = my_data->dispatch_table.QueuePresentKHR(queue, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004854
4855 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4856 }
4857
4858 return result;
4859}
4860
Chris Forbesbe5f5202016-11-02 18:34:25 +13004861VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004862 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13004863 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4864 assert(my_data != NULL);
4865
Chris Forbes04b61da2016-11-03 09:53:59 +13004866 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkDestroySwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004867
4868 /* No generated validation function for this call */
4869
Chris Forbes04b61da2016-11-03 09:53:59 +13004870 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004871 my_data->dispatch_table.DestroySwapchainKHR(device, swapchain, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004872 }
4873}
4874
Chris Forbes115f98c2016-11-03 09:51:48 +13004875bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name, char const *extension_name)
4876{
Chris Forbes6be763e2016-11-24 12:42:33 +13004877 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
4878 if (!(my_data->extensions.*flag)) {
Chris Forbes115f98c2016-11-03 09:51:48 +13004879 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
4880 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4881 "%s() called even though the %s extension was not enabled for this VkInstance.",
4882 function_name, extension_name);
4883 }
4884
4885 return false;
4886}
4887
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004888VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4889 VkSurfaceKHR surface, VkBool32 *pSupported) {
4890 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004891 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004892 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004893 assert(my_data != NULL);
4894
Chris Forbes04b61da2016-11-03 09:53:59 +13004895 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004896 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004897
Chris Forbes04b61da2016-11-03 09:53:59 +13004898 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004899 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4900
Chris Forbes04b61da2016-11-03 09:53:59 +13004901 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004902 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004903
4904 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4905 }
4906
4907 return result;
4908}
4909
4910VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4911 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4912 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004913 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004914 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004915 assert(my_data != NULL);
4916
Chris Forbes04b61da2016-11-03 09:53:59 +13004917 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004918 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004919
Chris Forbes04b61da2016-11-03 09:53:59 +13004920 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004921 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004922
Chris Forbes04b61da2016-11-03 09:53:59 +13004923 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004924 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004925
4926 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4927 }
4928
4929 return result;
4930}
4931
4932VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4933 uint32_t *pSurfaceFormatCount,
4934 VkSurfaceFormatKHR *pSurfaceFormats) {
4935 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004936 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004937 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004938 assert(my_data != NULL);
4939
Chris Forbes04b61da2016-11-03 09:53:59 +13004940 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004941 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004942
Chris Forbes04b61da2016-11-03 09:53:59 +13004943 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004944 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004945
Chris Forbes04b61da2016-11-03 09:53:59 +13004946 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004947 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount,
4948 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004949
4950 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4951 }
4952
4953 return result;
4954}
4955
4956VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4957 uint32_t *pPresentModeCount,
4958 VkPresentModeKHR *pPresentModes) {
4959 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004960 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004961 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004962 assert(my_data != NULL);
4963
Chris Forbes04b61da2016-11-03 09:53:59 +13004964 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004965 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004966
Chris Forbes04b61da2016-11-03 09:53:59 +13004967 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004968 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004969
Chris Forbes04b61da2016-11-03 09:53:59 +13004970 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004971 result = my_data->dispatch_table.GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount,
4972 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004973
4974 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4975 }
4976
4977 return result;
4978}
4979
Chris Forbesbe5f5202016-11-02 18:34:25 +13004980VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004981 bool skip = false;
Chris Forbes6444bba2016-11-24 14:15:23 +13004982 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004983
Chris Forbes04b61da2016-11-03 09:53:59 +13004984 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004985 "vkDestroySurfaceKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004986
Chris Forbes04b61da2016-11-03 09:53:59 +13004987 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004988 my_data->dispatch_table.DestroySurfaceKHR(instance, surface, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004989 }
4990}
4991
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004992#ifdef VK_USE_PLATFORM_WIN32_KHR
4993VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4994 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4995 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4996
Chris Forbes7b58a712016-11-24 11:35:31 +13004997 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004998 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13004999 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005000
Chris Forbes04b61da2016-11-03 09:53:59 +13005001 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005002 "vkCreateWin32SurfaceKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005003
Chris Forbes04b61da2016-11-03 09:53:59 +13005004 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005005
Chris Forbes04b61da2016-11-03 09:53:59 +13005006 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005007 result = my_data->dispatch_table.CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005008 }
5009
5010 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5011
5012 return result;
5013}
Chris Forbes9a083b92016-11-02 16:58:15 +13005014
5015VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
5016 uint32_t queueFamilyIndex)
5017{
5018 VkBool32 result = false;
5019
Chris Forbes7b58a712016-11-24 11:35:31 +13005020 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes9a083b92016-11-02 16:58:15 +13005021 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005022 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005023
Chris Forbes04b61da2016-11-03 09:53:59 +13005024 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005025 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005026
Chris Forbes7281a502016-11-08 08:45:03 +13005027 // TODO: codegen doesn't produce this function?
5028 //skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005029
Chris Forbes04b61da2016-11-03 09:53:59 +13005030 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005031 result = my_data->dispatch_table.GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005032 }
5033
5034 return result;
5035}
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005036#endif // VK_USE_PLATFORM_WIN32_KHR
5037
5038#ifdef VK_USE_PLATFORM_XCB_KHR
5039VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5040 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5041 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5042
Chris Forbes7b58a712016-11-24 11:35:31 +13005043 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005044 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005045 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005046
Chris Forbes04b61da2016-11-03 09:53:59 +13005047 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005048 "vkCreateXcbSurfaceKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005049
Chris Forbes04b61da2016-11-03 09:53:59 +13005050 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005051
Chris Forbes04b61da2016-11-03 09:53:59 +13005052 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005053 result = my_data->dispatch_table.CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005054 }
5055
5056 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5057
5058 return result;
5059}
5060
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005061VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5062 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5063 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005064 VkBool32 result = false;
5065
Chris Forbes7b58a712016-11-24 11:35:31 +13005066 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005067 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005068 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005069
Chris Forbes04b61da2016-11-03 09:53:59 +13005070 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005071 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005072
Chris Forbes04b61da2016-11-03 09:53:59 +13005073 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005074 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005075
Chris Forbes04b61da2016-11-03 09:53:59 +13005076 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005077 result = my_data->dispatch_table.GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection,
5078 visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005079 }
5080
5081 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005082}
5083#endif // VK_USE_PLATFORM_XCB_KHR
5084
5085#ifdef VK_USE_PLATFORM_XLIB_KHR
5086VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005087 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005088 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5089
Chris Forbes7b58a712016-11-24 11:35:31 +13005090 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005091 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005092 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005093
Chris Forbes04b61da2016-11-03 09:53:59 +13005094 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005095 "vkCreateXlibSurfaceKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005096
Chris Forbes04b61da2016-11-03 09:53:59 +13005097 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005098
Chris Forbes04b61da2016-11-03 09:53:59 +13005099 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005100 result = my_data->dispatch_table.CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005101 }
5102
5103 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5104
5105 return result;
5106}
5107
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005108VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5109 uint32_t queueFamilyIndex, Display *dpy,
5110 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005111 VkBool32 result = false;
5112
Chris Forbes7b58a712016-11-24 11:35:31 +13005113 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005114 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005115 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005116
Chris Forbes04b61da2016-11-03 09:53:59 +13005117 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005118 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005119
Chris Forbes04b61da2016-11-03 09:53:59 +13005120 skip |= parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005121
Chris Forbes04b61da2016-11-03 09:53:59 +13005122 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005123 result =
5124 my_data->dispatch_table.GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005125 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005126 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005127}
5128#endif // VK_USE_PLATFORM_XLIB_KHR
5129
5130#ifdef VK_USE_PLATFORM_MIR_KHR
5131VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005132 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005133 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5134
Chris Forbes7b58a712016-11-24 11:35:31 +13005135 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005136 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005137 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005138
Chris Forbes04b61da2016-11-03 09:53:59 +13005139 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005140 "vkCreateMirSurfaceKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005141
Chris Forbes04b61da2016-11-03 09:53:59 +13005142 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005143
Chris Forbes04b61da2016-11-03 09:53:59 +13005144 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005145 result = my_data->dispatch_table.CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005146 }
5147
5148 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5149
5150 return result;
5151}
5152
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005153VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5154 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005155 VkBool32 result = false;
5156
Chris Forbes7b58a712016-11-24 11:35:31 +13005157 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005158 assert(my_data != NULL);
5159
Chris Forbes04b61da2016-11-03 09:53:59 +13005160 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005161
Chris Forbes04b61da2016-11-03 09:53:59 +13005162 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005163 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5164
Chris Forbes04b61da2016-11-03 09:53:59 +13005165 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005166
Chris Forbes04b61da2016-11-03 09:53:59 +13005167 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005168 result = my_data->dispatch_table.GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005169 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005170 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005171}
5172#endif // VK_USE_PLATFORM_MIR_KHR
5173
5174#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5175VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005176 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005177 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5178
Chris Forbes7b58a712016-11-24 11:35:31 +13005179 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005180 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005181 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005182
Chris Forbes04b61da2016-11-03 09:53:59 +13005183 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005184 "vkCreateWaylandSurfaceKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5185
Chris Forbes04b61da2016-11-03 09:53:59 +13005186 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005187
Chris Forbes04b61da2016-11-03 09:53:59 +13005188 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005189 result = my_data->dispatch_table.CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005190 }
5191
5192 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5193
5194 return result;
5195}
5196
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005197VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5198 uint32_t queueFamilyIndex,
5199 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005200 VkBool32 result = false;
5201
Chris Forbes7b58a712016-11-24 11:35:31 +13005202 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005203 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005204 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005205
Chris Forbes04b61da2016-11-03 09:53:59 +13005206 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005207 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5208
Chris Forbes04b61da2016-11-03 09:53:59 +13005209 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005210 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005211
Chris Forbes04b61da2016-11-03 09:53:59 +13005212 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005213 result = my_data->dispatch_table.GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005214 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005215
5216 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005217}
5218#endif // VK_USE_PLATFORM_WAYLAND_KHR
5219
5220#ifdef VK_USE_PLATFORM_ANDROID_KHR
5221VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005222 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005223 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5224
Chris Forbes7b58a712016-11-24 11:35:31 +13005225 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005226 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005227 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005228
Chris Forbes04b61da2016-11-03 09:53:59 +13005229 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005230 "vkCreateAndroidSurfaceKHR", VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005231
Chris Forbes04b61da2016-11-03 09:53:59 +13005232 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005233
Chris Forbes04b61da2016-11-03 09:53:59 +13005234 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005235 result = my_data->dispatch_table.CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005236 }
5237
5238 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5239
5240 return result;
5241}
5242#endif // VK_USE_PLATFORM_ANDROID_KHR
5243
Mark Youngead9b932016-09-08 12:28:38 -06005244VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5245 const VkSwapchainCreateInfoKHR *pCreateInfos,
5246 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5247 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005248 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005249 auto my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06005250 assert(my_data != NULL);
5251
Chris Forbes04b61da2016-11-03 09:53:59 +13005252 skip |= require_device_extension(my_data, &layer_data::display_swapchain_enabled, "vkCreateSharedSwapchainsKHR", VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005253
Chris Forbes04b61da2016-11-03 09:53:59 +13005254 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Youngead9b932016-09-08 12:28:38 -06005255 pSwapchains);
5256
Chris Forbes04b61da2016-11-03 09:53:59 +13005257 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005258 result = my_data->dispatch_table.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Youngead9b932016-09-08 12:28:38 -06005259
5260 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5261 }
5262
5263 return result;
5264}
5265
Chris Forbes667a5212016-11-03 10:18:35 +13005266VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5267 VkDisplayPropertiesKHR *pProperties) {
5268 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5269 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005270 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005271 assert(my_data != NULL);
5272
5273 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5274 "vkGetPhysicalDeviceDisplayPropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5275
5276 // No parameter validation function for this call?
5277
5278 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005279 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005280
5281 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPropertiesKHR", result);
5282 }
5283
5284 return result;
5285}
5286
5287VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5288 VkDisplayPlanePropertiesKHR *pProperties) {
5289 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5290 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005291 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005292 assert(my_data != NULL);
5293
5294 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5295 "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5296
5297 // No parameter validation function for this call?
5298
5299 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005300 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005301
5302 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", result);
5303 }
5304
5305 return result;
5306}
5307
5308VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
5309 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
5310 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5311 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005312 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005313 assert(my_data != NULL);
5314
5315 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5316 "vkGetDisplayPlaneSupportedDisplaysKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5317
5318 // No parameter validation function for this call?
5319
5320 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005321 result = my_data->dispatch_table.GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
Chris Forbes667a5212016-11-03 10:18:35 +13005322
5323 validate_result(my_data->report_data, "vkGetDisplayPlaneSupportedDisplaysKHR", result);
5324 }
5325
5326 return result;
5327}
5328
5329VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5330 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
5331 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5332 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005333 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005334 assert(my_data != NULL);
5335
5336 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5337 "vkGetDisplayModePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5338
5339 // No parameter validation function for this call?
5340
5341 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005342 result = my_data->dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005343
5344 validate_result(my_data->report_data, "vkGetDisplayModePropertiesKHR", result);
5345 }
5346
5347 return result;
5348}
5349
5350VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5351 const VkDisplayModeCreateInfoKHR *pCreateInfo,
5352 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
5353 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5354 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005355 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005356 assert(my_data != NULL);
5357
5358 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5359 "vkCreateDisplayModeKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5360
5361 // No parameter validation function for this call?
5362
5363 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005364 result = my_data->dispatch_table.CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
Chris Forbes667a5212016-11-03 10:18:35 +13005365
5366 validate_result(my_data->report_data, "vkCreateDisplayModeKHR", result);
5367 }
5368
5369 return result;
5370}
5371
5372VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
5373 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
5374 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5375 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005376 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005377 assert(my_data != NULL);
5378
5379 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5380 "vkGetDisplayPlaneCapabilitiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5381
5382 // No parameter validation function for this call?
5383
5384 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005385 result = my_data->dispatch_table.GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
Chris Forbes667a5212016-11-03 10:18:35 +13005386
5387 validate_result(my_data->report_data, "vkGetDisplayPlaneCapabilitiesKHR", result);
5388 }
5389
5390 return result;
5391}
5392
5393VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
5394 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5395 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5396 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005397 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005398 assert(my_data != NULL);
5399
5400 skip |= require_instance_extension(instance, &instance_extension_enables::display_enabled,
5401 "vkCreateDisplayPlaneSurfaceKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5402
5403 // No parameter validation function for this call?
5404
5405 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005406 result = my_data->dispatch_table.CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Chris Forbes667a5212016-11-03 10:18:35 +13005407
5408 validate_result(my_data->report_data, "vkCreateDisplayPlaneSurfaceKHR", result);
5409 }
5410
5411 return result;
5412}
5413
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005414// VK_EXT_debug_marker Extension
5415VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5416 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005417 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005418 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5419 assert(my_data != NULL);
5420
Chris Forbes04b61da2016-11-03 09:53:59 +13005421 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005422
Chris Forbes04b61da2016-11-03 09:53:59 +13005423 if (!skip) {
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005424 if (my_data->dispatch_table.DebugMarkerSetObjectTagEXT) {
5425 result = my_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
5426 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5427 } else {
5428 result = VK_SUCCESS;
5429 }
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005430 }
5431
5432 return result;
5433}
5434
5435VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5436 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005437 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005438 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5439 assert(my_data != NULL);
5440
Chris Forbes04b61da2016-11-03 09:53:59 +13005441 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005442
Chris Forbes04b61da2016-11-03 09:53:59 +13005443 if (!skip) {
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005444 if (my_data->dispatch_table.DebugMarkerSetObjectNameEXT) {
5445 result = my_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
5446 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5447 } else {
5448 result = VK_SUCCESS;
5449 }
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005450 }
5451
5452 return result;
5453}
5454
5455VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005456 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005457 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5458 assert(my_data != NULL);
5459
Chris Forbes04b61da2016-11-03 09:53:59 +13005460 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005461
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005462 if (!skip && my_data->dispatch_table.CmdDebugMarkerBeginEXT) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005463 my_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005464 }
5465}
5466
5467VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005468 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005469 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5470 assert(my_data != NULL);
5471
Chris Forbes04b61da2016-11-03 09:53:59 +13005472 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005473
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005474 if (!skip && my_data->dispatch_table.CmdDebugMarkerInsertEXT) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005475 my_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005476 }
5477}
5478
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005479// VK_NV_external_memory_capabilities Extension
5480VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5481 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5482 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5483 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5484
5485 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005486 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005487 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005488 assert(my_data != NULL);
5489
Chris Forbes04b61da2016-11-03 09:53:59 +13005490 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005491 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5492
Chris Forbes04b61da2016-11-03 09:53:59 +13005493 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005494 result = my_data->dispatch_table.GetPhysicalDeviceExternalImageFormatPropertiesNV(
5495 physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005496
5497 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5498 }
5499
5500 return result;
5501}
5502
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005503#ifdef VK_USE_PLATFORM_WIN32_KHR
5504// VK_NV_external_memory_win32 Extension
5505VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5506 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5507
5508 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005509 bool skip = false;
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005510 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5511 assert(my_data != NULL);
5512
Chris Forbes04b61da2016-11-03 09:53:59 +13005513 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005514
Chris Forbes04b61da2016-11-03 09:53:59 +13005515 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005516 result = my_data->dispatch_table.GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005517 }
5518
5519 return result;
5520}
5521#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005522
5523
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005524
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005525static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005526
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005527static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005528
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005529static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005530
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005531static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005532
Chia-I Wu01ca2372016-05-13 14:37:49 +08005533VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005534 assert(device);
5535
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005536 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5537
Dustin Graves080069b2016-04-05 13:48:15 -06005538 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005539 return NULL;
5540 }
5541
Chia-I Wuf9b01382016-05-16 07:37:41 +08005542 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5543 if (proc)
5544 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005545
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005546 proc = InterceptWsiEnabledCommand(funcName, device);
5547 if (proc)
5548 return proc;
5549
Chris Forbese58c9fe2016-11-24 14:44:17 +13005550 if (!data->dispatch_table.GetDeviceProcAddr)
5551 return nullptr;
5552 return data->dispatch_table.GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005553}
5554
Chia-I Wu01ca2372016-05-13 14:37:49 +08005555VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005556 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005557 if (!proc)
5558 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005559
5560 if (!proc)
5561 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005562
Chia-I Wu617f2a42016-05-16 07:41:17 +08005563 if (proc)
5564 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005565
Chia-I Wu617f2a42016-05-16 07:41:17 +08005566 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005567
Chris Forbes7b58a712016-11-24 11:35:31 +13005568 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005569
Chia-I Wu617f2a42016-05-16 07:41:17 +08005570 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005571 if (!proc)
5572 proc = InterceptWsiEnabledCommand(funcName, instance);
5573
Chia-I Wu617f2a42016-05-16 07:41:17 +08005574 if (proc)
5575 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005576
Chris Forbes6444bba2016-11-24 14:15:23 +13005577 if (!data->dispatch_table.GetInstanceProcAddr)
5578 return nullptr;
5579 return data->dispatch_table.GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005580}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005581
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005582static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005583 static const struct {
5584 const char *name;
5585 PFN_vkVoidFunction proc;
5586 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005587 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5588 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5589 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5590 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5591 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5592 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5593 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5594 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5595 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5596 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5597 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5598 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5599 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5600 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5601 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5602 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5603 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005604 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005605 };
5606
5607 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5608 if (!strcmp(core_instance_commands[i].name, name))
5609 return core_instance_commands[i].proc;
5610 }
5611
5612 return nullptr;
5613}
5614
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005615static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005616 static const struct {
5617 const char *name;
5618 PFN_vkVoidFunction proc;
5619 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005620 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5621 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5622 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5623 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5624 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5625 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5626 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5627 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5628 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5629 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5630 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5631 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5632 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5633 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5634 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5635 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5636 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5637 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5638 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5639 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5640 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5641 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5642 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5643 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5644 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5645 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5646 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5647 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5648 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5649 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5650 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5651 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5652 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5653 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5654 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5655 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5656 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5657 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5658 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5659 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5660 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5661 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5662 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5663 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5664 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5665 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5666 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5667 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5668 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5669 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5670 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5671 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5672 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5673 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5674 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5675 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5676 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5677 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5678 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5679 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5680 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5681 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5682 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5683 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5684 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5685 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5686 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5687 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5688 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5689 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5690 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5691 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5692 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5693 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5694 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5695 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5696 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5697 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5698 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5699 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5700 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5701 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5702 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5703 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5704 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5705 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5706 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5707 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5708 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5709 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5710 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5711 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5712 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5713 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5714 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5715 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5716 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5717 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5718 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5719 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5720 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5721 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5722 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5723 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5724 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5725 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5726 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5727 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5728 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5729 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5730 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5731 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5732 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5733 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5734 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5735 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5736 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005737 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5738 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5739 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5740 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005741#ifdef VK_USE_PLATFORM_WIN32_KHR
5742 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5743#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005744};
5745
Chia-I Wuf9b01382016-05-16 07:37:41 +08005746
5747 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5748 if (!strcmp(core_device_commands[i].name, name))
5749 return core_device_commands[i].proc;
5750 }
5751
5752 return nullptr;
5753}
5754
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005755static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005756 static const struct {
5757 const char *name;
5758 PFN_vkVoidFunction proc;
5759 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005760 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5761 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5762 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5763 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005764 {"vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR)},
Chris Forbes64c3c652016-11-03 10:15:31 +13005765 {"vkCreateSharedSwapchainsKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005766 };
5767
5768 if (device) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005769 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5770 if (!strcmp(wsi_device_commands[i].name, name))
5771 return wsi_device_commands[i].proc;
Mark Youngead9b932016-09-08 12:28:38 -06005772 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005773 }
5774
5775 return nullptr;
5776}
5777
5778static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5779 static const struct {
5780 const char *name;
5781 PFN_vkVoidFunction proc;
5782 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005783 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5784 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5785 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5786 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5787 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5788 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005789 {"vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR)},
Chris Forbes667a5212016-11-03 10:18:35 +13005790 {"vkGetPhysicalDeviceDisplayPropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR)},
5791 {"vkGetPhysicalDeviceDisplayPlanePropertiesKHR",
5792 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR)},
5793 {"vkGetDisplayPlaneSupportedDisplaysKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR)},
5794 {"vkGetDisplayModePropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR)},
5795 {"vkCreateDisplayModeKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR)},
5796 {"vkGetDisplayPlaneCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR)},
5797 {"vkCreateDisplayPlaneSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR)},
Chris Forbesb858dc82016-11-03 11:28:19 +13005798#ifdef VK_USE_PLATFORM_WIN32_KHR
5799 {"vkCreateWin32SurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR)},
5800 {"vkGetPhysicalDeviceWin32PresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR)},
5801#endif
5802#ifdef VK_USE_PLATFORM_XCB_KHR
5803 {"vkCreateXcbSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR)},
5804 {"vkGetPhysicalDeviceXcbPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR)},
5805#endif
5806#ifdef VK_USE_PLATFORM_XLIB_KHR
5807 {"vkCreateXlibSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR)},
5808 {"vkGetPhysicalDeviceXlibPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR)},
5809#endif
5810#ifdef VK_USE_PLATFORM_MIR_KHR
5811 {"vkCreateMirSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR)},
5812 {"vkGetPhysicalDeviceMirPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR)},
5813#endif
5814#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5815 {"vkCreateWaylandSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR)},
5816 {"vkGetPhysicalDeviceWaylandPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR)},
5817#endif
5818#ifdef VK_USE_PLATFORM_ANDROID_KHR
5819 {"vkCreateAndroidSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR)},
5820#endif
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005821 };
5822
Chris Forbes8a13e272016-11-02 17:43:34 +13005823 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5824 if (!strcmp(wsi_instance_commands[i].name, name))
5825 return wsi_instance_commands[i].proc;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005826 }
5827
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005828 return nullptr;
5829}
5830
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005831} // namespace parameter_validation
5832
5833// vk_layer_logging.h expects these to be defined
5834
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005835VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5836 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5837 const VkAllocationCallbacks *pAllocator,
5838 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005839 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005840}
5841
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005842VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5843 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005844 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005845}
5846
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005847VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5848 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5849 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005850 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005851}
5852
5853// loader-layer interface v0
5854
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005855VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5856 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005857 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005858}
5859
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005860VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5861 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005862 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005863}
5864
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005865VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5866 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005867 // the layer command handles VK_NULL_HANDLE just fine internally
5868 assert(physicalDevice == VK_NULL_HANDLE);
5869 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005870}
5871
5872VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5873 const char *pLayerName, uint32_t *pCount,
5874 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005875 // the layer command handles VK_NULL_HANDLE just fine internally
5876 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005877 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005878}
5879
5880VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005881 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005882}
5883
5884VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005885 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005886}