blob: 2c8874630248ffa0539749c807b6c6edc9005585 [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"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060044
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060045#include "vk_layer_table.h"
46#include "vk_layer_data.h"
47#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060048#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070049#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060050
Dustin Graves8ffbbf62016-07-22 13:19:46 -060051#include "parameter_name.h"
Mark Lobodzinski739391a2016-03-17 15:08:18 -060052#include "parameter_validation.h"
Dustin Graves1e92cd72016-02-09 14:00:18 -070053
Chia-I Wu1a6b1932016-05-13 14:07:36 +080054namespace parameter_validation {
Dustin Gravesb83fc2d2016-05-04 12:56:08 -060055
Chris Forbes7b58a712016-11-24 11:35:31 +130056struct instance_layer_data {
Chris Forbes7b57a392016-11-02 17:56:50 +130057 VkInstance instance = VK_NULL_HANDLE;
Chia-I Wua570b7c2016-05-16 07:48:14 +080058
Chris Forbes7b57a392016-11-02 17:56:50 +130059 debug_report_data *report_data = nullptr;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070060 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060061
Ian Elliotted6b5ac2016-04-28 09:08:13 -060062 // The following are for keeping track of the temporary callbacks that can
63 // be used in vkCreateInstance and vkDestroyInstance:
Chris Forbes7b57a392016-11-02 17:56:50 +130064 uint32_t num_tmp_callbacks = 0;
65 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos = nullptr;
66 VkDebugReportCallbackEXT *tmp_callbacks = nullptr;
Chris Forbes6be763e2016-11-24 12:42:33 +130067 instance_extension_enables extensions = {};
Chris Forbes6444bba2016-11-24 14:15:23 +130068
69 VkLayerInstanceDispatchTable dispatch_table = {};
Chris Forbes7b58a712016-11-24 11:35:31 +130070};
Ian Elliotted6b5ac2016-04-28 09:08:13 -060071
Mark Lobodzinski02007fb2017-04-12 13:57:42 -060072struct device_extension_enables {
73 bool khr_swapchain_enabled;
74 bool khr_display_swapchain_enabled;
75 bool khr_maintenance1;
76 bool khr_push_descriptor;
77 bool khr_descriptor_update_template;
78 bool khx_device_group;
79 bool khx_external_memory_fd;
80 bool khx_external_memory_win32;
81 bool khx_external_semaphore_fd;
82 bool khx_external_semaphore_win32;
83 bool ext_debug_marker;
84 bool ext_discard_rectangles;
85 bool ext_display_control;
86 bool amd_draw_indirect_count;
87 bool amd_negative_viewport_height;
88 bool nv_clip_space_w_scaling;
89 bool nv_external_memory;
90 bool nv_external_memory_win32;
91 bool nvx_device_generated_commands;
92 bool incremental_present;
93};
94
Chris Forbes7b58a712016-11-24 11:35:31 +130095struct layer_data {
Chris Forbes7b58a712016-11-24 11:35:31 +130096 debug_report_data *report_data = nullptr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070097 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060098 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Chris Forbes7b57a392016-11-02 17:56:50 +130099 VkPhysicalDeviceLimits device_limits = {};
100 VkPhysicalDeviceFeatures physical_device_features = {};
101 VkPhysicalDevice physical_device = VK_NULL_HANDLE;
Mark Lobodzinski02007fb2017-04-12 13:57:42 -0600102 device_extension_enables enables;
Michael Lentinebdf744f2016-01-27 15:43:43 -0600103
Mark Lobodzinski02007fb2017-04-12 13:57:42 -0600104 layer_data() { memset(&enables, 0, sizeof(device_extension_enables)); }
Chris Forbese58c9fe2016-11-24 14:44:17 +1300105
106 VkLayerDispatchTable dispatch_table = {};
Cody Northrop55443ef2015-09-28 15:09:32 -0600107};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500108
Mark Young39389872017-01-19 21:10:49 -0700109static uint32_t loader_layer_if_version = CURRENT_LOADER_LAYER_INTERFACE_VERSION;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700110static std::unordered_map<void *, layer_data *> layer_data_map;
Chris Forbes7b58a712016-11-24 11:35:31 +1300111static std::unordered_map<void *, instance_layer_data *> instance_layer_data_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600112
Chris Forbes7b58a712016-11-24 11:35:31 +1300113static void init_parameter_validation(instance_layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski739391a2016-03-17 15:08:18 -0600114 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600115}
116
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600117VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
118 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
119 const VkAllocationCallbacks *pAllocator,
120 VkDebugReportCallbackEXT *pMsgCallback) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700121 auto data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6444bba2016-11-24 14:15:23 +1300122 VkResult result = data->dispatch_table.CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600123
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700124 if (result == VK_SUCCESS) {
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600125 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600126 }
127
128 return result;
129}
130
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600131VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800132 const VkAllocationCallbacks *pAllocator) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700133 auto data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6444bba2016-11-24 14:15:23 +1300134 data->dispatch_table.DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
135
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700136 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600137}
138
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600139VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
140 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
141 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700142 auto data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6444bba2016-11-24 14:15:23 +1300143 data->dispatch_table.DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700144}
145
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700146static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600147
Chia-I Wu3384db82016-05-16 07:30:58 +0800148static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600149 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800150};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700151
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700152static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600153 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700154 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
155 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
156 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
157 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
158 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 -0700159 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700160 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600161 return false;
162 }
163
164 return true;
165}
166
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
168 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600169 return "unrecognized enumerator";
170 }
171
172 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700173 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600174 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
175 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700176 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600177 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
178 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700179 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600180 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
181 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700182 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600183 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
184 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700185 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600186 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
187 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700188 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600189 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
190 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700191 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600192 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
193 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700194 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600195 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
196 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700197 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600198 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
199 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700200 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600201 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
202 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700203 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800204 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600205 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700206 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800207 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600208 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700209 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700210 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
211 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600212
213 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700214 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600215 enumeratorString += string;
216
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700217 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600218 enumeratorString += '|';
219 }
220 }
221
222 return enumeratorString;
223}
224
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700225static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
226 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
227 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
228 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
229 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
230 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600231 return false;
232 }
233
234 return true;
235}
236
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
238 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600239 return "unrecognized enumerator";
240 }
241
242 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700243 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600244 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
245 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700246 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600247 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600248 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700249 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600250 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
251 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700252 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600253 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
254 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700255 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600256 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
257 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700258 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800259 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600260 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700261 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600262 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
263 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700264 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800265 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600266 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600267
268 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700269 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600270 enumeratorString += string;
271
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700272 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600273 enumeratorString += '|';
274 }
275 }
276
277 return enumeratorString;
278}
279
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700280static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
281 VkQueueFlagBits allFlags =
282 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
283 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600284 return false;
285 }
286
287 return true;
288}
289
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700290static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
291 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600292 return "unrecognized enumerator";
293 }
294
295 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700296 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800297 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600298 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700299 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600300 strings.push_back("VK_QUEUE_COMPUTE_BIT");
301 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700302 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800303 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600304 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700305 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600306 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
307 }
308
309 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700310 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600311 enumeratorString += string;
312
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700313 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600314 enumeratorString += '|';
315 }
316 }
317
318 return enumeratorString;
319}
320
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700321static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
322 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
323 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
324 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
325 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600326 return false;
327 }
328
329 return true;
330}
331
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700332static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
333 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600334 return "unrecognized enumerator";
335 }
336
337 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700338 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600339 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
340 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700341 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800342 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600343 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700344 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600345 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
346 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700347 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800348 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600349 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700350 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800351 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600352 }
353
354 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700355 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600356 enumeratorString += string;
357
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700358 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600359 enumeratorString += '|';
360 }
361 }
362
363 return enumeratorString;
364}
365
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700366static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700367 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700368 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600369 return false;
370 }
371
372 return true;
373}
374
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700375static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
376 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600377 return "unrecognized enumerator";
378 }
379
380 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700381 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800382 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600383 }
384
385 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700386 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600387 enumeratorString += string;
388
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700389 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600390 enumeratorString += '|';
391 }
392 }
393
394 return enumeratorString;
395}
396
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700397static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
398 VkSparseImageFormatFlagBits allFlags =
399 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
400 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
401 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600402 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600403 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600404
405 return true;
406}
407
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700408static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
409 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600410 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600411 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600412
413 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700414 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800415 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600416 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700417 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800418 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600419 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700420 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800421 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600422 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600423
424 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700425 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600426 enumeratorString += string;
427
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700428 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600429 enumeratorString += '|';
430 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600431 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600432
433 return enumeratorString;
434}
435
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700436static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700437 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700438 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600439 return false;
440 }
441
442 return true;
443}
444
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700445static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
446 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600447 return "unrecognized enumerator";
448 }
449
450 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700451 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600452 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
453 }
454
455 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700456 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600457 enumeratorString += string;
458
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700459 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600460 enumeratorString += '|';
461 }
462 }
463
464 return enumeratorString;
465}
466
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700467static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
468 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
469 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
470 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
471 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
472 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600473 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
474 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
475 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700476 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600477 return false;
478 }
479
480 return true;
481}
482
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700483static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
484 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600485 return "unrecognized enumerator";
486 }
487
488 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700489 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700490 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600491 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700492 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700493 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600494 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700495 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700496 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600497 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700498 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700499 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600500 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700501 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700502 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600503 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700504 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700505 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600506 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700507 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700508 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600509 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700510 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700511 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600512 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700513 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700514 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600515 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700516 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700517 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600518 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700519 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700520 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600521 }
522
523 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700524 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600525 enumeratorString += string;
526
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700527 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600528 enumeratorString += '|';
529 }
530 }
531
532 return enumeratorString;
533}
534
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700535static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
536 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
537 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
538 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600539 return false;
540 }
541
542 return true;
543}
544
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700545static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
546 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600547 return "unrecognized enumerator";
548 }
549
550 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700551 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600552 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
553 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700554 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600555 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
556 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700557 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600558 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
559 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700560 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600561 strings.push_back("VK_QUERY_RESULT_64_BIT");
562 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600563
564 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700565 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600566 enumeratorString += string;
567
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700568 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600569 enumeratorString += '|';
570 }
571 }
572
573 return enumeratorString;
574}
575
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700576static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
577 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
578 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
579 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
580 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
581 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600582 return false;
583 }
584
585 return true;
586}
587
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700588static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
589 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600590 return "unrecognized enumerator";
591 }
592
593 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700594 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600595 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
596 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700597 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600598 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
599 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700600 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600601 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
602 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700603 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600604 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
605 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700606 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600607 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
608 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700609 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800610 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600611 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700612 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600613 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
614 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700615 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800616 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600617 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700618 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600619 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
620 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600621
622 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700623 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600624 enumeratorString += string;
625
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700626 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600627 enumeratorString += '|';
628 }
629 }
630
631 return enumeratorString;
632}
633
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700634static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
635 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
636 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
637 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600638 return false;
639 }
640
641 return true;
642}
643
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700644static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
645 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600646 return "unrecognized enumerator";
647 }
648
649 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700650 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600651 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
652 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700653 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600654 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
655 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700656 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600657 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600658 }
659
660 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700661 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600662 enumeratorString += string;
663
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700664 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600665 enumeratorString += '|';
666 }
667 }
668
669 return enumeratorString;
670}
671
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700672static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
673 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
674 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
675 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
676 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600677 return false;
678 }
679
680 return true;
681}
682
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700683static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
684 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600685 return "unrecognized enumerator";
686 }
687
688 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700689 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600690 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
691 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700692 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600693 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
694 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700695 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600696 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
697 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700698 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600699 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
700 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700701 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600702 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600703 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600704
705 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700706 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600707 enumeratorString += string;
708
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700709 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600710 enumeratorString += '|';
711 }
712 }
713
714 return enumeratorString;
715}
716
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700717static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
718 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
719 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
720 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600721 return false;
722 }
723
724 return true;
725}
726
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700727static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
728 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600729 return "unrecognized enumerator";
730 }
731
732 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700733 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800734 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600735 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700736 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800737 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600738 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700739 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800740 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600741 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700742 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800743 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600744 }
745
746 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700747 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600748 enumeratorString += string;
749
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700750 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600751 enumeratorString += '|';
752 }
753 }
754
755 return enumeratorString;
756}
757
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700758static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
759 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
760 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
761 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600762 return false;
763 }
764
765 return true;
766}
767
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700768static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
769 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600770 return "unrecognized enumerator";
771 }
772
773 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700774 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600775 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
776 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700777 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600778 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
779 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700780 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600781 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600782 }
783
784 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700785 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600786 enumeratorString += string;
787
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700788 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600789 enumeratorString += '|';
790 }
791 }
792
793 return enumeratorString;
794}
795
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700796static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
797 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
798 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
799 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
800 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600801 return false;
802 }
803
804 return true;
805}
806
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700807static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
808 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600809 return "unrecognized enumerator";
810 }
811
812 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700813 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600814 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600815 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700816 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600817 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600818 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700819 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600820 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
821 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700822 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600823 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
824 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700825 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600826 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600827 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700828 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600829 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600830 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700831 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600832 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600833 }
834
835 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700836 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600837 enumeratorString += string;
838
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700839 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600840 enumeratorString += '|';
841 }
842 }
843
844 return enumeratorString;
845}
846
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700847static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800848 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700849 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
850 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
851 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
852 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
853 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
854 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 -0700855 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700856 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600857 return false;
858 }
859
860 return true;
861}
862
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700863static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
864 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600865 return "unrecognized enumerator";
866 }
867
868 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700869 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800870 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
871 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700872 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800873 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600874 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700875 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600876 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600877 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700878 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600879 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600880 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700881 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600882 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600883 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700884 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700885 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600886 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700887 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600888 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600889 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700890 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600891 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600892 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700893 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600894 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600895 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700896 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600897 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600898 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700899 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600900 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
901 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700902 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600903 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
904 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700905 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700906 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600907 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700908 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600909 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
910 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700911 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600912 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
913 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700914 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600915 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
916 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700917 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600918 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600919 }
920
921 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700922 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600923 enumeratorString += string;
924
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700925 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600926 enumeratorString += '|';
927 }
928 }
929
930 return enumeratorString;
931}
932
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700933static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800934 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700935 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
936 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
937 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
938 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
939 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 +0800940
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700941 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600942 return false;
943 }
944
945 return true;
946}
947
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700948static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
949 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600950 return "unrecognized enumerator";
951 }
952
953 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700954 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800955 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600956 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700957 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800958 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600959 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700960 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800961 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600962 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700963 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800964 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600965 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700966 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800967 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600968 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700969 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800970 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600971 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700972 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800973 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600974 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700975 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800976 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600977 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700978 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800979 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600980 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700981 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800982 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600983 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700984 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800985 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600986 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700987 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800988 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600989 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700990 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800991 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600992 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700993 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800994 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600995 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700996 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800997 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600998 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700999 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001000 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001001 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001002 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +08001003 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001004 }
1005
1006 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001007 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001008 enumeratorString += string;
1009
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001010 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001011 enumeratorString += '|';
1012 }
1013 }
1014
1015 return enumeratorString;
1016}
1017
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001018static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1019 VkCommandPoolCreateFlagBits allFlags =
1020 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1021 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001022 return false;
1023 }
1024
1025 return true;
1026}
1027
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001028static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1029 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001030 return "unrecognized enumerator";
1031 }
1032
1033 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001034 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001035 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001036 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001037 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001038 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001039 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001040
1041 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001042 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001043 enumeratorString += string;
1044
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001045 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001046 enumeratorString += '|';
1047 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001048 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001049
1050 return enumeratorString;
1051}
1052
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001053static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001054 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001055 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001056 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001057 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001058
1059 return true;
1060}
1061
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001062static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1063 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001064 return "unrecognized enumerator";
1065 }
1066
1067 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001068 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001069 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001070 }
1071
1072 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001073 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001074 enumeratorString += string;
1075
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001076 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001077 enumeratorString += '|';
1078 }
1079 }
1080
1081 return enumeratorString;
1082}
1083
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001084static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1085 VkCommandBufferUsageFlags allFlags =
1086 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1087 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1088 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001089 return false;
1090 }
1091
1092 return true;
1093}
1094
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001095static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1096 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001097 return "unrecognized enumerator";
1098 }
1099
1100 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001101 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001102 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001103 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001104 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001105 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001106 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001107 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001108 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001109 }
1110
1111 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001112 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001113 enumeratorString += string;
1114
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001115 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001116 enumeratorString += '|';
1117 }
1118 }
1119
1120 return enumeratorString;
1121}
1122
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001123static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001124 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001125 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001126 return false;
1127 }
1128
1129 return true;
1130}
1131
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001132static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1133 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001134 return "unrecognized enumerator";
1135 }
1136
1137 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001138 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001139 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001140 }
1141
1142 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001143 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001144 enumeratorString += string;
1145
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001146 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001147 enumeratorString += '|';
1148 }
1149 }
1150
1151 return enumeratorString;
1152}
1153
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001154static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1155 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1156 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1157 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001158 return false;
1159 }
1160
1161 return true;
1162}
1163
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001164static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1165 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001166 return "unrecognized enumerator";
1167 }
1168
1169 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001170 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001171 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1172 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001173 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001174 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1175 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001176 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001177 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1178 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001179 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001180 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1181 }
1182
1183 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001184 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001185 enumeratorString += string;
1186
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001187 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001188 enumeratorString += '|';
1189 }
1190 }
1191
1192 return enumeratorString;
1193}
1194
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001195static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001196 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001197 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001198 return false;
1199 }
1200
1201 return true;
1202}
1203
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001204static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1205 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001206 return "unrecognized enumerator";
1207 }
1208
1209 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001210 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001211 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001212 }
1213
1214 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001215 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001216 enumeratorString += string;
1217
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001218 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001219 enumeratorString += '|';
1220 }
1221 }
1222
1223 return enumeratorString;
1224}
1225
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001226static const int MaxParamCheckerStringLength = 256;
1227
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001228static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001229 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001230 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001231 assert(validateString != nullptr);
1232
Chris Forbes04b61da2016-11-03 09:53:59 +13001233 bool skip = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001234
1235 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1236
1237 if (result == VK_STRING_ERROR_NONE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001238 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001239 } else if (result & VK_STRING_ERROR_LENGTH) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001240 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001241 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1242 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001243 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001244 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001245 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1246 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001247 }
Chris Forbes04b61da2016-11-03 09:53:59 +13001248 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001249}
1250
Dustin Gravesde628532016-04-21 16:30:17 -06001251static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1252 uint32_t index) {
1253 assert(device_data != nullptr);
1254 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001255 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001256
1257 if (index == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001258 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001259 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001260 } else {
1261 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1262 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001263 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1264 "%s: %s (%d) must be one of the indices specified when the device was created, via "
1265 "the VkDeviceQueueCreateInfo structure.",
1266 function_name, parameter_name, index);
Dustin Gravesde628532016-04-21 16:30:17 -06001267 return false;
1268 }
1269 }
1270
Chris Forbes04b61da2016-11-03 09:53:59 +13001271 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001272}
1273
1274static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1275 const uint32_t count, const uint32_t *indices) {
1276 assert(device_data != nullptr);
1277 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001278 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001279
1280 if (indices != nullptr) {
1281 for (uint32_t i = 0; i < count; i++) {
1282 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001283 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001284 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001285 } else {
1286 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1287 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001288 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001289 LayerName,
1290 "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1291 "created, via the VkDeviceQueueCreateInfo structure.",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001292 function_name, parameter_name, i, indices[i]);
Dustin Gravesde628532016-04-21 16:30:17 -06001293 return false;
1294 }
1295 }
1296 }
1297 }
1298
Chris Forbes04b61da2016-11-03 09:53:59 +13001299 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001300}
1301
Chris Forbes6be763e2016-11-24 12:42:33 +13001302static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001303
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001304VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1305 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001306 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001307
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001308 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001309 assert(chain_info != nullptr);
1310 assert(chain_info->u.pLayerInfo != nullptr);
1311
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001312 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1313 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001314 if (fpCreateInstance == NULL) {
1315 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001316 }
1317
Dustin Graves842621d2016-03-03 14:17:08 -07001318 // Advance the link info for the next element on the chain
1319 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1320
1321 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001322
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001323 if (result == VK_SUCCESS) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001324 auto my_instance_data = GetLayerDataPtr(get_dispatch_key(*pInstance), instance_layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001325 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001326
Chris Forbes6444bba2016-11-24 14:15:23 +13001327 layer_init_instance_dispatch_table(*pInstance, &my_instance_data->dispatch_table, fpGetInstanceProcAddr);
Chia-I Wua570b7c2016-05-16 07:48:14 +08001328 my_instance_data->instance = *pInstance;
Chris Forbes6444bba2016-11-24 14:15:23 +13001329 my_instance_data->report_data =
1330 debug_report_create_instance(&my_instance_data->dispatch_table, *pInstance, pCreateInfo->enabledExtensionCount,
1331 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001332
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001333 // Look for one or more debug report create info structures
1334 // and setup a callback(s) for each one found.
1335 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1336 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1337 if (my_instance_data->num_tmp_callbacks > 0) {
1338 // Setup the temporary callback(s) here to catch early issues:
1339 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1340 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1341 // Failure of setting up one or more of the callback.
1342 // Therefore, clean up and don't use those callbacks:
1343 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1344 my_instance_data->num_tmp_callbacks = 0;
1345 }
1346 }
1347 }
1348
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001349 init_parameter_validation(my_instance_data, pAllocator);
Chris Forbes6be763e2016-11-24 12:42:33 +13001350 CheckInstanceRegisterExtensions(pCreateInfo, my_instance_data);
Dustin Graves842621d2016-03-03 14:17:08 -07001351
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001352 // Ordinarily we'd check these before calling down the chain, but none of the layer
1353 // support is in place until now, if we survive we can report the issue now.
1354 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001355
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001356 if (pCreateInfo->pApplicationInfo) {
1357 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1358 validate_string(my_instance_data->report_data, "vkCreateInstance",
1359 "pCreateInfo->VkApplicationInfo->pApplicationName",
1360 pCreateInfo->pApplicationInfo->pApplicationName);
1361 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001362
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001363 if (pCreateInfo->pApplicationInfo->pEngineName) {
1364 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1365 pCreateInfo->pApplicationInfo->pEngineName);
1366 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001367 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001368
1369 // Disable the tmp callbacks:
1370 if (my_instance_data->num_tmp_callbacks > 0) {
1371 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1372 my_instance_data->tmp_callbacks);
1373 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001374 }
1375
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001376 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001377}
1378
Chia-I Wu01ca2372016-05-13 14:37:49 +08001379VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001380 // Grab the key before the instance is destroyed.
1381 dispatch_key key = get_dispatch_key(instance);
Chris Forbes04b61da2016-11-03 09:53:59 +13001382 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001383 auto my_data = GetLayerDataPtr(key, instance_layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001384 assert(my_data != NULL);
1385
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001386 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1387 bool callback_setup = false;
1388 if (my_data->num_tmp_callbacks > 0) {
1389 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1390 my_data->tmp_callbacks)) {
1391 callback_setup = true;
1392 }
1393 }
1394
Chris Forbes04b61da2016-11-03 09:53:59 +13001395 skip |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001396
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001397 // Disable and cleanup the temporary callback(s):
1398 if (callback_setup) {
1399 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1400 }
1401 if (my_data->num_tmp_callbacks > 0) {
1402 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1403 my_data->num_tmp_callbacks = 0;
1404 }
1405
Chris Forbes04b61da2016-11-03 09:53:59 +13001406 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001407 my_data->dispatch_table.DestroyInstance(instance, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001408
1409 // Clean up logging callback, if any
1410 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001411 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1412 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001413 my_data->logging_callback.pop_back();
1414 }
1415
Chris Forbes78a56b02016-11-02 16:13:01 +13001416 layer_debug_report_destroy_instance(my_data->report_data);
Chris Forbes6444bba2016-11-24 14:15:23 +13001417 instance_layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001418 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001419}
1420
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001421VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1422 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001423 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001424 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001425 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001426 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001427
Chris Forbes04b61da2016-11-03 09:53:59 +13001428 skip |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001429
Chris Forbes04b61da2016-11-03 09:53:59 +13001430 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001431 result = my_data->dispatch_table.EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001432 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001433 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001434 return result;
1435}
1436
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001437VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001438 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001439 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001440 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001441
Chris Forbes04b61da2016-11-03 09:53:59 +13001442 skip |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001443
Chris Forbes04b61da2016-11-03 09:53:59 +13001444 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001445 my_data->dispatch_table.GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001446 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001447}
1448
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001449VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1450 VkFormatProperties *pFormatProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001451 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001452 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001453 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001454
Chris Forbes04b61da2016-11-03 09:53:59 +13001455 skip |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001456
Chris Forbes04b61da2016-11-03 09:53:59 +13001457 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001458 my_data->dispatch_table.GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001459 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001460}
1461
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001462VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1463 VkImageType type, VkImageTiling tiling,
1464 VkImageUsageFlags usage, VkImageCreateFlags flags,
1465 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001466 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001467 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001468 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001469 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001470
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001471 skip |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage, flags,
1472 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001473
Chris Forbes04b61da2016-11-03 09:53:59 +13001474 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001475 result = my_data->dispatch_table.GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1476 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001477
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001478 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001479 }
Chia-I Wu17241042015-10-31 00:31:16 +08001480
1481 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001482}
1483
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001484VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001485 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001486 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001487 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001488
Chris Forbes04b61da2016-11-03 09:53:59 +13001489 skip |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001490
Chris Forbes04b61da2016-11-03 09:53:59 +13001491 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001492 my_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001493 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001494}
1495
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001496VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1497 uint32_t *pQueueFamilyPropertyCount,
1498 VkQueueFamilyProperties *pQueueFamilyProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001499 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001500 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001501 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001502
Chris Forbes04b61da2016-11-03 09:53:59 +13001503 skip |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001504 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001505
Chris Forbes04b61da2016-11-03 09:53:59 +13001506 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001507 my_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount,
1508 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001509 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001510}
1511
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001512VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1513 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001514 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001515 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001516 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001517
Chris Forbes04b61da2016-11-03 09:53:59 +13001518 skip |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001519
Chris Forbes04b61da2016-11-03 09:53:59 +13001520 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001521 my_data->dispatch_table.GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001522 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001523}
1524
Mike Weiblen37166272017-01-05 15:11:00 -07001525static void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001526 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001527 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001528
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001529 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes0e0161a2016-11-02 16:21:28 +13001530
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001531 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1532 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1533 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001534 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07001535 VALIDATION_ERROR_00035, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001536 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
Mike Weiblena6666382017-01-05 15:16:11 -07001537 "structure. %s",
1538 i, validation_error_map[VALIDATION_ERROR_00035]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001539 } else {
1540 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001541 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001542
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001543 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1544 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1545 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1546 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001547 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 -06001548 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001549 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1550 "between 0 and 1. Actual value is %f",
1551 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1552 }
1553 }
1554 }
1555
1556 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1557 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001558 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 -06001559 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001560 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1561 "of queue families.",
1562 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001563 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1564 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1565 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001566 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 -06001567 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001568 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1569 "queues for the given family index.",
1570 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001571 }
Michael Lentine774704f2016-01-27 13:36:46 -06001572 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001573 }
1574}
1575
Chris Forbes6be763e2016-11-24 12:42:33 +13001576static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001577 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001578 auto name = pCreateInfo->ppEnabledExtensionNames[i];
1579
1580 if (strcmp(name, VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
1581 instance_data->extensions.surface_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001582#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Young39389872017-01-19 21:10:49 -07001583 } else if (strcmp(name, VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001584 instance_data->extensions.xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001585#endif
1586#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Young39389872017-01-19 21:10:49 -07001587 } else if (strcmp(name, VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001588 instance_data->extensions.xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001589#endif
1590#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Young39389872017-01-19 21:10:49 -07001591 } else if (strcmp(name, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001592 instance_data->extensions.wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001593#endif
1594#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Young39389872017-01-19 21:10:49 -07001595 } else if (strcmp(name, VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001596 instance_data->extensions.mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001597#endif
1598#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Young39389872017-01-19 21:10:49 -07001599 } else if (strcmp(name, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001600 instance_data->extensions.android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001601#endif
1602#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Young39389872017-01-19 21:10:49 -07001603 } else if (strcmp(name, VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001604 instance_data->extensions.win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001605#endif
Mark Young39389872017-01-19 21:10:49 -07001606 } else if (strcmp(name, VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001607 instance_data->extensions.display_enabled = true;
Mark Young39389872017-01-19 21:10:49 -07001608 } else if (strcmp(name, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0) {
1609 instance_data->extensions.khr_get_phys_dev_properties2_enabled = true;
Mark Young0f183a82017-02-28 09:58:04 -07001610 } else if (strcmp(name, VK_KHX_DEVICE_GROUP_CREATION_EXTENSION_NAME) == 0) {
1611 instance_data->extensions.khx_device_group_creation_enabled = true;
1612 } else if (strcmp(name, VK_KHX_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME) == 0) {
1613 instance_data->extensions.khx_external_memory_capabilities_enabled = true;
1614 } else if (strcmp(name, VK_KHX_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME) == 0) {
1615 instance_data->extensions.khx_external_semaphore_capabilities_enabled = true;
Mark Young39389872017-01-19 21:10:49 -07001616 } else if (strcmp(name, VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME) == 0) {
1617 instance_data->extensions.nv_external_memory_capabilities_enabled = true;
1618#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
1619 } else if (strcmp(name, VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME) == 0) {
1620 instance_data->extensions.ext_acquire_xlib_display_enabled = true;
1621#endif
1622 } else if (strcmp(name, VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME) == 0) {
1623 instance_data->extensions.ext_direct_mode_display_enabled = true;
1624 } else if (strcmp(name, VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME) == 0) {
1625 instance_data->extensions.ext_display_surface_counter_enabled = true;
1626 } else if (strcmp(name, VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME) == 0) {
1627 instance_data->extensions.nv_external_memory_capabilities_enabled = true;
Chris Forbes2e47f432016-11-03 10:18:18 +13001628 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001629 }
1630}
1631
1632static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001633 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001634 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1635 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
Mark Young39389872017-01-19 21:10:49 -07001636 device_data->enables.khr_swapchain_enabled = true;
1637 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
1638 device_data->enables.khr_display_swapchain_enabled = true;
1639 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
1640 device_data->enables.khr_maintenance1 = true;
Mark Young0f183a82017-02-28 09:58:04 -07001641 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME) == 0) {
1642 device_data->enables.khr_push_descriptor = true;
1643 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME) == 0) {
1644 device_data->enables.khr_descriptor_update_template = true;
1645 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHX_DEVICE_GROUP_EXTENSION_NAME) == 0) {
1646 device_data->enables.khx_device_group = true;
1647 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHX_EXTERNAL_MEMORY_FD_EXTENSION_NAME) == 0) {
1648 device_data->enables.khx_external_memory_fd = true;
1649 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHX_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME) == 0) {
1650 device_data->enables.khx_external_semaphore_fd = true;
Jamie Madill0f941442017-03-16 12:53:42 -04001651#ifdef VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07001652 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHX_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME) == 0) {
1653 device_data->enables.khx_external_memory_win32 = true;
1654 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHX_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME) == 0) {
1655 device_data->enables.khx_external_semaphore_win32 = true;
Mark Young39389872017-01-19 21:10:49 -07001656#endif
1657 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_DEBUG_MARKER_EXTENSION_NAME) == 0) {
1658 device_data->enables.ext_debug_marker = true;
Mark Young0f183a82017-02-28 09:58:04 -07001659 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME) == 0) {
1660 device_data->enables.ext_discard_rectangles = true;
Mark Lobodzinski099b3b62017-02-08 16:04:35 -07001661 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME) == 0) {
1662 device_data->enables.ext_display_control = true;
1663 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME) == 0) {
1664 device_data->enables.amd_draw_indirect_count = true;
Mark Young0f183a82017-02-28 09:58:04 -07001665 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME) == 0) {
1666 device_data->enables.amd_negative_viewport_height = true;
1667 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME) == 0) {
1668 device_data->enables.nv_clip_space_w_scaling = true;
1669 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_NV_EXTERNAL_MEMORY_EXTENSION_NAME) == 0) {
1670 device_data->enables.nv_external_memory = true;
1671#ifdef VK_USE_PLATFORM_WIN32_KHR
1672 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME) == 0) {
1673 device_data->enables.nv_external_memory_win32 = true;
1674#endif
1675 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME) == 0) {
1676 device_data->enables.nvx_device_generated_commands = true;
Tobin Ehlis13e9c142017-01-13 12:13:57 -07001677 } else if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME) == 0) {
1678 device_data->enables.incremental_present = true;
Mark Youngfa552782016-12-12 16:14:55 -07001679 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001680 }
1681}
1682
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001683void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001684 layer_data *my_device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001685
1686 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1687 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1688 my_device_data->queueFamilyIndexMap.insert(
1689 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1690 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001691 }
1692}
1693
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001694VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001695 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001696 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001697 * NOTE: We do not validate physicalDevice or any dispatchable
1698 * object as the first parameter. We couldn't get here if it was wrong!
1699 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001700
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001701 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001702 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001703 auto my_instance_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001704 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001705
Chris Forbes04b61da2016-11-03 09:53:59 +13001706 skip |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001707
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001708 if (pCreateInfo != NULL) {
1709 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001710 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001711 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001712 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001713 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001714 }
Michael Lentine774704f2016-01-27 13:36:46 -06001715
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001716 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001717 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001718 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledExtensionNames",
1719 pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001720 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001721 }
Tobin Ehlis3da63962017-02-06 16:44:50 -07001722 if (pCreateInfo->pNext != NULL && pCreateInfo->pEnabledFeatures) {
1723 // Check for get_physical_device_properties2 struct
1724 struct std_header {
1725 VkStructureType sType;
1726 const void *pNext;
1727 };
1728 std_header *cur_pnext = (std_header *)pCreateInfo->pNext;
1729 while (cur_pnext) {
1730 if (VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR == cur_pnext->sType) {
1731 // Cannot include VkPhysicalDeviceFeatures2KHR and have non-null pEnabledFeatures
1732 skip |= log_msg(my_instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
1733 VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE, LayerName,
1734 "VkDeviceCreateInfo->pNext includes a VkPhysicalDeviceFeatures2KHR struct when "
1735 "pCreateInfo->pEnabledFeatures is non-NULL.");
1736 break;
1737 }
1738 cur_pnext = (std_header *)cur_pnext->pNext;
1739 }
1740 }
Mark Young0f183a82017-02-28 09:58:04 -07001741 if (pCreateInfo->pNext != NULL && pCreateInfo->pEnabledFeatures) {
1742 // Check for get_physical_device_properties2 struct
1743 struct std_header {
1744 VkStructureType sType;
1745 const void *pNext;
1746 };
1747 std_header *cur_pnext = (std_header *)pCreateInfo->pNext;
1748 while (cur_pnext) {
1749 if (VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR == cur_pnext->sType) {
1750 // Cannot include VkPhysicalDeviceFeatures2KHR and have non-null pEnabledFeatures
1751 skip |= log_msg(my_instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
1752 VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE, LayerName,
1753 "VkDeviceCreateInfo->pNext includes a VkPhysicalDeviceFeatures2KHR struct when "
1754 "pCreateInfo->pEnabledFeatures is non-NULL.");
1755 break;
1756 }
1757 cur_pnext = (std_header *)cur_pnext->pNext;
1758 }
1759 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001760 }
1761
Chris Forbes04b61da2016-11-03 09:53:59 +13001762 if (!skip) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001763 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001764 assert(chain_info != nullptr);
1765 assert(chain_info->u.pLayerInfo != nullptr);
1766
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001767 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1768 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001769 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001770 if (fpCreateDevice == NULL) {
1771 return VK_ERROR_INITIALIZATION_FAILED;
1772 }
1773
1774 // Advance the link info for the next element on the chain
1775 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1776
1777 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001778
1779 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1780
1781 if (result == VK_SUCCESS) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001782 layer_data *my_device_data = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001783 assert(my_device_data != nullptr);
1784
1785 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
Chris Forbese58c9fe2016-11-24 14:44:17 +13001786 layer_init_device_dispatch_table(*pDevice, &my_device_data->dispatch_table, fpGetDeviceProcAddr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001787
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001788 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1789
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001790 uint32_t count;
Chris Forbes6444bba2016-11-24 14:15:23 +13001791 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001792 std::vector<VkQueueFamilyProperties> properties(count);
Chris Forbes6444bba2016-11-24 14:15:23 +13001793 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001794
1795 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1796 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001797
1798 // Query and save physical device limits for this device
1799 VkPhysicalDeviceProperties device_properties = {};
Chris Forbes6444bba2016-11-24 14:15:23 +13001800 my_instance_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, &device_properties);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001801 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001802 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001803
1804 // Save app-enabled features in this device's layer_data structure
1805 if (pCreateInfo->pEnabledFeatures) {
1806 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1807 } else {
1808 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1809 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001810 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001811 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001812
Jeremy Hayes99a96322015-06-26 12:48:09 -06001813 return result;
1814}
1815
Chia-I Wu01ca2372016-05-13 14:37:49 +08001816VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001817 dispatch_key key = get_dispatch_key(device);
Chris Forbes04b61da2016-11-03 09:53:59 +13001818 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001819 layer_data *my_data = GetLayerDataPtr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001820 assert(my_data != NULL);
1821
Chris Forbes04b61da2016-11-03 09:53:59 +13001822 skip |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001823
Chris Forbes04b61da2016-11-03 09:53:59 +13001824 if (!skip) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001825 layer_debug_report_destroy_device(device);
1826
Jeremy Hayes99a96322015-06-26 12:48:09 -06001827#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001828 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001829#endif
1830
Chris Forbese58c9fe2016-11-24 14:44:17 +13001831 my_data->dispatch_table.DestroyDevice(device, pAllocator);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001832 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001833 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001834}
1835
Mike Weiblen37166272017-01-05 15:11:00 -07001836static bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001837 layer_data *my_device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001838 assert(my_device_data != nullptr);
1839
Dustin Gravesde628532016-04-21 16:30:17 -06001840 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001841
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001842 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001843 if (queue_data->second <= queueIndex) {
Mike Weiblena6666382017-01-05 15:16:11 -07001844 log_msg(
1845 my_device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1846 VALIDATION_ERROR_00061, LayerName,
1847 "vkGetDeviceQueue() parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1848 "was created. %s",
1849 queueIndex, validation_error_map[VALIDATION_ERROR_00061]);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001850 return false;
1851 }
1852 return true;
1853}
1854
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001855VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001856 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001857 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001858 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001859
Chris Forbes04b61da2016-11-03 09:53:59 +13001860 skip |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001861
Chris Forbes04b61da2016-11-03 09:53:59 +13001862 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001863 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1864
Chris Forbese58c9fe2016-11-24 14:44:17 +13001865 my_data->dispatch_table.GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001866 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001867}
1868
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001869VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001870 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001871 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001872 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001873 assert(my_data != NULL);
1874
Chris Forbes04b61da2016-11-03 09:53:59 +13001875 skip |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001876
Chris Forbes04b61da2016-11-03 09:53:59 +13001877 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001878 result = my_data->dispatch_table.QueueSubmit(queue, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001879
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001880 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001881 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001882
Jeremy Hayes99a96322015-06-26 12:48:09 -06001883 return result;
1884}
1885
Chia-I Wu01ca2372016-05-13 14:37:49 +08001886VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001887 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(queue), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001888 assert(my_data != NULL);
1889
Chris Forbese58c9fe2016-11-24 14:44:17 +13001890 VkResult result = my_data->dispatch_table.QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001891
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001892 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001893
1894 return result;
1895}
1896
Chia-I Wu01ca2372016-05-13 14:37:49 +08001897VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001898 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001899 assert(my_data != NULL);
1900
Chris Forbese58c9fe2016-11-24 14:44:17 +13001901 VkResult result = my_data->dispatch_table.DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001902
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001903 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001904
1905 return result;
1906}
1907
Chia-I Wu01ca2372016-05-13 14:37:49 +08001908VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001909 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001910 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001911 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001912 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001913 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001914
Chris Forbes04b61da2016-11-03 09:53:59 +13001915 skip |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001916
Chris Forbes04b61da2016-11-03 09:53:59 +13001917 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001918 result = my_data->dispatch_table.AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001919
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001920 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001921 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001922
1923 return result;
1924}
1925
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001926VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001927 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001928 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001929 assert(my_data != NULL);
1930
Chris Forbes04b61da2016-11-03 09:53:59 +13001931 skip |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001932
Chris Forbes04b61da2016-11-03 09:53:59 +13001933 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001934 my_data->dispatch_table.FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001935 }
1936}
1937
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001938VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1939 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001940 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001941 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001942 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001943 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001944
Chris Forbes04b61da2016-11-03 09:53:59 +13001945 skip |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001946
Chris Forbes04b61da2016-11-03 09:53:59 +13001947 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001948 result = my_data->dispatch_table.MapMemory(device, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001949
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001950 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001951 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001952
1953 return result;
1954}
1955
Chia-I Wu01ca2372016-05-13 14:37:49 +08001956VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001957 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001958 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001959 assert(my_data != NULL);
1960
Chris Forbes04b61da2016-11-03 09:53:59 +13001961 skip |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001962
Chris Forbes04b61da2016-11-03 09:53:59 +13001963 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001964 my_data->dispatch_table.UnmapMemory(device, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001965 }
1966}
1967
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001968VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1969 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001970 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001971 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001972 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001973 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001974
Chris Forbes04b61da2016-11-03 09:53:59 +13001975 skip |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001976
Chris Forbes04b61da2016-11-03 09:53:59 +13001977 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001978 result = my_data->dispatch_table.FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001979
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001980 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001981 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001982
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001983 return result;
1984}
1985
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001986VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1987 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001988 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001989 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001990 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001991 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001992
Chris Forbes04b61da2016-11-03 09:53:59 +13001993 skip |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001994
Chris Forbes04b61da2016-11-03 09:53:59 +13001995 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001996 result = my_data->dispatch_table.InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001997
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001998 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001999 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002000
Tony Barbourb1250542015-04-16 19:23:13 -06002001 return result;
2002}
2003
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002004VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
2005 VkDeviceSize *pCommittedMemoryInBytes) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002006 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002007 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002008 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06002009
Chris Forbes04b61da2016-11-03 09:53:59 +13002010 skip |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002011
Chris Forbes04b61da2016-11-03 09:53:59 +13002012 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002013 my_data->dispatch_table.GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002014 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06002015}
2016
Chia-I Wu01ca2372016-05-13 14:37:49 +08002017VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
2018 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002019 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002020 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002021 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002022 assert(my_data != NULL);
2023
Chris Forbes04b61da2016-11-03 09:53:59 +13002024 skip |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002025
Chris Forbes04b61da2016-11-03 09:53:59 +13002026 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002027 result = my_data->dispatch_table.BindBufferMemory(device, buffer, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002028
2029 validate_result(my_data->report_data, "vkBindBufferMemory", result);
2030 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002031
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002032 return result;
2033}
2034
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002035VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002036 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002037 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002038 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002039 assert(my_data != NULL);
2040
Chris Forbes04b61da2016-11-03 09:53:59 +13002041 skip |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002042
Chris Forbes04b61da2016-11-03 09:53:59 +13002043 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002044 result = my_data->dispatch_table.BindImageMemory(device, image, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002045
2046 validate_result(my_data->report_data, "vkBindImageMemory", result);
2047 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002048
2049 return result;
2050}
2051
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002052VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
2053 VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002054 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002055 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002056 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002057
Chris Forbes04b61da2016-11-03 09:53:59 +13002058 skip |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002059
Chris Forbes04b61da2016-11-03 09:53:59 +13002060 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002061 my_data->dispatch_table.GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002062 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002063}
2064
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002065VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002066 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002067 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002068 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002069
Chris Forbes04b61da2016-11-03 09:53:59 +13002070 skip |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002071
Chris Forbes04b61da2016-11-03 09:53:59 +13002072 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002073 my_data->dispatch_table.GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002074 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002075}
2076
Mike Weiblen37166272017-01-05 15:11:00 -07002077static bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002078 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002079 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002080 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07002081 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002082 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2083 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002084 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 -06002085 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002086 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2087 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002088 return false;
2089 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002090 }
2091
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002092 return true;
2093}
2094
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002095VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2096 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002097 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002098 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002099 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002100
Chris Forbes04b61da2016-11-03 09:53:59 +13002101 skip |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002102 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002103
Chris Forbes04b61da2016-11-03 09:53:59 +13002104 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002105 my_data->dispatch_table.GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount,
2106 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002107
2108 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2109 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002110}
2111
Mike Weiblen37166272017-01-05 15:11:00 -07002112static bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002113 VkSampleCountFlagBits samples, VkImageUsageFlags usage,
2114 VkImageTiling tiling, uint32_t *pNumProperties,
2115 VkSparseImageFormatProperties *pProperties) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002116 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002117 if (pProperties != nullptr) {
2118 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2119 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002120 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 -06002121 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002122 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2123 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002124 return false;
2125 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002126 }
2127
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002128 return true;
2129}
2130
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002131VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2132 VkImageType type, VkSampleCountFlagBits samples,
2133 VkImageUsageFlags usage, VkImageTiling tiling,
2134 uint32_t *pPropertyCount,
2135 VkSparseImageFormatProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002136 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002137 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002138 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002139
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002140 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples, usage,
2141 tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002142
Chris Forbes04b61da2016-11-03 09:53:59 +13002143 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13002144 my_data->dispatch_table.GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling,
2145 pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002146
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002147 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2148 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002149 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002150}
2151
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002152VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2153 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002154 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002155 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002156 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002157 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002158
Chris Forbes04b61da2016-11-03 09:53:59 +13002159 skip |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002160
Chris Forbes04b61da2016-11-03 09:53:59 +13002161 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002162 result = my_data->dispatch_table.QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002163
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002164 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002165 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002166
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002167 return result;
2168}
2169
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002170VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2171 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002172 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002173 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002174 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002175 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002176
Chris Forbes04b61da2016-11-03 09:53:59 +13002177 skip |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002178
Chris Forbes04b61da2016-11-03 09:53:59 +13002179 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002180 result = my_data->dispatch_table.CreateFence(device, pCreateInfo, pAllocator, pFence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002181
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002182 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002183 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002184
2185 return result;
2186}
2187
Chia-I Wu01ca2372016-05-13 14:37:49 +08002188VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002189 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002190 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002191 assert(my_data != NULL);
2192
Chris Forbes04b61da2016-11-03 09:53:59 +13002193 skip |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002194
Chris Forbes04b61da2016-11-03 09:53:59 +13002195 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002196 my_data->dispatch_table.DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002197 }
2198}
2199
Chia-I Wu01ca2372016-05-13 14:37:49 +08002200VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002201 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002202 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002203 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002204 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002205
Chris Forbes04b61da2016-11-03 09:53:59 +13002206 skip |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002207
Chris Forbes04b61da2016-11-03 09:53:59 +13002208 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002209 result = my_data->dispatch_table.ResetFences(device, fenceCount, pFences);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002210
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002211 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002212 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002213
2214 return result;
2215}
2216
Chia-I Wu01ca2372016-05-13 14:37:49 +08002217VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002218 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002219 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002220 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002221 assert(my_data != NULL);
2222
Chris Forbes04b61da2016-11-03 09:53:59 +13002223 skip |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002224
Chris Forbes04b61da2016-11-03 09:53:59 +13002225 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002226 result = my_data->dispatch_table.GetFenceStatus(device, fence);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002227
2228 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2229 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002230
2231 return result;
2232}
2233
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002234VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2235 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002236 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002237 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002238 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002239 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002240
Chris Forbes04b61da2016-11-03 09:53:59 +13002241 skip |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002242
Chris Forbes04b61da2016-11-03 09:53:59 +13002243 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002244 result = my_data->dispatch_table.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002245
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002246 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002247 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002248
2249 return result;
2250}
2251
Chia-I Wu01ca2372016-05-13 14:37:49 +08002252VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002253 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002254 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002255 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002256 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002257 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002258
Chris Forbes04b61da2016-11-03 09:53:59 +13002259 skip |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002260
Chris Forbes04b61da2016-11-03 09:53:59 +13002261 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002262 result = my_data->dispatch_table.CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002263
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002264 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002265 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002266
2267 return result;
2268}
2269
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002270VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002271 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002272 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002273 assert(my_data != NULL);
2274
Chris Forbes04b61da2016-11-03 09:53:59 +13002275 skip |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002276
Chris Forbes04b61da2016-11-03 09:53:59 +13002277 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002278 my_data->dispatch_table.DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002279 }
2280}
2281
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002282VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2283 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002284 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002285 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002286 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002287 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002288
Chris Forbes04b61da2016-11-03 09:53:59 +13002289 skip |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002290
Chris Forbes04b61da2016-11-03 09:53:59 +13002291 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002292 result = my_data->dispatch_table.CreateEvent(device, pCreateInfo, pAllocator, pEvent);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002293
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002294 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002295 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002296
2297 return result;
2298}
2299
Chia-I Wu01ca2372016-05-13 14:37:49 +08002300VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002301 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002302 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002303 assert(my_data != NULL);
2304
Chris Forbes04b61da2016-11-03 09:53:59 +13002305 skip |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002306
Chris Forbes04b61da2016-11-03 09:53:59 +13002307 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002308 my_data->dispatch_table.DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002309 }
2310}
2311
Chia-I Wu01ca2372016-05-13 14:37:49 +08002312VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002313 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002314 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002315 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002316 assert(my_data != NULL);
2317
Chris Forbes04b61da2016-11-03 09:53:59 +13002318 skip |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002319
Chris Forbes04b61da2016-11-03 09:53:59 +13002320 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002321 result = my_data->dispatch_table.GetEventStatus(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002322
2323 validate_result(my_data->report_data, "vkGetEventStatus", result);
2324 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002325
2326 return result;
2327}
2328
Chia-I Wu01ca2372016-05-13 14:37:49 +08002329VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002330 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002331 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002332 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002333 assert(my_data != NULL);
2334
Chris Forbes04b61da2016-11-03 09:53:59 +13002335 skip |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002336
Chris Forbes04b61da2016-11-03 09:53:59 +13002337 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002338 result = my_data->dispatch_table.SetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002339
2340 validate_result(my_data->report_data, "vkSetEvent", result);
2341 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002342
2343 return result;
2344}
2345
Chia-I Wu01ca2372016-05-13 14:37:49 +08002346VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002347 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002348 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002349 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002350 assert(my_data != NULL);
2351
Chris Forbes04b61da2016-11-03 09:53:59 +13002352 skip |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002353
Chris Forbes04b61da2016-11-03 09:53:59 +13002354 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002355 result = my_data->dispatch_table.ResetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002356
2357 validate_result(my_data->report_data, "vkResetEvent", result);
2358 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002359
2360 return result;
2361}
2362
Chia-I Wu01ca2372016-05-13 14:37:49 +08002363VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002364 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002365 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002366 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002367 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002368 assert(device_data != nullptr);
2369 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002370
Chris Forbes04b61da2016-11-03 09:53:59 +13002371 skip |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002372
Dustin Gravesc900f572016-05-16 11:07:59 -06002373 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2374 if (pCreateInfo != nullptr) {
2375 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2376 // VkQueryPipelineStatisticFlagBits values
2377 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2378 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
Mike Weiblena6666382017-01-05 15:16:11 -07002379 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2380 VALIDATION_ERROR_01007, LayerName,
2381 "vkCreateQueryPool(): if pCreateInfo->queryType is "
2382 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2383 "a valid combination of VkQueryPipelineStatisticFlagBits values. %s",
2384 validation_error_map[VALIDATION_ERROR_01007]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002385 }
2386 }
2387
Chris Forbes04b61da2016-11-03 09:53:59 +13002388 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002389 result = device_data->dispatch_table.CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002390
Dustin Gravesc900f572016-05-16 11:07:59 -06002391 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002392 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002393
2394 return result;
2395}
2396
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002397VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002398 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002399 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002400 assert(my_data != NULL);
2401
Chris Forbes04b61da2016-11-03 09:53:59 +13002402 skip |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002403
Chris Forbes04b61da2016-11-03 09:53:59 +13002404 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002405 my_data->dispatch_table.DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002406 }
2407}
2408
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002409VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2410 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002411 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002412 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002413 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002414 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002415
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002416 skip |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize, pData,
2417 stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002418
Chris Forbes04b61da2016-11-03 09:53:59 +13002419 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002420 result =
2421 my_data->dispatch_table.GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002422
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002423 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002424 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002425
2426 return result;
2427}
2428
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002429VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2430 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002431 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002432 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002433 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002434 assert(device_data != nullptr);
2435 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002436
Chris Forbes04b61da2016-11-03 09:53:59 +13002437 skip |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002438
Dustin Gravesc900f572016-05-16 11:07:59 -06002439 if (pCreateInfo != nullptr) {
Maciej Jesionowski420b1c32016-12-14 11:01:21 +01002440 // Buffer size must be greater than 0 (error 00663)
2441 skip |=
2442 ValidateGreaterThan(report_data, "vkCreateBuffer", "pCreateInfo->size", static_cast<uint32_t>(pCreateInfo->size), 0u);
2443
Dustin Gravesc900f572016-05-16 11:07:59 -06002444 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2445 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2446 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2447 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002448 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2449 VALIDATION_ERROR_00665, LayerName,
2450 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2451 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2452 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002453 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002454
Dustin Gravesc900f572016-05-16 11:07:59 -06002455 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2456 // queueFamilyIndexCount uint32_t values
2457 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002458 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2459 VALIDATION_ERROR_00664, LayerName,
2460 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2461 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2462 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2463 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002464 }
2465
2466 // Ensure that the queue family indices were specified at device creation
Chris Forbes04b61da2016-11-03 09:53:59 +13002467 skip |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002468 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
Dustin Gravesc900f572016-05-16 11:07:59 -06002469 }
Maciej Jesionowski420b1c32016-12-14 11:01:21 +01002470
2471 // If flags contains VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must also contain
2472 // VK_BUFFER_CREATE_SPARSE_BINDING_BIT
2473 if (((pCreateInfo->flags & (VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2474 ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) != VK_BUFFER_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski181ec3a2016-12-14 13:37:04 -07002475 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2476 VALIDATION_ERROR_00669, LayerName,
2477 "vkCreateBuffer: if pCreateInfo->flags contains VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or "
2478 "VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_BUFFER_CREATE_SPARSE_BINDING_BIT. %s",
2479 validation_error_map[VALIDATION_ERROR_00669]);
Maciej Jesionowski420b1c32016-12-14 11:01:21 +01002480 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002481 }
2482
Chris Forbes04b61da2016-11-03 09:53:59 +13002483 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002484 result = device_data->dispatch_table.CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002485
Dustin Gravesc900f572016-05-16 11:07:59 -06002486 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002487 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002488
2489 return result;
2490}
2491
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002492VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002493 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002494 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002495 assert(my_data != NULL);
2496
Chris Forbes04b61da2016-11-03 09:53:59 +13002497 skip |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002498
Chris Forbes04b61da2016-11-03 09:53:59 +13002499 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002500 my_data->dispatch_table.DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002501 }
2502}
2503
Chia-I Wu01ca2372016-05-13 14:37:49 +08002504VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2505 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002506 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002507 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002508 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002509 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002510
Chris Forbes04b61da2016-11-03 09:53:59 +13002511 skip |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002512
Chris Forbes04b61da2016-11-03 09:53:59 +13002513 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002514 result = my_data->dispatch_table.CreateBufferView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002515
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002516 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002517 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002518
2519 return result;
2520}
2521
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002522VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002523 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002524 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002525 assert(my_data != NULL);
2526
Chris Forbes04b61da2016-11-03 09:53:59 +13002527 skip |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002528
Chris Forbes04b61da2016-11-03 09:53:59 +13002529 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002530 my_data->dispatch_table.DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002531 }
2532}
2533
Chia-I Wu01ca2372016-05-13 14:37:49 +08002534VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2535 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002536 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002537 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002538 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002539 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002540 debug_report_data *report_data = device_data->report_data;
2541
Chris Forbes04b61da2016-11-03 09:53:59 +13002542 skip |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002543
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002544 if (pCreateInfo != nullptr) {
Mark Lobodzinski7d9ef882017-03-01 16:15:02 -07002545
2546 if ((device_data->physical_device_features.textureCompressionETC2 == false) &&
Dave Houlton1d2022c2017-03-29 11:43:58 -06002547 FormatIsCompressed_ETC2_EAC(pCreateInfo->format)) {
Mark Lobodzinski7d9ef882017-03-01 16:15:02 -07002548 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2549 DEVICE_FEATURE, LayerName,
2550 "vkCreateImage(): Attempting to create VkImage with format %s. The textureCompressionETC2 feature is "
2551 "not enabled: neither ETC2 nor EAC formats can be used to create images.",
2552 string_VkFormat(pCreateInfo->format));
2553 }
2554
Mark Lobodzinski846c2142017-03-01 16:17:39 -07002555 if ((device_data->physical_device_features.textureCompressionASTC_LDR == false) &&
Dave Houlton1d2022c2017-03-29 11:43:58 -06002556 FormatIsCompressed_ASTC_LDR(pCreateInfo->format)) {
Mark Lobodzinski846c2142017-03-01 16:17:39 -07002557 skip |=
2558 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2559 DEVICE_FEATURE, LayerName,
2560 "vkCreateImage(): Attempting to create VkImage with format %s. The textureCompressionASTC_LDR feature is "
2561 "not enabled: ASTC formats cannot be used to create images.",
2562 string_VkFormat(pCreateInfo->format));
2563 }
2564
Mark Lobodzinski64f374e2017-03-01 16:19:36 -07002565 if ((device_data->physical_device_features.textureCompressionBC == false) &&
Dave Houlton1d2022c2017-03-29 11:43:58 -06002566 FormatIsCompressed_BC(pCreateInfo->format)) {
Mark Lobodzinski64f374e2017-03-01 16:19:36 -07002567 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2568 DEVICE_FEATURE, LayerName,
2569 "vkCreateImage(): Attempting to create VkImage with format %s. The textureCompressionBC feature is "
2570 "not enabled: BC compressed formats cannot be used to create images.",
2571 string_VkFormat(pCreateInfo->format));
2572 }
2573
Dustin Gravesc900f572016-05-16 11:07:59 -06002574 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002575 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002576 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2577 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Mike Weiblena6666382017-01-05 15:16:11 -07002578 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2579 VALIDATION_ERROR_00714, LayerName,
2580 "vkCreateImage(): if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2581 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2582 validation_error_map[VALIDATION_ERROR_00714]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002583 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002584
Dustin Gravesc900f572016-05-16 11:07:59 -06002585 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2586 // queueFamilyIndexCount uint32_t values
2587 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Mike Weiblena6666382017-01-05 15:16:11 -07002588 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2589 VALIDATION_ERROR_00713, LayerName,
2590 "vkCreateImage(): if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2591 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2592 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2593 validation_error_map[VALIDATION_ERROR_00713]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002594 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002595
Chris Forbes04b61da2016-11-03 09:53:59 +13002596 skip |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002597 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002598 }
2599
2600 // width, height, and depth members of extent must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002601 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002602 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
Chris Forbes04b61da2016-11-03 09:53:59 +13002603 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002604
2605 // mipLevels must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002606 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002607
2608 // arrayLayers must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002609 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002610
2611 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2612 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002613 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2614 VALIDATION_ERROR_02129, LayerName,
2615 "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
2616 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1. %s",
2617 validation_error_map[VALIDATION_ERROR_02129]);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002618 }
2619
2620 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2621 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2622 // extent.height must be equal
2623 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2624 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mike Weiblena6666382017-01-05 15:16:11 -07002625 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2626 VALIDATION_ERROR_02127, LayerName,
2627 "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2628 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2629 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal. %s",
2630 validation_error_map[VALIDATION_ERROR_02127]);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002631 }
2632
2633 if (pCreateInfo->extent.depth != 1) {
Mike Weiblena6666382017-01-05 15:16:11 -07002634 skip |= log_msg(
2635 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, VALIDATION_ERROR_02130,
2636 LayerName,
2637 "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1. %s",
2638 validation_error_map[VALIDATION_ERROR_02130]);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002639 }
2640 }
2641
2642 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2643 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2644 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002645 skip |=
Mike Weiblena6666382017-01-05 15:16:11 -07002646 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2647 VALIDATION_ERROR_02131, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07002648 "vkCreateImage(): pCreateInfo->mipLevels must be less than or equal to "
Mike Weiblena6666382017-01-05 15:16:11 -07002649 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1. %s",
2650 validation_error_map[VALIDATION_ERROR_02131]);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002651 }
2652
2653 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2654 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2655 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2656 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski181ec3a2016-12-14 13:37:04 -07002657 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2658 VALIDATION_ERROR_02160, LayerName,
2659 "vkCreateImage: if pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2660 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT. %s",
2661 validation_error_map[VALIDATION_ERROR_02160]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002662 }
Dave Houlton7e679e22017-01-23 16:37:04 -07002663
2664 // Check for combinations of attributes that are incompatible with having VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set
2665 if ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) != 0) {
2666 // Linear tiling is unsupported
2667 if (VK_IMAGE_TILING_LINEAR == pCreateInfo->tiling) {
Mark Young0f183a82017-02-28 09:58:04 -07002668 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2669 INVALID_USAGE, LayerName,
2670 "vkCreateImage: if pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT "
2671 "then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
Dave Houlton7e679e22017-01-23 16:37:04 -07002672 }
2673
2674 // Sparse 1D image isn't valid
2675 if (VK_IMAGE_TYPE_1D == pCreateInfo->imageType) {
2676 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
Mark Young0f183a82017-02-28 09:58:04 -07002677 VALIDATION_ERROR_02352, LayerName,
2678 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 1D image. %s",
2679 validation_error_map[VALIDATION_ERROR_02352]);
Dave Houlton7e679e22017-01-23 16:37:04 -07002680 }
2681
Dave Houlton7e679e22017-01-23 16:37:04 -07002682 // Sparse 2D image when device doesn't support it
2683 if ((VK_FALSE == device_data->physical_device_features.sparseResidencyImage2D) &&
2684 (VK_IMAGE_TYPE_2D == pCreateInfo->imageType)) {
2685 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2686 VALIDATION_ERROR_02144, LayerName,
2687 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 2D image if corresponding "
2688 "feature is not enabled on the device. %s",
2689 validation_error_map[VALIDATION_ERROR_02144]);
2690 }
2691
2692 // Sparse 3D image when device doesn't support it
2693 if ((VK_FALSE == device_data->physical_device_features.sparseResidencyImage3D) &&
2694 (VK_IMAGE_TYPE_3D == pCreateInfo->imageType)) {
2695 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2696 VALIDATION_ERROR_02145, LayerName,
2697 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 3D image if corresponding "
2698 "feature is not enabled on the device. %s",
2699 validation_error_map[VALIDATION_ERROR_02145]);
2700 }
2701
2702 // Multi-sample 2D image when device doesn't support it
2703 if (VK_IMAGE_TYPE_2D == pCreateInfo->imageType) {
2704 if ((VK_FALSE == device_data->physical_device_features.sparseResidency2Samples) &&
2705 (VK_SAMPLE_COUNT_2_BIT == pCreateInfo->samples)) {
2706 skip |= log_msg(
2707 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2708 VALIDATION_ERROR_02146, LayerName,
2709 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 2-sample image if corresponding "
2710 "feature is not enabled on the device. %s",
2711 validation_error_map[VALIDATION_ERROR_02146]);
2712 } else if ((VK_FALSE == device_data->physical_device_features.sparseResidency4Samples) &&
2713 (VK_SAMPLE_COUNT_4_BIT == pCreateInfo->samples)) {
2714 skip |= log_msg(
2715 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2716 VALIDATION_ERROR_02147, LayerName,
2717 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 4-sample image if corresponding "
2718 "feature is not enabled on the device. %s",
2719 validation_error_map[VALIDATION_ERROR_02147]);
2720 } else if ((VK_FALSE == device_data->physical_device_features.sparseResidency8Samples) &&
2721 (VK_SAMPLE_COUNT_8_BIT == pCreateInfo->samples)) {
2722 skip |= log_msg(
2723 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2724 VALIDATION_ERROR_02148, LayerName,
2725 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 8-sample image if corresponding "
2726 "feature is not enabled on the device. %s",
2727 validation_error_map[VALIDATION_ERROR_02148]);
2728 } else if ((VK_FALSE == device_data->physical_device_features.sparseResidency16Samples) &&
2729 (VK_SAMPLE_COUNT_16_BIT == pCreateInfo->samples)) {
2730 skip |= log_msg(
2731 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2732 VALIDATION_ERROR_02149, LayerName,
2733 "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 16-sample image if corresponding "
2734 "feature is not enabled on the device. %s",
2735 validation_error_map[VALIDATION_ERROR_02149]);
2736 }
2737 }
2738 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002739 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002740
Chris Forbes04b61da2016-11-03 09:53:59 +13002741 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002742 result = device_data->dispatch_table.CreateImage(device, pCreateInfo, pAllocator, pImage);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002743
Dustin Gravesf8032f22016-05-11 18:31:44 -06002744 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002745 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002746
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002747 return result;
2748}
2749
Chia-I Wu01ca2372016-05-13 14:37:49 +08002750VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002751 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002752 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002753 assert(my_data != NULL);
2754
Chris Forbes04b61da2016-11-03 09:53:59 +13002755 skip |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002756
Chris Forbes04b61da2016-11-03 09:53:59 +13002757 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002758 my_data->dispatch_table.DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002759 }
2760}
2761
Mike Weiblen37166272017-01-05 15:11:00 -07002762static bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002763 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002764 if (pSubresource != nullptr) {
2765 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2766 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002767 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 -06002768 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002769 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2770 return false;
2771 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002772 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002773
2774 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002775}
2776
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002777VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2778 VkSubresourceLayout *pLayout) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002779 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002780 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002781 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002782
Chris Forbes04b61da2016-11-03 09:53:59 +13002783 skip |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002784
Chris Forbes04b61da2016-11-03 09:53:59 +13002785 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002786 PreGetImageSubresourceLayout(device, pSubresource);
2787
Chris Forbese58c9fe2016-11-24 14:44:17 +13002788 my_data->dispatch_table.GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002789 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002790}
2791
Chia-I Wu01ca2372016-05-13 14:37:49 +08002792VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2793 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002794 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002795 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002796 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002797 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002798 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002799
Chris Forbes04b61da2016-11-03 09:53:59 +13002800 skip |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002801
Dustin Graves0b70a632016-04-27 17:44:56 -06002802 if (pCreateInfo != nullptr) {
2803 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002804 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2805 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002806 skip |=
2807 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2808 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2809 "pCreateInfo->subresourceRange.layerCount must be 1",
2810 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
Dustin Graves0b70a632016-04-27 17:44:56 -06002811 }
2812 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002813 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2814 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2815 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002816 skip |=
2817 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2818 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2819 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2820 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
Dustin Graves0b70a632016-04-27 17:44:56 -06002821 }
2822 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002823 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2824 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002825 skip |=
2826 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2827 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2828 "pCreateInfo->subresourceRange.layerCount must be 6");
Dustin Graves0b70a632016-04-27 17:44:56 -06002829 }
2830 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002831 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2832 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002833 skip |=
2834 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2835 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2836 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
Dustin Graves0b70a632016-04-27 17:44:56 -06002837 }
Mark Lobodzinski3d7e6b52017-02-28 13:45:20 -07002838 if (!my_data->physical_device_features.imageCubeArray) {
2839 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2840 LayerName, "vkCreateImageView: Device feature imageCubeArray not enabled.");
2841 }
Dustin Graves0b70a632016-04-27 17:44:56 -06002842 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2843 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002844 skip |=
2845 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2846 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2847 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
Dustin Graves0b70a632016-04-27 17:44:56 -06002848 }
2849
Dustin Graves2a80dc62016-07-12 13:57:02 -06002850 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2851 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002852 skip |=
2853 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2854 "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2855 "pCreateInfo->subresourceRange.layerCount must be 1");
Dustin Graves0b70a632016-04-27 17:44:56 -06002856 }
2857 }
2858 }
2859
Chris Forbes04b61da2016-11-03 09:53:59 +13002860 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002861 result = my_data->dispatch_table.CreateImageView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002862
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002863 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002864 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002865
2866 return result;
2867}
2868
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002869VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002870 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002871 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002872 assert(my_data != NULL);
2873
Chris Forbes04b61da2016-11-03 09:53:59 +13002874 skip |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002875
Chris Forbes04b61da2016-11-03 09:53:59 +13002876 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002877 my_data->dispatch_table.DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002878 }
2879}
2880
Chia-I Wu01ca2372016-05-13 14:37:49 +08002881VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002882 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002883 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002884 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002885 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002886 assert(my_data != NULL);
2887
Chris Forbes04b61da2016-11-03 09:53:59 +13002888 skip |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002889
Chris Forbes04b61da2016-11-03 09:53:59 +13002890 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002891 result = my_data->dispatch_table.CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002892
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002893 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002894 }
2895
Michael Lentine03d8e572015-09-15 14:59:14 -05002896 return result;
2897}
2898
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002899VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2900 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002901 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002902 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002903 assert(my_data != NULL);
2904
Chris Forbes04b61da2016-11-03 09:53:59 +13002905 skip |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002906
Chris Forbes04b61da2016-11-03 09:53:59 +13002907 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002908 my_data->dispatch_table.DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002909 }
2910}
2911
Chia-I Wu01ca2372016-05-13 14:37:49 +08002912VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002913 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002914 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002915 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002916 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002917 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002918
Chris Forbes04b61da2016-11-03 09:53:59 +13002919 skip |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002920
Chris Forbes04b61da2016-11-03 09:53:59 +13002921 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002922 result = my_data->dispatch_table.CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002923
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002924 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002925 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002926
2927 return result;
2928}
2929
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002930VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2931 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002932 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002933 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002934 assert(my_data != NULL);
2935
Chris Forbes04b61da2016-11-03 09:53:59 +13002936 skip |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002937
Chris Forbes04b61da2016-11-03 09:53:59 +13002938 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002939 my_data->dispatch_table.DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002940 }
2941}
2942
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002943VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2944 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002945 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002946 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002947 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002948 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002949
Chris Forbes04b61da2016-11-03 09:53:59 +13002950 skip |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002951
Chris Forbes04b61da2016-11-03 09:53:59 +13002952 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002953 result = my_data->dispatch_table.GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002954
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002955 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002956 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002957
2958 return result;
2959}
2960
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002961VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2962 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002963 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002964 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002965 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002966 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002967
Chris Forbes04b61da2016-11-03 09:53:59 +13002968 skip |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002969
Chris Forbes04b61da2016-11-03 09:53:59 +13002970 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002971 result = my_data->dispatch_table.MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002972
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002973 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002974 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002975
2976 return result;
2977}
2978
Mike Weiblen37166272017-01-05 15:11:00 -07002979static bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002980 layer_data *data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07002981 bool skip = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002982
2983 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002984 if (pCreateInfos != nullptr) {
Maks Naumov34f52a12016-12-28 01:15:17 +02002985 if (pCreateInfos->flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002986 if (pCreateInfos->basePipelineIndex != -1) {
2987 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07002988 skip |= log_msg(
2989 data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2990 VALIDATION_ERROR_00526, LayerName,
2991 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2992 "pCreateInfos->flags "
2993 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1. %s",
2994 validation_error_map[VALIDATION_ERROR_00526]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002995 }
2996 }
2997
2998 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2999 if (pCreateInfos->basePipelineIndex != -1) {
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003000 skip |= log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13003001 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 -06003002 VALIDATION_ERROR_00528, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003003 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
3004 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
Mike Weiblen9858d962016-10-31 23:59:10 -06003005 "VK_NULL_HANDLE. %s",
3006 validation_error_map[VALIDATION_ERROR_00528]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003007 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07003008 }
3009 }
3010
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003011 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003012 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003013 skip |=
3014 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3015 UNRECOGNIZED_VALUE, LayerName,
3016 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
3017 "unrecognized enumerator");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003018 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06003019
3020 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
3021 (data->physical_device_features.fillModeNonSolid == false)) {
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003022 skip |= log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13003023 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 -06003024 DEVICE_FEATURE, LayerName,
3025 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
3026 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06003027 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003028 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07003029
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003030 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06003031 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003032 skip |= validate_string(data->report_data, "vkCreateGraphicsPipelines",
3033 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
3034 pCreateInfos[i].pStages[j].pName);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003035 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003036 }
3037
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003038 return skip;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003039}
3040
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003041VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3042 const VkGraphicsPipelineCreateInfo *pCreateInfos,
3043 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003044 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003045 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003046 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06003047 assert(device_data != nullptr);
3048 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003049
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003050 skip |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
3051 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003052
Dustin Gravesc900f572016-05-16 11:07:59 -06003053 if (pCreateInfos != nullptr) {
3054 for (uint32_t i = 0; i < createInfoCount; ++i) {
3055 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3056 if (pCreateInfos[i].pTessellationState == nullptr) {
3057 if (pCreateInfos[i].pStages != nullptr) {
3058 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
3059 // pTessellationState must not be NULL
3060 bool has_control = false;
3061 bool has_eval = false;
3062
3063 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
3064 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
3065 has_control = true;
3066 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
3067 has_eval = true;
3068 }
3069 }
3070
3071 if (has_control && has_eval) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003072 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 -06003073 __LINE__, VALIDATION_ERROR_00536, LayerName,
3074 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
3075 "control shader stage and a tessellation evaluation shader stage, "
3076 "pCreateInfos[%d].pTessellationState must not be NULL. %s",
3077 i, i, validation_error_map[VALIDATION_ERROR_00536]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003078 }
3079 }
Dustin Graves629259b2016-05-30 16:14:27 -06003080 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13003081 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003082 report_data, "vkCreateGraphicsPipelines",
3083 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
3084 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003085
Chris Forbes04b61da2016-11-03 09:53:59 +13003086 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003087 report_data, "vkCreateGraphicsPipelines",
3088 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
3089 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003090
3091 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003092 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 -06003093 __LINE__, VALIDATION_ERROR_00538, LayerName,
3094 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
3095 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO. %s",
3096 i, validation_error_map[VALIDATION_ERROR_00538]);
Dustin Graves629259b2016-05-30 16:14:27 -06003097 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003098 }
3099
3100 if (pCreateInfos[i].pViewportState == nullptr) {
3101 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
3102 // valid VkPipelineViewportStateCreateInfo structure
3103 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
3104 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003105 skip |= log_msg(
Dustin Gravesc900f572016-05-16 11:07:59 -06003106 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06003107 VALIDATION_ERROR_02113, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06003108 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
Mike Weiblen9858d962016-10-31 23:59:10 -06003109 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure. "
3110 "%s",
3111 i, i, validation_error_map[VALIDATION_ERROR_02113]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003112 }
3113 } else {
Mark Lobodzinskib81000e2016-12-16 13:08:00 -07003114 if (pCreateInfos[i].pViewportState->scissorCount != pCreateInfos[i].pViewportState->viewportCount) {
3115 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
3116 VALIDATION_ERROR_01434, LayerName,
3117 "Graphics Pipeline viewport count (%u) must match scissor count (%u). %s",
3118 pCreateInfos[i].pViewportState->viewportCount, pCreateInfos[i].pViewportState->scissorCount,
3119 validation_error_map[VALIDATION_ERROR_01434]);
3120 }
3121
Chris Forbes04b61da2016-11-03 09:53:59 +13003122 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003123 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3124 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
3125 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003126
Chris Forbes04b61da2016-11-03 09:53:59 +13003127 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003128 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
3129 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06003130 pCreateInfos[i].pViewportState->flags);
3131
Dustin Gravesc900f572016-05-16 11:07:59 -06003132 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003133 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003134 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3135 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
3136 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
3137 i);
Dustin Gravesc900f572016-05-16 11:07:59 -06003138 }
3139
Mark Lobodzinskid40eeb12016-12-18 09:43:01 -07003140 if (device_data->physical_device_features.multiViewport == false) {
3141 if (pCreateInfos[i].pViewportState->viewportCount != 1) {
3142 skip |=
3143 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3144 __LINE__, VALIDATION_ERROR_01430, LayerName,
3145 "vkCreateGraphicsPipelines: The multiViewport feature is not enabled, so "
3146 "pCreateInfos[%d].pViewportState->viewportCount must be 1 but is %d. %s",
3147 i, pCreateInfos[i].pViewportState->viewportCount, validation_error_map[VALIDATION_ERROR_01430]);
3148 }
3149 if (pCreateInfos[i].pViewportState->scissorCount != 1) {
3150 skip |=
3151 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3152 __LINE__, VALIDATION_ERROR_01431, LayerName,
3153 "vkCreateGraphicsPipelines: The multiViewport feature is not enabled, so "
3154 "pCreateInfos[%d].pViewportState->scissorCount must be 1 but is %d. %s",
3155 i, pCreateInfos[i].pViewportState->scissorCount, validation_error_map[VALIDATION_ERROR_01431]);
3156 }
3157 } else {
3158 if ((pCreateInfos[i].pViewportState->viewportCount < 1) ||
3159 (pCreateInfos[i].pViewportState->viewportCount > device_data->device_limits.maxViewports)) {
3160 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3161 __LINE__, VALIDATION_ERROR_01432, LayerName,
3162 "vkCreateGraphicsPipelines: multiViewport feature is enabled; "
3163 "pCreateInfos[%d].pViewportState->viewportCount is %d but must be between 1 and "
3164 "maxViewports (%d), inclusive. %s",
3165 i, pCreateInfos[i].pViewportState->viewportCount, device_data->device_limits.maxViewports,
3166 validation_error_map[VALIDATION_ERROR_01432]);
3167 }
3168 if ((pCreateInfos[i].pViewportState->scissorCount < 1) ||
3169 (pCreateInfos[i].pViewportState->scissorCount > device_data->device_limits.maxViewports)) {
3170 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3171 __LINE__, VALIDATION_ERROR_01433, LayerName,
3172 "vkCreateGraphicsPipelines: multiViewport feature is enabled; "
3173 "pCreateInfos[%d].pViewportState->scissorCount is %d but must be between 1 and "
3174 "maxViewports (%d), inclusive. %s",
3175 i, pCreateInfos[i].pViewportState->scissorCount, device_data->device_limits.maxViewports,
3176 validation_error_map[VALIDATION_ERROR_01433]);
3177 }
3178 }
3179
Dustin Gravesc900f572016-05-16 11:07:59 -06003180 if (pCreateInfos[i].pDynamicState != nullptr) {
3181 bool has_dynamic_viewport = false;
3182 bool has_dynamic_scissor = false;
3183
3184 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
3185 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
3186 has_dynamic_viewport = true;
3187 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
3188 has_dynamic_scissor = true;
3189 }
3190 }
3191
Dustin Gravesc900f572016-05-16 11:07:59 -06003192 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
3193 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
3194 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003195 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003196 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 -06003197 __LINE__, VALIDATION_ERROR_02110, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06003198 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06003199 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL. %s",
3200 i, i, validation_error_map[VALIDATION_ERROR_02110]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003201 }
3202
Dustin Gravesc900f572016-05-16 11:07:59 -06003203 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
3204 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
3205 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003206 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003207 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 -06003208 __LINE__, VALIDATION_ERROR_02111, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06003209 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06003210 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL. %s",
3211 i, i, validation_error_map[VALIDATION_ERROR_02111]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003212 }
3213 }
3214 }
3215
3216 if (pCreateInfos[i].pMultisampleState == nullptr) {
3217 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
3218 // a valid VkPipelineMultisampleStateCreateInfo structure
3219 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
3220 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
Mike Weiblen9858d962016-10-31 23:59:10 -06003221 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3222 __LINE__, VALIDATION_ERROR_02114, LayerName,
3223 "vkCreateGraphicsPipelines: if "
3224 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
3225 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL. %s",
3226 i, i, validation_error_map[VALIDATION_ERROR_02114]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003227 }
Dustin Graves629259b2016-05-30 16:14:27 -06003228 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13003229 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003230 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3231 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003232 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003233
Chris Forbes04b61da2016-11-03 09:53:59 +13003234 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003235 report_data, "vkCreateGraphicsPipelines",
3236 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
3237 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003238
Chris Forbes04b61da2016-11-03 09:53:59 +13003239 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003240 report_data, "vkCreateGraphicsPipelines",
3241 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
3242 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003243
Chris Forbes04b61da2016-11-03 09:53:59 +13003244 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003245 report_data, "vkCreateGraphicsPipelines",
3246 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3247 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3248 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3249 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003250
Chris Forbes04b61da2016-11-03 09:53:59 +13003251 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003252 report_data, "vkCreateGraphicsPipelines",
3253 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3254 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003255
Chris Forbes04b61da2016-11-03 09:53:59 +13003256 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003257 report_data, "vkCreateGraphicsPipelines",
3258 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3259 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003260
3261 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003262 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003263 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3264 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3265 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3266 i);
Dustin Graves629259b2016-05-30 16:14:27 -06003267 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003268 }
3269
3270 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003271 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003272 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003273 report_data, "vkCreateGraphicsPipelines",
3274 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3275 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003276
Chris Forbes04b61da2016-11-03 09:53:59 +13003277 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003278 report_data, "vkCreateGraphicsPipelines",
3279 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3280 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003281
Chris Forbes04b61da2016-11-03 09:53:59 +13003282 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003283 report_data, "vkCreateGraphicsPipelines",
3284 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3285 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003286
Chris Forbes04b61da2016-11-03 09:53:59 +13003287 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003288 report_data, "vkCreateGraphicsPipelines",
3289 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3290 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003291
Chris Forbes04b61da2016-11-03 09:53:59 +13003292 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003293 report_data, "vkCreateGraphicsPipelines",
3294 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3295 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3296 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003297
Chris Forbes04b61da2016-11-03 09:53:59 +13003298 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003299 report_data, "vkCreateGraphicsPipelines",
3300 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3301 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003302
Chris Forbes04b61da2016-11-03 09:53:59 +13003303 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003304 report_data, "vkCreateGraphicsPipelines",
3305 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3306 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003307
Chris Forbes04b61da2016-11-03 09:53:59 +13003308 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003309 report_data, "vkCreateGraphicsPipelines",
3310 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3311 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3312 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003313
Chris Forbes04b61da2016-11-03 09:53:59 +13003314 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003315 report_data, "vkCreateGraphicsPipelines",
3316 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3317 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3318 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003319
Chris Forbes04b61da2016-11-03 09:53:59 +13003320 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003321 report_data, "vkCreateGraphicsPipelines",
3322 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3323 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3324 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003325
Chris Forbes04b61da2016-11-03 09:53:59 +13003326 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003327 report_data, "vkCreateGraphicsPipelines",
3328 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3329 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3330 pCreateInfos[i].pDepthStencilState->front.compareOp);
3331
Chris Forbes04b61da2016-11-03 09:53:59 +13003332 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003333 report_data, "vkCreateGraphicsPipelines",
3334 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003335 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3336
Chris Forbes04b61da2016-11-03 09:53:59 +13003337 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003338 report_data, "vkCreateGraphicsPipelines",
3339 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003340 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3341
Chris Forbes04b61da2016-11-03 09:53:59 +13003342 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003343 report_data, "vkCreateGraphicsPipelines",
3344 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3345 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3346 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003347
Chris Forbes04b61da2016-11-03 09:53:59 +13003348 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003349 report_data, "vkCreateGraphicsPipelines",
3350 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3351 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3352 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003353
3354 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003355 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003356 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3357 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3358 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3359 i);
Dustin Graves629259b2016-05-30 16:14:27 -06003360 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003361 }
3362
3363 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3364 if (pCreateInfos[i].pColorBlendState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003365 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003366 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3367 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3368 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003369
Chris Forbes04b61da2016-11-03 09:53:59 +13003370 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003371 report_data, "vkCreateGraphicsPipelines",
3372 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3373 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003374
Chris Forbes04b61da2016-11-03 09:53:59 +13003375 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003376 report_data, "vkCreateGraphicsPipelines",
3377 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3378 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003379
Chris Forbes04b61da2016-11-03 09:53:59 +13003380 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003381 report_data, "vkCreateGraphicsPipelines",
3382 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3383 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3384 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003385
3386 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3387 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3388 ++attachmentIndex) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003389 skip |= validate_bool32(report_data, "vkCreateGraphicsPipelines",
3390 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3391 ParameterName::IndexVector{i, attachmentIndex}),
3392 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003393
Chris Forbes04b61da2016-11-03 09:53:59 +13003394 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003395 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003396 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3397 ParameterName::IndexVector{i, attachmentIndex}),
3398 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003399 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3400
Chris Forbes04b61da2016-11-03 09:53:59 +13003401 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003402 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003403 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3404 ParameterName::IndexVector{i, attachmentIndex}),
3405 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003406 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3407
Chris Forbes04b61da2016-11-03 09:53:59 +13003408 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003409 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3410 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3411 ParameterName::IndexVector{i, attachmentIndex}),
3412 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3413 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003414
Chris Forbes04b61da2016-11-03 09:53:59 +13003415 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003416 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003417 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3418 ParameterName::IndexVector{i, attachmentIndex}),
3419 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003420 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3421
Chris Forbes04b61da2016-11-03 09:53:59 +13003422 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003423 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003424 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3425 ParameterName::IndexVector{i, attachmentIndex}),
3426 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003427 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3428
Chris Forbes04b61da2016-11-03 09:53:59 +13003429 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003430 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3431 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3432 ParameterName::IndexVector{i, attachmentIndex}),
3433 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3434 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003435
Chris Forbes04b61da2016-11-03 09:53:59 +13003436 skip |=
Dustin Graves629259b2016-05-30 16:14:27 -06003437 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003438 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3439 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003440 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3441 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3442 }
3443 }
3444
Dustin Gravesc900f572016-05-16 11:07:59 -06003445 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003446 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003447 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3448 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3449 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3450 i);
Dustin Gravesc900f572016-05-16 11:07:59 -06003451 }
3452
3453 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3454 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003455 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003456 report_data, "vkCreateGraphicsPipelines",
3457 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003458 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3459 }
3460 }
3461 }
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003462 skip |= PreCreateGraphicsPipelines(device, pCreateInfos);
Dustin Gravesc900f572016-05-16 11:07:59 -06003463 }
3464
Chris Forbes04b61da2016-11-03 09:53:59 +13003465 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003466 result = device_data->dispatch_table.CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos,
3467 pAllocator, pPipelines);
Dustin Gravesc900f572016-05-16 11:07:59 -06003468 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003469 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003470
3471 return result;
3472}
3473
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003474bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003475 layer_data *data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003476 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003477 if (pCreateInfos != nullptr) {
3478 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003479 uint32_t i = 0;
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003480 skip |= validate_string(data->report_data, "vkCreateComputePipelines",
3481 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}),
3482 pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003483 }
3484
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003485 return skip;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003486}
3487
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003488VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3489 const VkComputePipelineCreateInfo *pCreateInfos,
3490 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003491 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003492 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003493 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003494 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003495
Chris Forbes04b61da2016-11-03 09:53:59 +13003496 skip |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003497 pAllocator, pPipelines);
Mark Lobodzinskiff6a86c2017-02-14 14:30:08 -07003498 skip |= PreCreateComputePipelines(device, pCreateInfos);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003499
Chris Forbes04b61da2016-11-03 09:53:59 +13003500 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003501 result = my_data->dispatch_table.CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
3502 pPipelines);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003503 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003504 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003505
3506 return result;
3507}
3508
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003509VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003510 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003511 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003512 assert(my_data != NULL);
3513
Chris Forbes04b61da2016-11-03 09:53:59 +13003514 skip |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003515
Chris Forbes04b61da2016-11-03 09:53:59 +13003516 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003517 my_data->dispatch_table.DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003518 }
3519}
3520
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003521VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3522 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003523 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003524 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003525 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003526 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003527
Chris Forbes04b61da2016-11-03 09:53:59 +13003528 skip |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003529
Chris Forbes04b61da2016-11-03 09:53:59 +13003530 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003531 result = my_data->dispatch_table.CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003532
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003533 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003534 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003535
3536 return result;
3537}
3538
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003539VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3540 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003541 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003542 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003543 assert(my_data != NULL);
3544
Chris Forbes04b61da2016-11-03 09:53:59 +13003545 skip |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003546
Chris Forbes04b61da2016-11-03 09:53:59 +13003547 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003548 my_data->dispatch_table.DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003549 }
3550}
3551
Chia-I Wu01ca2372016-05-13 14:37:49 +08003552VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3553 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003554 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003555 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003556 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06003557 assert(device_data != NULL);
3558 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003559
Chris Forbes04b61da2016-11-03 09:53:59 +13003560 skip |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003561
Dustin Gravesc900f572016-05-16 11:07:59 -06003562 if (pCreateInfo != nullptr) {
Mark Lobodzinski262f61f2017-03-01 15:52:49 -07003563
3564 if ((device_data->physical_device_features.samplerAnisotropy == false) && (pCreateInfo->maxAnisotropy != 1.0)) {
3565 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3566 DEVICE_FEATURE, LayerName,
3567 "vkCreateSampler(): The samplerAnisotropy feature is not enabled, so the maxAnisotropy member of the "
3568 "VkSamplerCreateInfo structure must be 1.0 but is %f.",
3569 pCreateInfo->maxAnisotropy);
3570 }
3571
Dustin Gravesc900f572016-05-16 11:07:59 -06003572 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3573 if (pCreateInfo->compareEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003574 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003575 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
Dustin Gravesc900f572016-05-16 11:07:59 -06003576 }
3577
3578 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3579 // valid VkBorderColor value
3580 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3581 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3582 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003583 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003584 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
Dustin Gravesc900f572016-05-16 11:07:59 -06003585 }
3586 }
3587
Chris Forbes04b61da2016-11-03 09:53:59 +13003588 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003589 result = device_data->dispatch_table.CreateSampler(device, pCreateInfo, pAllocator, pSampler);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003590
Dustin Gravesc900f572016-05-16 11:07:59 -06003591 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003592 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003593
3594 return result;
3595}
3596
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003597VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003598 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003599 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003600 assert(my_data != NULL);
3601
Chris Forbes04b61da2016-11-03 09:53:59 +13003602 skip |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003603
Chris Forbes04b61da2016-11-03 09:53:59 +13003604 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003605 my_data->dispatch_table.DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003606 }
3607}
3608
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003609VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3610 const VkAllocationCallbacks *pAllocator,
3611 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003612 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003613 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003614 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06003615 assert(device_data != nullptr);
3616 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003617
Chris Forbes04b61da2016-11-03 09:53:59 +13003618 skip |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003619
Dustin Gravesc900f572016-05-16 11:07:59 -06003620 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3621 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3622 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3623 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3624 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3625 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3626 // valid VkSampler handles
3627 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3628 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3629 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3630 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3631 ++descriptor_index) {
3632 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003633 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3634 __LINE__, REQUIRED_PARAMETER, LayerName,
3635 "vkCreateDescriptorSetLayout: required parameter "
3636 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3637 " specified as VK_NULL_HANDLE",
3638 i, descriptor_index);
Dustin Gravesc900f572016-05-16 11:07:59 -06003639 }
3640 }
3641 }
3642
3643 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3644 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3645 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
Mike Weiblena6666382017-01-05 15:16:11 -07003646 skip |= log_msg(
3647 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3648 VALIDATION_ERROR_00853, LayerName,
3649 "vkCreateDescriptorSetLayout(): if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3650 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values. %s",
3651 i, i, validation_error_map[VALIDATION_ERROR_00853]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003652 }
3653 }
3654 }
3655 }
3656
Chris Forbes04b61da2016-11-03 09:53:59 +13003657 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003658 result = device_data->dispatch_table.CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003659
Dustin Gravesc900f572016-05-16 11:07:59 -06003660 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003661 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003662
3663 return result;
3664}
3665
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003666VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3667 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003668 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003669 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003670 assert(my_data != NULL);
3671
Chris Forbes04b61da2016-11-03 09:53:59 +13003672 skip |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003673
Chris Forbes04b61da2016-11-03 09:53:59 +13003674 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003675 my_data->dispatch_table.DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003676 }
3677}
3678
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003679VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3680 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003681 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003682 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003683 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003684 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003685
Chris Forbes04b61da2016-11-03 09:53:59 +13003686 skip |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003687
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003688 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3689
Chris Forbes04b61da2016-11-03 09:53:59 +13003690 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003691 result = my_data->dispatch_table.CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003692
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003693 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003694 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003695
3696 return result;
3697}
3698
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003699VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3700 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003701 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003702 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003703 assert(my_data != NULL);
3704
Chris Forbes04b61da2016-11-03 09:53:59 +13003705 skip |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003706
Chris Forbes04b61da2016-11-03 09:53:59 +13003707 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003708 my_data->dispatch_table.DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003709 }
3710}
3711
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003712VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3713 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003714 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003715 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003716 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003717 assert(my_data != NULL);
3718
Chris Forbes04b61da2016-11-03 09:53:59 +13003719 skip |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003720
Chris Forbes04b61da2016-11-03 09:53:59 +13003721 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003722 result = my_data->dispatch_table.ResetDescriptorPool(device, descriptorPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06003723
3724 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3725 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003726
3727 return result;
3728}
3729
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003730VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3731 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003732 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003733 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003734 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003735 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003736
Chris Forbes04b61da2016-11-03 09:53:59 +13003737 skip |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003738
Chris Forbes04b61da2016-11-03 09:53:59 +13003739 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003740 result = my_data->dispatch_table.AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003741
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003742 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003743 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003744
3745 return result;
3746}
3747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003748VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003749 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003750 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003751 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003752 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06003753 assert(device_data != nullptr);
3754 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003755
Chris Forbes04b61da2016-11-03 09:53:59 +13003756 skip |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003757
Dustin Gravesc900f572016-05-16 11:07:59 -06003758 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3759 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3760 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003761 skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003762 pDescriptorSets, true, true);
Dustin Gravesc900f572016-05-16 11:07:59 -06003763
Chris Forbes04b61da2016-11-03 09:53:59 +13003764 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003765 result = device_data->dispatch_table.FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003766
Dustin Gravesc900f572016-05-16 11:07:59 -06003767 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003768 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003769
3770 return result;
3771}
3772
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003773VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3774 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3775 const VkCopyDescriptorSet *pDescriptorCopies) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003776 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003777 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06003778 assert(device_data != NULL);
3779 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003780
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003781 skip |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
3782 pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003783
Dustin Gravesc900f572016-05-16 11:07:59 -06003784 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3785 if (pDescriptorWrites != NULL) {
3786 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3787 // descriptorCount must be greater than 0
3788 if (pDescriptorWrites[i].descriptorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003789 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003790 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07003791 VALIDATION_ERROR_00957, LayerName,
3792 "vkUpdateDescriptorSets(): parameter pDescriptorWrites[%d].descriptorCount must be greater than 0. %s",
3793 i, validation_error_map[VALIDATION_ERROR_00957]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003794 }
3795
Dustin Gravesce68f082017-03-30 15:42:16 -06003796 // dstSet must be a valid VkDescriptorSet handle
3797 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
3798 ParameterName("pDescriptorWrites[%i].dstSet", ParameterName::IndexVector{i}),
3799 pDescriptorWrites[i].dstSet);
3800
Dustin Gravesc900f572016-05-16 11:07:59 -06003801 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3802 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3803 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3804 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3805 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3806 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3807 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3808 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3809 if (pDescriptorWrites[i].pImageInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003810 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblena6666382017-01-05 15:16:11 -07003811 __LINE__, VALIDATION_ERROR_00939, LayerName,
3812 "vkUpdateDescriptorSets(): if pDescriptorWrites[%d].descriptorType is "
3813 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3814 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3815 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL. %s",
3816 i, i, validation_error_map[VALIDATION_ERROR_00939]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003817 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3818 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3819 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3820 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3821 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3822 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003823 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003824 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3825 ParameterName::IndexVector{i, descriptor_index}),
3826 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
Chris Forbes04b61da2016-11-03 09:53:59 +13003827 skip |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003828 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3829 ParameterName::IndexVector{i, descriptor_index}),
3830 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3831 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
Dustin Gravesc900f572016-05-16 11:07:59 -06003832 }
3833 }
3834 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3835 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3836 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3837 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3838 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3839 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3840 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3841 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003842 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblena6666382017-01-05 15:16:11 -07003843 __LINE__, VALIDATION_ERROR_00941, LayerName,
3844 "vkUpdateDescriptorSets(): if pDescriptorWrites[%d].descriptorType is "
3845 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3846 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3847 "pDescriptorWrites[%d].pBufferInfo must not be NULL. %s",
3848 i, i, validation_error_map[VALIDATION_ERROR_00941]);
Dustin Graves629259b2016-05-30 16:14:27 -06003849 } else {
3850 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003851 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003852 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3853 ParameterName::IndexVector{i, descriptorIndex}),
3854 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
Dustin Graves629259b2016-05-30 16:14:27 -06003855 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003856 }
3857 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3858 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3859 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3860 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3861 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003862 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblena6666382017-01-05 15:16:11 -07003863 __LINE__, VALIDATION_ERROR_00940, LayerName,
3864 "vkUpdateDescriptorSets(): if pDescriptorWrites[%d].descriptorType is "
3865 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3866 "pDescriptorWrites[%d].pTexelBufferView must not be NULL. %s",
3867 i, i, validation_error_map[VALIDATION_ERROR_00940]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003868 } else {
3869 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3870 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003871 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003872 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3873 ParameterName::IndexVector{i, descriptor_index}),
3874 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003875 }
3876 }
3877 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003878
3879 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3880 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3881 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3882 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3883 if (pDescriptorWrites[i].pBufferInfo != NULL) {
Dave Houlton1d2022c2017-03-29 11:43:58 -06003884 if (SafeModulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
Mike Weiblena6666382017-01-05 15:16:11 -07003885 skip |= log_msg(
3886 device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
3887 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, VALIDATION_ERROR_00944, LayerName,
3888 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3889 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64 ". %s",
3890 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment,
3891 validation_error_map[VALIDATION_ERROR_00944]);
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003892 }
3893 }
3894 }
3895 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3896 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3897 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3898 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3899 if (pDescriptorWrites[i].pBufferInfo != NULL) {
Dave Houlton1d2022c2017-03-29 11:43:58 -06003900 if (SafeModulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
Mike Weiblena6666382017-01-05 15:16:11 -07003901 skip |= log_msg(
3902 device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
3903 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, VALIDATION_ERROR_00945, LayerName,
3904 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3905 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64 ". %s",
3906 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment,
3907 validation_error_map[VALIDATION_ERROR_00945]);
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003908 }
3909 }
3910 }
3911 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003912 }
3913 }
3914
Chris Forbes04b61da2016-11-03 09:53:59 +13003915 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003916 device_data->dispatch_table.UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
3917 pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003918 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003919}
3920
Chia-I Wu01ca2372016-05-13 14:37:49 +08003921VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003922 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003923 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003924 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003925 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003926 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003927
Chris Forbes04b61da2016-11-03 09:53:59 +13003928 skip |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003929
Chris Forbes04b61da2016-11-03 09:53:59 +13003930 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003931 result = my_data->dispatch_table.CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003932
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003933 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003934 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003935
3936 return result;
3937}
3938
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003939VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003940 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003941 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003942 assert(my_data != NULL);
3943
Chris Forbes04b61da2016-11-03 09:53:59 +13003944 skip |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003945
Chris Forbes04b61da2016-11-03 09:53:59 +13003946 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003947 my_data->dispatch_table.DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003948 }
3949}
3950
Mike Weiblen37166272017-01-05 15:11:00 -07003951static bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003952 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003953 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3954
Mark Lobodzinskie907fe42017-01-27 14:50:23 -07003955 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
3956 if (pCreateInfo->pAttachments[i].format == VK_FORMAT_UNDEFINED) {
3957 std::stringstream ss;
3958 ss << "vkCreateRenderPass: pCreateInfo->pAttachments[" << i << "].format is VK_FORMAT_UNDEFINED. "
3959 << validation_error_map[VALIDATION_ERROR_00336];
Jeremy Hayes632e0ab2017-02-09 13:32:28 -07003960 skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
Mark Lobodzinskie907fe42017-01-27 14:50:23 -07003961 VALIDATION_ERROR_00336, "IMAGE", "%s", ss.str().c_str());
3962 }
3963 }
3964
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003965 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3966 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
Mike Weiblena6666382017-01-05 15:16:11 -07003967 skip |=
3968 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3969 VALIDATION_ERROR_00348, "DL", "Cannot create a render pass with %d color attachments. Max is %d. %s",
3970 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments,
3971 validation_error_map[VALIDATION_ERROR_00348]);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003972 }
3973 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003974 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003975}
3976
Chia-I Wu01ca2372016-05-13 14:37:49 +08003977VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003978 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003979 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003980 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003981 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003982 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003983
Chris Forbes04b61da2016-11-03 09:53:59 +13003984 skip |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3985 skip |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003986
Chris Forbes04b61da2016-11-03 09:53:59 +13003987 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003988 result = my_data->dispatch_table.CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003989
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003990 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003991 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003992
3993 return result;
3994}
3995
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003996VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003997 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003998 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003999 assert(my_data != NULL);
4000
Chris Forbes04b61da2016-11-03 09:53:59 +13004001 skip |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07004002
Chris Forbes04b61da2016-11-03 09:53:59 +13004003 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004004 my_data->dispatch_table.DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07004005 }
4006}
4007
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004008VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004009 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004010 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004011 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004012
Chris Forbes04b61da2016-11-03 09:53:59 +13004013 skip |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004014
Chris Forbes04b61da2016-11-03 09:53:59 +13004015 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004016 my_data->dispatch_table.GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004017 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004018}
4019
Chia-I Wu01ca2372016-05-13 14:37:49 +08004020VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004021 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004022 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004023 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004024 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004025 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004026
Chris Forbes04b61da2016-11-03 09:53:59 +13004027 skip |=
Dustin Gravesde628532016-04-21 16:30:17 -06004028 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06004029
Chris Forbes04b61da2016-11-03 09:53:59 +13004030 skip |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004031
Chris Forbes04b61da2016-11-03 09:53:59 +13004032 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004033 result = my_data->dispatch_table.CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004034
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06004035 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004036 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004037
4038 return result;
4039}
4040
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004041VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004042 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004043 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07004044 assert(my_data != NULL);
4045
Chris Forbes04b61da2016-11-03 09:53:59 +13004046 skip |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07004047
Chris Forbes04b61da2016-11-03 09:53:59 +13004048 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004049 my_data->dispatch_table.DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07004050 }
4051}
4052
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004053VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004054 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004055 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004056 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06004057 assert(my_data != NULL);
4058
Chris Forbes04b61da2016-11-03 09:53:59 +13004059 skip |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004060
Chris Forbes04b61da2016-11-03 09:53:59 +13004061 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004062 result = my_data->dispatch_table.ResetCommandPool(device, commandPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004063
4064 validate_result(my_data->report_data, "vkResetCommandPool", result);
4065 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004066
4067 return result;
4068}
4069
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004070VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
4071 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004072 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004073 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004074 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004075 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004076
Chris Forbes04b61da2016-11-03 09:53:59 +13004077 skip |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004078
Chris Forbes04b61da2016-11-03 09:53:59 +13004079 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004080 result = my_data->dispatch_table.AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004081
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06004082 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004083 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004084
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004085 return result;
4086}
4087
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004088VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08004089 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004090 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004091 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06004092 assert(device_data != nullptr);
4093 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004094
Chris Forbes04b61da2016-11-03 09:53:59 +13004095 skip |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004096
Dustin Gravesc900f572016-05-16 11:07:59 -06004097 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
4098 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
4099 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13004100 skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004101 pCommandBuffers, true, true);
Dustin Gravesc900f572016-05-16 11:07:59 -06004102
Chris Forbes04b61da2016-11-03 09:53:59 +13004103 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004104 device_data->dispatch_table.FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07004105 }
4106}
4107
Mike Weiblen37166272017-01-05 15:11:00 -07004108static bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004109 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004110 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
4111
4112 if (pInfo != NULL) {
Chris Forbesc5554a52016-11-24 14:45:16 +13004113 if ((dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Mike Weiblena6666382017-01-05 15:16:11 -07004114 skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
4115 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, VALIDATION_ERROR_00116, LayerName,
4116 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
4117 "inheritedQueries. %s",
4118 validation_error_map[VALIDATION_ERROR_00116]);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004119 }
Mark Lobodzinski38df4562016-12-15 13:06:55 -07004120 // VALIDATION_ERROR_00117 check
4121 if ((dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
4122 skip |= validate_flags(dev_data->report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
4123 "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pInfo->queryFlags, false);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004124 }
4125 }
Chris Forbes04b61da2016-11-03 09:53:59 +13004126 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004127}
4128
4129VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004130 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004131 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004132 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06004133 assert(device_data != nullptr);
4134 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004135
Chris Forbes04b61da2016-11-03 09:53:59 +13004136 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004137
Dustin Gravesc900f572016-05-16 11:07:59 -06004138 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
4139 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13004140 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004141 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
4142 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
Dustin Gravesc900f572016-05-16 11:07:59 -06004143
4144 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004145 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004146 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06004147
Chris Forbes04b61da2016-11-03 09:53:59 +13004148 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004149 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06004150
Dustin Gravesc900f572016-05-16 11:07:59 -06004151 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13004152 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06004153 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
4154
4155 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13004156 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004157 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
4158 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
Dustin Gravesc900f572016-05-16 11:07:59 -06004159 }
4160
Chris Forbes04b61da2016-11-03 09:53:59 +13004161 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06004162
Chris Forbes04b61da2016-11-03 09:53:59 +13004163 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004164 result = device_data->dispatch_table.BeginCommandBuffer(commandBuffer, pBeginInfo);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004165
Dustin Gravesc900f572016-05-16 11:07:59 -06004166 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004167 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004168
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004169 return result;
4170}
4171
Chia-I Wu01ca2372016-05-13 14:37:49 +08004172VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004173 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06004174 assert(my_data != NULL);
4175
Chris Forbese58c9fe2016-11-24 14:44:17 +13004176 VkResult result = my_data->dispatch_table.EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004177
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06004178 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004179
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004180 return result;
4181}
4182
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004183VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06004184 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004185 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06004186 assert(my_data != NULL);
4187
Chris Forbes04b61da2016-11-03 09:53:59 +13004188 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004189
Chris Forbes04b61da2016-11-03 09:53:59 +13004190 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004191 result = my_data->dispatch_table.ResetCommandBuffer(commandBuffer, flags);
Dustin Graves16d18972016-05-09 17:36:57 -06004192
4193 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
4194 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004195
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004196 return result;
4197}
4198
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004199VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4200 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004201 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004202 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves29148ff2016-03-23 19:44:00 -06004203 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004204
Chris Forbes04b61da2016-11-03 09:53:59 +13004205 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06004206
Chris Forbes04b61da2016-11-03 09:53:59 +13004207 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004208 my_data->dispatch_table.CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06004209 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004210}
4211
Mark Lobodzinski147e6922017-03-01 15:45:52 -07004212static bool preCmdSetViewport(layer_data *my_data, uint32_t first_viewport, uint32_t viewport_count, const VkViewport *viewports) {
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004213 debug_report_data *report_data = my_data->report_data;
4214
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004215 bool skip =
4216 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004217
4218 if (viewport_count > 0 && viewports != nullptr) {
4219 const VkPhysicalDeviceLimits &limits = my_data->device_limits;
4220 for (uint32_t viewportIndex = 0; viewportIndex < viewport_count; ++viewportIndex) {
4221 const VkViewport &viewport = viewports[viewportIndex];
4222
Mark Lobodzinski147e6922017-03-01 15:45:52 -07004223 if (my_data->physical_device_features.multiViewport == false) {
4224 if (viewport_count != 1) {
4225 skip |= log_msg(
4226 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4227 DEVICE_FEATURE, LayerName,
4228 "vkCmdSetViewport(): The multiViewport feature is not enabled, so viewportCount must be 1 but is %d.",
4229 viewport_count);
4230 }
4231 if (first_viewport != 0) {
4232 skip |= log_msg(
4233 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4234 DEVICE_FEATURE, LayerName,
4235 "vkCmdSetViewport(): The multiViewport feature is not enabled, so firstViewport must be 0 but is %d.",
4236 first_viewport);
4237 }
4238 }
4239
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004240 if (viewport.width <= 0 || viewport.width > limits.maxViewportDimensions[0]) {
4241 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4242 VALIDATION_ERROR_01448, LayerName,
4243 "vkCmdSetViewport %d: width (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
4244 viewport.width, limits.maxViewportDimensions[0], validation_error_map[VALIDATION_ERROR_01448]);
4245 }
4246
4247 bool invalid_height = (viewport.height <= 0 || viewport.height > limits.maxViewportDimensions[1]);
Mark Lobodzinski885790e2017-03-09 11:54:48 -07004248 if ((my_data->enables.amd_negative_viewport_height || my_data->enables.khr_maintenance1) && (viewport.height < 0)) {
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004249 // VALIDATION_ERROR_01790
4250 invalid_height = false;
4251 }
4252 if (invalid_height) {
4253 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4254 VALIDATION_ERROR_01449, LayerName,
4255 "vkCmdSetViewport %d: height (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
4256 viewport.height, limits.maxViewportDimensions[1], validation_error_map[VALIDATION_ERROR_01449]);
4257 }
4258
4259 if (viewport.x < limits.viewportBoundsRange[0] || viewport.x > limits.viewportBoundsRange[1]) {
4260 skip |=
4261 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4262 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: x (%f) exceeds permitted bounds (%f,%f). %s",
4263 viewportIndex, viewport.x, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
4264 validation_error_map[VALIDATION_ERROR_01450]);
4265 }
4266
4267 if (viewport.y < limits.viewportBoundsRange[0] || viewport.y > limits.viewportBoundsRange[1]) {
4268 skip |=
4269 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4270 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: y (%f) exceeds permitted bounds (%f,%f). %s",
4271 viewportIndex, viewport.y, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
4272 validation_error_map[VALIDATION_ERROR_01450]);
4273 }
4274
4275 if (viewport.x + viewport.width > limits.viewportBoundsRange[1]) {
4276 skip |=
4277 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4278 VALIDATION_ERROR_01451, LayerName,
4279 "vkCmdSetViewport %d: x (%f) + width (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.x,
4280 viewport.width, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01451]);
4281 }
4282
4283 if (viewport.y + viewport.height > limits.viewportBoundsRange[1]) {
4284 skip |=
4285 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4286 VALIDATION_ERROR_01452, LayerName,
4287 "vkCmdSetViewport %d: y (%f) + height (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.y,
4288 viewport.height, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01452]);
4289 }
4290 }
4291 }
4292
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004293 return skip;
4294}
4295
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004296VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4297 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004298 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004299 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004300 assert(my_data != NULL);
4301
Mark Lobodzinski147e6922017-03-01 15:45:52 -07004302 skip |= preCmdSetViewport(my_data, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004303
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004304 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004305 my_data->dispatch_table.CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004306 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004307}
4308
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004309VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
4310 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004311 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004312 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004313 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004314 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07004315
Chris Forbes04b61da2016-11-03 09:53:59 +13004316 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004317
Mark Lobodzinski147e6922017-03-01 15:45:52 -07004318 if (my_data->physical_device_features.multiViewport == false) {
4319 if (scissorCount != 1) {
4320 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4321 DEVICE_FEATURE, LayerName,
4322 "vkCmdSetScissor(): The multiViewport feature is not enabled, so scissorCount must be 1 but is %d.",
4323 scissorCount);
4324 }
4325 if (firstScissor != 0) {
4326 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4327 DEVICE_FEATURE, LayerName,
4328 "vkCmdSetScissor(): The multiViewport feature is not enabled, so firstScissor must be 0 but is %d.",
4329 firstScissor);
4330 }
4331 }
4332
Mike Weiblena4742dc2016-10-31 11:05:56 -06004333 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4334 const VkRect2D &pScissor = pScissors[scissorIndex];
4335
4336 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004337 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004338 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4339 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004340 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004341 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004342 VALIDATION_ERROR_01490, LayerName,
4343 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4344 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004345 }
4346
4347 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004348 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004349 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4350 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004351 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004352 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004353 VALIDATION_ERROR_01491, LayerName,
4354 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4355 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004356 }
4357 }
4358
Chris Forbes04b61da2016-11-03 09:53:59 +13004359 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004360 my_data->dispatch_table.CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004361 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004362}
4363
Chia-I Wu01ca2372016-05-13 14:37:49 +08004364VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004365 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13004366 my_data->dispatch_table.CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004367}
4368
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004369VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4370 float depthBiasSlopeFactor) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004371 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13004372 my_data->dispatch_table.CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004373}
4374
Chia-I Wu01ca2372016-05-13 14:37:49 +08004375VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004376 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004377 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004378 assert(my_data != NULL);
4379
Chris Forbes04b61da2016-11-03 09:53:59 +13004380 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004381
Chris Forbes04b61da2016-11-03 09:53:59 +13004382 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004383 my_data->dispatch_table.CmdSetBlendConstants(commandBuffer, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004384 }
Cody Northrop12365112015-08-17 11:10:49 -06004385}
4386
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004387VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004388 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13004389 my_data->dispatch_table.CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004390}
4391
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004392VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4393 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004394 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004395 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves46948e62016-05-06 10:16:06 -06004396 assert(my_data != NULL);
4397
Chris Forbes04b61da2016-11-03 09:53:59 +13004398 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004399
Chris Forbes04b61da2016-11-03 09:53:59 +13004400 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004401 my_data->dispatch_table.CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004402 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004403}
4404
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004405VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004406 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004407 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves46948e62016-05-06 10:16:06 -06004408 assert(my_data != NULL);
4409
Chris Forbes04b61da2016-11-03 09:53:59 +13004410 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004411
Chris Forbes04b61da2016-11-03 09:53:59 +13004412 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004413 my_data->dispatch_table.CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004414 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004415}
4416
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004417VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004418 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004419 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves46948e62016-05-06 10:16:06 -06004420 assert(my_data != NULL);
4421
Chris Forbes04b61da2016-11-03 09:53:59 +13004422 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004423
Chris Forbes04b61da2016-11-03 09:53:59 +13004424 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004425 my_data->dispatch_table.CmdSetStencilReference(commandBuffer, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004426 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004427}
4428
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004429VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4430 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4431 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4432 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004433 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004434 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004435 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004436
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004437 skip |= parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet,
4438 descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004439
Chris Forbes04b61da2016-11-03 09:53:59 +13004440 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004441 my_data->dispatch_table.CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4442 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004443 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004444}
4445
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004446VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4447 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004448 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004449 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves29148ff2016-03-23 19:44:00 -06004450 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004451
Chris Forbes04b61da2016-11-03 09:53:59 +13004452 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004453
Chris Forbes04b61da2016-11-03 09:53:59 +13004454 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004455 my_data->dispatch_table.CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004456 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004457}
4458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004459VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4460 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004461 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004462 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004463 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004464
Chris Forbes04b61da2016-11-03 09:53:59 +13004465 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004466
Chris Forbes04b61da2016-11-03 09:53:59 +13004467 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004468 my_data->dispatch_table.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004469 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004470}
4471
Mike Weiblen37166272017-01-05 15:11:00 -07004472static bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004473 uint32_t firstInstance) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004474 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004475 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004476 // 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 -07004477 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004478 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 -06004479 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004480 return false;
4481 }
4482
4483 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004484 // 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 -07004485 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004486 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 -06004487 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004488 return false;
4489 }
4490
4491 return true;
4492}
4493
Chia-I Wu01ca2372016-05-13 14:37:49 +08004494VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4495 uint32_t firstVertex, uint32_t firstInstance) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004496 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004497 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004498
Chris Forbese58c9fe2016-11-24 14:44:17 +13004499 my_data->dispatch_table.CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004500}
4501
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004502VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4503 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004504 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13004505 my_data->dispatch_table.CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004506}
4507
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004508VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4509 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004510 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004511 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004512 assert(my_data != NULL);
4513
Mark Lobodzinski33d8c9b2017-02-28 14:18:04 -07004514 if (!my_data->physical_device_features.multiDrawIndirect && ((count > 1))) {
4515 skip = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4516 DEVICE_FEATURE, LayerName,
4517 "CmdDrawIndirect(): Device feature multiDrawIndirect disabled: count must be 0 or 1 but is %d", count);
4518 }
Chris Forbes04b61da2016-11-03 09:53:59 +13004519 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004520
Chris Forbes04b61da2016-11-03 09:53:59 +13004521 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004522 my_data->dispatch_table.CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004523 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004524}
4525
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004526VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4527 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004528 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004529 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004530 assert(my_data != NULL);
Mark Lobodzinski33d8c9b2017-02-28 14:18:04 -07004531 if (!my_data->physical_device_features.multiDrawIndirect && ((count > 1))) {
4532 skip =
4533 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4534 DEVICE_FEATURE, LayerName,
4535 "CmdDrawIndexedIndirect(): Device feature multiDrawIndirect disabled: count must be 0 or 1 but is %d", count);
4536 }
Chris Forbes04b61da2016-11-03 09:53:59 +13004537 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004538
Chris Forbes04b61da2016-11-03 09:53:59 +13004539 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004540 my_data->dispatch_table.CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004541 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004542}
4543
Chia-I Wu01ca2372016-05-13 14:37:49 +08004544VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004545 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13004546 my_data->dispatch_table.CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004547}
4548
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004549VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004550 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004551 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004552 assert(my_data != NULL);
4553
Chris Forbes04b61da2016-11-03 09:53:59 +13004554 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004555
Chris Forbes04b61da2016-11-03 09:53:59 +13004556 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004557 my_data->dispatch_table.CmdDispatchIndirect(commandBuffer, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004558 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004559}
4560
Chia-I Wu01ca2372016-05-13 14:37:49 +08004561VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4562 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004563 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004564 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004565 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004566
Chris Forbes04b61da2016-11-03 09:53:59 +13004567 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004568
Chris Forbes04b61da2016-11-03 09:53:59 +13004569 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004570 my_data->dispatch_table.CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004571 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004572}
4573
Mike Weiblen37166272017-01-05 15:11:00 -07004574static bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004575 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004576 if (pRegions != nullptr) {
4577 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4578 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Mike Weiblena6666382017-01-05 15:16:11 -07004579 log_msg(
4580 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4581 VALIDATION_ERROR_01225, LayerName,
4582 "vkCmdCopyImage() parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator. %s",
4583 validation_error_map[VALIDATION_ERROR_01225]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004584 return false;
4585 }
4586 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4587 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Mike Weiblena6666382017-01-05 15:16:11 -07004588 log_msg(
4589 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4590 VALIDATION_ERROR_01225, LayerName,
4591 "vkCmdCopyImage() parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator. %s",
4592 validation_error_map[VALIDATION_ERROR_01225]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004593 return false;
4594 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004595 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004596
4597 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004598}
4599
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004600VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4601 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4602 const VkImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004603 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004604 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004605 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004606
Chris Forbes04b61da2016-11-03 09:53:59 +13004607 skip |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004608 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004609
Chris Forbes04b61da2016-11-03 09:53:59 +13004610 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004611 PreCmdCopyImage(commandBuffer, pRegions);
4612
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004613 my_data->dispatch_table.CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
4614 pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004615 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004616}
4617
Mike Weiblen37166272017-01-05 15:11:00 -07004618static bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004619 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004620 if (pRegions != nullptr) {
4621 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4622 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004623 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 -06004624 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004625 "vkCmdBlitImage() parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004626 return false;
4627 }
4628 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4629 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004630 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 -06004631 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004632 "vkCmdBlitImage() parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004633 return false;
4634 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004635 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004636
4637 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004638}
4639
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004640VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4641 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4642 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004643 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004644 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004645 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004646
Chris Forbes04b61da2016-11-03 09:53:59 +13004647 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004648 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004649
Chris Forbes04b61da2016-11-03 09:53:59 +13004650 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004651 PreCmdBlitImage(commandBuffer, pRegions);
4652
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004653 my_data->dispatch_table.CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
4654 pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004655 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004656}
4657
Mike Weiblen37166272017-01-05 15:11:00 -07004658static bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004659 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004660 if (pRegions != nullptr) {
4661 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4662 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004663 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 -06004664 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004665 "vkCmdCopyBufferToImage() parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004666 "enumerator");
4667 return false;
4668 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004669 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004670
4671 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004672}
4673
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004674VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4675 VkImageLayout dstImageLayout, uint32_t regionCount,
4676 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004677 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004678 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004679 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004680
Chris Forbes04b61da2016-11-03 09:53:59 +13004681 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004682 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004683
Chris Forbes04b61da2016-11-03 09:53:59 +13004684 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004685 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4686
Chris Forbese58c9fe2016-11-24 14:44:17 +13004687 my_data->dispatch_table.CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004688 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004689}
4690
Mike Weiblen37166272017-01-05 15:11:00 -07004691static bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004692 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004693 if (pRegions != nullptr) {
4694 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4695 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004696 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 -06004697 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004698 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4699 "enumerator");
4700 return false;
4701 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004702 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004703
4704 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004705}
4706
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004707VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4708 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004709 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004710 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004711 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004712
Chris Forbes04b61da2016-11-03 09:53:59 +13004713 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004714 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004715
Chris Forbes04b61da2016-11-03 09:53:59 +13004716 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004717 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4718
Chris Forbese58c9fe2016-11-24 14:44:17 +13004719 my_data->dispatch_table.CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004720 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004721}
4722
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004723VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Mark Lobodzinskia2d93842017-02-08 16:28:18 -07004724 VkDeviceSize dataSize, const void *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004725 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004726 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004727 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004728
Chris Forbes04b61da2016-11-03 09:53:59 +13004729 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004730
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004731 if (dstOffset & 3) {
Mike Weiblena6666382017-01-05 15:16:11 -07004732 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4733 VALIDATION_ERROR_01147, LayerName,
4734 "vkCmdUpdateBuffer() parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4. %s",
4735 dstOffset, validation_error_map[VALIDATION_ERROR_01147]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004736 }
4737
4738 if ((dataSize <= 0) || (dataSize > 65536)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004739 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07004740 VALIDATION_ERROR_01148, LayerName, "vkCmdUpdateBuffer() parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4741 "), must be greater than zero and less than or equal to 65536. %s",
4742 dataSize, validation_error_map[VALIDATION_ERROR_01148]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004743 } else if (dataSize & 3) {
Mike Weiblena6666382017-01-05 15:16:11 -07004744 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4745 VALIDATION_ERROR_01149, LayerName,
4746 "vkCmdUpdateBuffer() parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4. %s",
4747 dataSize, validation_error_map[VALIDATION_ERROR_01149]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004748 }
4749
Chris Forbes04b61da2016-11-03 09:53:59 +13004750 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004751 my_data->dispatch_table.CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004752 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004753}
4754
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004755VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4756 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004757 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004758 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004759 assert(my_data != NULL);
4760
Chris Forbes04b61da2016-11-03 09:53:59 +13004761 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004762
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004763 if (dstOffset & 3) {
Mike Weiblena6666382017-01-05 15:16:11 -07004764 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4765 VALIDATION_ERROR_01133, LayerName,
4766 "vkCmdFillBuffer() parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4. %s",
4767 dstOffset, validation_error_map[VALIDATION_ERROR_01133]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004768 }
4769
4770 if (size != VK_WHOLE_SIZE) {
4771 if (size <= 0) {
Mike Weiblena6666382017-01-05 15:16:11 -07004772 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4773 VALIDATION_ERROR_01134, LayerName,
4774 "vkCmdFillBuffer() parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero. %s",
4775 size, validation_error_map[VALIDATION_ERROR_01134]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004776 } else if (size & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004777 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mike Weiblena6666382017-01-05 15:16:11 -07004778 VALIDATION_ERROR_01136, LayerName,
4779 "vkCmdFillBuffer() parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4. %s", size,
4780 validation_error_map[VALIDATION_ERROR_01136]);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004781 }
4782 }
4783
Chris Forbes04b61da2016-11-03 09:53:59 +13004784 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004785 my_data->dispatch_table.CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004786 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004787}
4788
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004789VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4790 const VkClearColorValue *pColor, uint32_t rangeCount,
4791 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004792 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004793 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004794 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004795
Chris Forbes04b61da2016-11-03 09:53:59 +13004796 skip |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004797
Chris Forbes04b61da2016-11-03 09:53:59 +13004798 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004799 my_data->dispatch_table.CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004800 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004801}
4802
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004803VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4804 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4805 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004806 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004807 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004808 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004809
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004810 skip |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil, rangeCount,
4811 pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004812
Chris Forbes04b61da2016-11-03 09:53:59 +13004813 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004814 my_data->dispatch_table.CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004815 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004816}
4817
Chia-I Wu01ca2372016-05-13 14:37:49 +08004818VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4819 const VkClearAttachment *pAttachments, uint32_t rectCount,
4820 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004821 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004822 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004823 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004824
Chris Forbes04b61da2016-11-03 09:53:59 +13004825 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004826
Chris Forbes04b61da2016-11-03 09:53:59 +13004827 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004828 my_data->dispatch_table.CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004829 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004830}
4831
Mike Weiblen37166272017-01-05 15:11:00 -07004832static bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004833 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004834 if (pRegions != nullptr) {
4835 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4836 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4837 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004838 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 -06004839 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004840 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4841 return false;
4842 }
4843 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4844 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4845 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004846 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 -06004847 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004848 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4849 return false;
4850 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004851 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004852
4853 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004854}
4855
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004856VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4857 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4858 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004859 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004860 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004861 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004862
Chris Forbes04b61da2016-11-03 09:53:59 +13004863 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004864 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004865
Chris Forbes04b61da2016-11-03 09:53:59 +13004866 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004867 PreCmdResolveImage(commandBuffer, pRegions);
4868
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004869 my_data->dispatch_table.CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
4870 pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004871 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004872}
4873
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004874VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004875 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004876 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004877 assert(my_data != NULL);
4878
Chris Forbes04b61da2016-11-03 09:53:59 +13004879 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004880
Chris Forbes04b61da2016-11-03 09:53:59 +13004881 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004882 my_data->dispatch_table.CmdSetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004883 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004884}
4885
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004886VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004887 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004888 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004889 assert(my_data != NULL);
4890
Chris Forbes04b61da2016-11-03 09:53:59 +13004891 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004892
Chris Forbes04b61da2016-11-03 09:53:59 +13004893 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004894 my_data->dispatch_table.CmdResetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004895 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004896}
4897
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004898VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4899 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4900 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4901 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4902 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004903 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004904 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004905 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004906
Chris Forbes04b61da2016-11-03 09:53:59 +13004907 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004908 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4909 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004910
Chris Forbes04b61da2016-11-03 09:53:59 +13004911 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004912 my_data->dispatch_table.CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount,
4913 pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4914 imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004915 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004916}
4917
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004918VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4919 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4920 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4921 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4922 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004923 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004924 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004925 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004926
Chris Forbes04b61da2016-11-03 09:53:59 +13004927 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004928 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4929 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004930
Chris Forbes04b61da2016-11-03 09:53:59 +13004931 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004932 my_data->dispatch_table.CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount,
4933 pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
4934 imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004935 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004936}
4937
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004938VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4939 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004940 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004941 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004942 assert(my_data != NULL);
4943
Chris Forbes04b61da2016-11-03 09:53:59 +13004944 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004945
Chris Forbes04b61da2016-11-03 09:53:59 +13004946 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004947 my_data->dispatch_table.CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004948 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004949}
4950
Chia-I Wu01ca2372016-05-13 14:37:49 +08004951VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004952 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004953 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004954 assert(my_data != NULL);
4955
Chris Forbes04b61da2016-11-03 09:53:59 +13004956 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004957
Chris Forbes04b61da2016-11-03 09:53:59 +13004958 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004959 my_data->dispatch_table.CmdEndQuery(commandBuffer, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004960 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004961}
4962
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004963VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4964 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004965 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004966 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004967 assert(my_data != NULL);
4968
Chris Forbes04b61da2016-11-03 09:53:59 +13004969 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004970
Chris Forbes04b61da2016-11-03 09:53:59 +13004971 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004972 my_data->dispatch_table.CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004973 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004974}
4975
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004976bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4977 uint32_t slot) {
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004978 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004979
4980 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004981}
4982
Chia-I Wu01ca2372016-05-13 14:37:49 +08004983VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4984 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004985 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004986 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004987 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004988
Chris Forbes04b61da2016-11-03 09:53:59 +13004989 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004990
Chris Forbes04b61da2016-11-03 09:53:59 +13004991 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004992 my_data->dispatch_table.CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004993
4994 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4995 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004996}
4997
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004998VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4999 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
5000 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005001 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005002 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves20fd66f2016-04-18 18:33:21 -06005003 assert(my_data != NULL);
5004
Chris Forbes04b61da2016-11-03 09:53:59 +13005005 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005006 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06005007
Chris Forbes04b61da2016-11-03 09:53:59 +13005008 if (!skip) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005009 my_data->dispatch_table.CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset,
5010 stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06005011 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005012}
5013
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005014VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
5015 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005016 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005017 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07005018 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005019
Chris Forbes04b61da2016-11-03 09:53:59 +13005020 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005021
Chris Forbes04b61da2016-11-03 09:53:59 +13005022 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005023 my_data->dispatch_table.CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07005024 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005025}
5026
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005027VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
5028 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005029 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005030 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07005031 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005032
Chris Forbes04b61da2016-11-03 09:53:59 +13005033 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005034
Chris Forbes04b61da2016-11-03 09:53:59 +13005035 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005036 my_data->dispatch_table.CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07005037 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005038}
5039
Chia-I Wu01ca2372016-05-13 14:37:49 +08005040VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005041 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005042 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves29148ff2016-03-23 19:44:00 -06005043 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08005044
Chris Forbes04b61da2016-11-03 09:53:59 +13005045 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06005046
Chris Forbes04b61da2016-11-03 09:53:59 +13005047 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005048 my_data->dispatch_table.CmdNextSubpass(commandBuffer, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06005049 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005050}
5051
Chia-I Wu01ca2372016-05-13 14:37:49 +08005052VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005053 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Chris Forbese58c9fe2016-11-24 14:44:17 +13005054 my_data->dispatch_table.CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005055}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005056
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005057VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
5058 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005059 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005060 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07005061 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005062
Chris Forbes04b61da2016-11-03 09:53:59 +13005063 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08005064
Chris Forbes04b61da2016-11-03 09:53:59 +13005065 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005066 my_data->dispatch_table.CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07005067 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005068}
5069
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005070VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005071 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
5072}
5073
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005074VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5075 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005076 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
5077}
5078
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005079VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5080 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005081 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
5082 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
5083
5084 return VK_ERROR_LAYER_NOT_PRESENT;
5085}
5086
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005087VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
5088 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08005089 /* parameter_validation does not have any physical device extensions */
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005090 if (pLayerName && !strcmp(pLayerName, global_layer.layerName)) return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08005091
5092 assert(physicalDevice);
5093
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005094 return GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map)
Chris Forbes6444bba2016-11-24 14:15:23 +13005095 ->dispatch_table.EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005096}
5097
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005098static bool require_device_extension(layer_data *my_data, bool flag, char const *function_name, char const *extension_name) {
Mark Young39389872017-01-19 21:10:49 -07005099 if (!flag) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005100 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
5101 EXTENSION_NOT_ENABLED, LayerName,
5102 "%s() called even though the %s extension was not enabled for this VkDevice.", function_name,
5103 extension_name);
Chris Forbes448ebcb2016-11-03 09:29:52 +13005104 }
5105
5106 return false;
5107}
5108
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005109// WSI Extension Functions
5110
5111VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005112 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005113 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005114 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005115 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005116 assert(my_data != NULL);
5117
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005118 skip |= require_device_extension(my_data, my_data->enables.khr_swapchain_enabled, "vkCreateSwapchainKHR",
5119 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005120
Chris Forbes04b61da2016-11-03 09:53:59 +13005121 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005122
Chris Forbes04b61da2016-11-03 09:53:59 +13005123 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005124 result = my_data->dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005125
5126 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
5127 }
5128
5129 return result;
5130}
5131
5132VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005133 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005134 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005135 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005136 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005137 assert(my_data != NULL);
5138
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005139 skip |= require_device_extension(my_data, my_data->enables.khr_swapchain_enabled, "vkGetSwapchainImagesKHR",
5140 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005141
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005142 skip |= parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005143
Chris Forbes04b61da2016-11-03 09:53:59 +13005144 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005145 result = my_data->dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005146
5147 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
5148 }
5149
5150 return result;
5151}
5152
5153VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005154 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005155 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005156 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005157 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005158 assert(my_data != NULL);
5159
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005160 skip |= require_device_extension(my_data, my_data->enables.khr_swapchain_enabled, "vkAcquireNextImageKHR",
5161 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005162
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005163 skip |= parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005164
Chris Forbes04b61da2016-11-03 09:53:59 +13005165 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005166 result = my_data->dispatch_table.AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005167
5168 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
5169 }
5170
5171 return result;
5172}
5173
5174VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
5175 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005176 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005177 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(queue), layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005178 assert(my_data != NULL);
5179
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005180 skip |= require_device_extension(my_data, my_data->enables.khr_swapchain_enabled, "vkQueuePresentKHR",
5181 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005182
Chris Forbes04b61da2016-11-03 09:53:59 +13005183 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Tobin Ehlis13e9c142017-01-13 12:13:57 -07005184
5185 if (pPresentInfo && pPresentInfo->pNext) {
5186 // Verify ext struct
5187 struct std_header {
5188 VkStructureType sType;
5189 const void *pNext;
5190 };
5191 std_header *pnext = (std_header *)pPresentInfo->pNext;
5192 while (pnext) {
5193 if (VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR == pnext->sType) {
5194 skip |= require_device_extension(my_data, my_data->enables.incremental_present, "vkQueuePresentKHR",
5195 VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME);
5196 VkPresentRegionsKHR *present_regions = (VkPresentRegionsKHR *)pnext;
5197 if (present_regions->swapchainCount != pPresentInfo->swapchainCount) {
5198 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
5199 __LINE__, INVALID_USAGE, LayerName,
5200 "QueuePresentKHR(): pPresentInfo->swapchainCount has a value of %i"
5201 " but VkPresentRegionsKHR extension swapchainCount is %i. These values must be equal.",
5202 pPresentInfo->swapchainCount, present_regions->swapchainCount);
5203 }
5204 skip |= validate_struct_pnext(my_data->report_data, "QueuePresentKHR", "pCreateInfo->pNext->pNext", NULL,
5205 present_regions->pNext, 0, NULL, GeneratedHeaderVersion);
5206 skip |= validate_array(my_data->report_data, "QueuePresentKHR", "pCreateInfo->pNext->swapchainCount",
5207 "pCreateInfo->pNext->pRegions", present_regions->swapchainCount, present_regions->pRegions,
5208 true, false);
5209 for (uint32_t i = 0; i < present_regions->swapchainCount; ++i) {
5210 skip |=
5211 validate_array(my_data->report_data, "QueuePresentKHR", "pCreateInfo->pNext->pRegions[].rectangleCount",
5212 "pCreateInfo->pNext->pRegions[].pRectangles", present_regions->pRegions[i].rectangleCount,
5213 present_regions->pRegions[i].pRectangles, true, false);
5214 }
5215 }
5216 pnext = (std_header *)pnext->pNext;
5217 }
5218 }
5219
Chris Forbes04b61da2016-11-03 09:53:59 +13005220 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005221 result = my_data->dispatch_table.QueuePresentKHR(queue, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005222
5223 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
5224 }
5225
5226 return result;
5227}
5228
Chris Forbesbe5f5202016-11-02 18:34:25 +13005229VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005230 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005231 layer_data *my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005232 assert(my_data != NULL);
5233
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005234 skip |= require_device_extension(my_data, my_data->enables.khr_swapchain_enabled, "vkDestroySwapchainKHR",
5235 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005236
5237 /* No generated validation function for this call */
5238
Chris Forbes04b61da2016-11-03 09:53:59 +13005239 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005240 my_data->dispatch_table.DestroySwapchainKHR(device, swapchain, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005241 }
5242}
5243
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005244static bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name,
5245 char const *extension_name) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005246 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6be763e2016-11-24 12:42:33 +13005247 if (!(my_data->extensions.*flag)) {
Chris Forbes115f98c2016-11-03 09:51:48 +13005248 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
5249 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005250 "%s() called even though the %s extension was not enabled for this VkInstance.", function_name,
5251 extension_name);
Chris Forbes115f98c2016-11-03 09:51:48 +13005252 }
5253
5254 return false;
5255}
5256
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005257VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
5258 VkSurfaceKHR surface, VkBool32 *pSupported) {
5259 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005260 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005261 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005262 assert(my_data != NULL);
5263
Chris Forbes04b61da2016-11-03 09:53:59 +13005264 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005265 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13005266
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005267 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005268
Chris Forbes04b61da2016-11-03 09:53:59 +13005269 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005270 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005271
5272 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
5273 }
5274
5275 return result;
5276}
5277
5278VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
5279 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
5280 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005281 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005282 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005283 assert(my_data != NULL);
5284
Chris Forbes04b61da2016-11-03 09:53:59 +13005285 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005286 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13005287
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005288 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005289
Chris Forbes04b61da2016-11-03 09:53:59 +13005290 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005291 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005292
5293 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
5294 }
5295
5296 return result;
5297}
5298
5299VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
5300 uint32_t *pSurfaceFormatCount,
5301 VkSurfaceFormatKHR *pSurfaceFormats) {
5302 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005303 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005304 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005305 assert(my_data != NULL);
5306
Chris Forbes04b61da2016-11-03 09:53:59 +13005307 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005308 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13005309
Chris Forbes04b61da2016-11-03 09:53:59 +13005310 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005311 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005312
Chris Forbes04b61da2016-11-03 09:53:59 +13005313 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005314 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount,
5315 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005316
5317 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
5318 }
5319
5320 return result;
5321}
5322
5323VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
5324 uint32_t *pPresentModeCount,
5325 VkPresentModeKHR *pPresentModes) {
5326 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005327 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005328 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005329 assert(my_data != NULL);
5330
Chris Forbes04b61da2016-11-03 09:53:59 +13005331 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005332 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13005333
Chris Forbes04b61da2016-11-03 09:53:59 +13005334 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005335 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005336
Chris Forbes04b61da2016-11-03 09:53:59 +13005337 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005338 result = my_data->dispatch_table.GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount,
5339 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005340
5341 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
5342 }
5343
5344 return result;
5345}
5346
Chris Forbesbe5f5202016-11-02 18:34:25 +13005347VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005348 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005349 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005350
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005351 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled, "vkDestroySurfaceKHR",
5352 VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005353
Chris Forbes04b61da2016-11-03 09:53:59 +13005354 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005355 my_data->dispatch_table.DestroySurfaceKHR(instance, surface, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005356 }
5357}
5358
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005359#ifdef VK_USE_PLATFORM_WIN32_KHR
5360VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
5361 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5362 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5363
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005364 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005365 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005366 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005367
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005368 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled, "vkCreateWin32SurfaceKHR",
5369 VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005370
Chris Forbes04b61da2016-11-03 09:53:59 +13005371 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005372
Chris Forbes04b61da2016-11-03 09:53:59 +13005373 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005374 result = my_data->dispatch_table.CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005375 }
5376
5377 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5378
5379 return result;
5380}
Chris Forbes9a083b92016-11-02 16:58:15 +13005381
5382VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005383 uint32_t queueFamilyIndex) {
Chris Forbes9a083b92016-11-02 16:58:15 +13005384 VkBool32 result = false;
5385
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005386 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes9a083b92016-11-02 16:58:15 +13005387 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005388 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005389
Chris Forbes04b61da2016-11-03 09:53:59 +13005390 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005391 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005392
Chris Forbes7281a502016-11-08 08:45:03 +13005393 // TODO: codegen doesn't produce this function?
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005394 // skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005395
Chris Forbes04b61da2016-11-03 09:53:59 +13005396 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005397 result = my_data->dispatch_table.GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005398 }
5399
5400 return result;
5401}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005402#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005403
5404#ifdef VK_USE_PLATFORM_XCB_KHR
5405VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5406 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5407 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5408
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005409 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005410 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005411 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005412
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005413 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled, "vkCreateXcbSurfaceKHR",
5414 VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005415
Chris Forbes04b61da2016-11-03 09:53:59 +13005416 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005417
Chris Forbes04b61da2016-11-03 09:53:59 +13005418 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005419 result = my_data->dispatch_table.CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005420 }
5421
5422 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5423
5424 return result;
5425}
5426
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005427VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5428 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5429 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005430 VkBool32 result = false;
5431
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005432 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005433 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005434 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005435
Chris Forbes04b61da2016-11-03 09:53:59 +13005436 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xcb_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005437 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005438
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005439 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection,
5440 visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005441
Chris Forbes04b61da2016-11-03 09:53:59 +13005442 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005443 result = my_data->dispatch_table.GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection,
5444 visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005445 }
5446
5447 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005448}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005449#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005450
5451#ifdef VK_USE_PLATFORM_XLIB_KHR
5452VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005453 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005454 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5455
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005456 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005457 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005458 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005459
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005460 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled, "vkCreateXlibSurfaceKHR",
5461 VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005462
Chris Forbes04b61da2016-11-03 09:53:59 +13005463 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005464
Chris Forbes04b61da2016-11-03 09:53:59 +13005465 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005466 result = my_data->dispatch_table.CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005467 }
5468
5469 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5470
5471 return result;
5472}
5473
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005474VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5475 uint32_t queueFamilyIndex, Display *dpy,
5476 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005477 VkBool32 result = false;
5478
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005479 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005480 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005481 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005482
Chris Forbes04b61da2016-11-03 09:53:59 +13005483 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005484 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005485
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005486 skip |=
5487 parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005488
Chris Forbes04b61da2016-11-03 09:53:59 +13005489 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005490 result =
5491 my_data->dispatch_table.GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005492 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005493 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005494}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005495#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005496
5497#ifdef VK_USE_PLATFORM_MIR_KHR
5498VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005499 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005500 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5501
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005502 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005503 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005504 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005505
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005506 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled, "vkCreateMirSurfaceKHR",
5507 VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005508
Chris Forbes04b61da2016-11-03 09:53:59 +13005509 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005510
Chris Forbes04b61da2016-11-03 09:53:59 +13005511 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005512 result = my_data->dispatch_table.CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005513 }
5514
5515 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5516
5517 return result;
5518}
5519
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005520VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5521 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005522 VkBool32 result = false;
5523
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005524 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005525 assert(my_data != NULL);
5526
Chris Forbes04b61da2016-11-03 09:53:59 +13005527 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005528
Chris Forbes04b61da2016-11-03 09:53:59 +13005529 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005530 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes115f98c2016-11-03 09:51:48 +13005531
Chris Forbes04b61da2016-11-03 09:53:59 +13005532 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005533
Chris Forbes04b61da2016-11-03 09:53:59 +13005534 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005535 result = my_data->dispatch_table.GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005536 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005537 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005538}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005539#endif // VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005540
5541#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5542VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005543 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005544 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5545
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005546 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005547 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005548 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005549
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005550 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled, "vkCreateWaylandSurfaceKHR",
5551 VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Chris Forbes115f98c2016-11-03 09:51:48 +13005552
Chris Forbes04b61da2016-11-03 09:53:59 +13005553 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005554
Chris Forbes04b61da2016-11-03 09:53:59 +13005555 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005556 result = my_data->dispatch_table.CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005557 }
5558
5559 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5560
5561 return result;
5562}
5563
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005564VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5565 uint32_t queueFamilyIndex,
5566 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005567 VkBool32 result = false;
5568
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005569 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005570 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005571 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005572
Chris Forbes04b61da2016-11-03 09:53:59 +13005573 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::wayland_enabled,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005574 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Chris Forbes115f98c2016-11-03 09:51:48 +13005575
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005576 skip |= parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005577
Chris Forbes04b61da2016-11-03 09:53:59 +13005578 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005579 result = my_data->dispatch_table.GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005580 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005581
5582 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005583}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005584#endif // VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005585
5586#ifdef VK_USE_PLATFORM_ANDROID_KHR
5587VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005588 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005589 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5590
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005591 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005592 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005593 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005594
Mark Young39389872017-01-19 21:10:49 -07005595 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled, "vkCreateAndroidSurfaceKHR",
5596 VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005597
Chris Forbes04b61da2016-11-03 09:53:59 +13005598 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005599
Chris Forbes04b61da2016-11-03 09:53:59 +13005600 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005601 result = my_data->dispatch_table.CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005602 }
5603
5604 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5605
5606 return result;
5607}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005608#endif // VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005609
Mark Youngead9b932016-09-08 12:28:38 -06005610VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5611 const VkSwapchainCreateInfoKHR *pCreateInfos,
5612 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5613 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005614 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005615 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06005616 assert(my_data != NULL);
5617
Mark Young39389872017-01-19 21:10:49 -07005618 skip |= require_device_extension(my_data, my_data->enables.khr_display_swapchain_enabled, "vkCreateSharedSwapchainsKHR",
5619 VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005620
Chris Forbes04b61da2016-11-03 09:53:59 +13005621 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Young39389872017-01-19 21:10:49 -07005622 pSwapchains);
Mark Youngead9b932016-09-08 12:28:38 -06005623
Chris Forbes04b61da2016-11-03 09:53:59 +13005624 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005625 result = my_data->dispatch_table.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Youngead9b932016-09-08 12:28:38 -06005626
5627 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5628 }
5629
5630 return result;
5631}
5632
Chris Forbes667a5212016-11-03 10:18:35 +13005633VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5634 VkDisplayPropertiesKHR *pProperties) {
5635 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5636 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005637 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005638 assert(my_data != NULL);
5639
5640 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5641 "vkGetPhysicalDeviceDisplayPropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5642
5643 // No parameter validation function for this call?
5644
5645 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005646 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005647
5648 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPropertiesKHR", result);
5649 }
5650
5651 return result;
5652}
5653
5654VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5655 VkDisplayPlanePropertiesKHR *pProperties) {
5656 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5657 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005658 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005659 assert(my_data != NULL);
5660
5661 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5662 "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5663
5664 // No parameter validation function for this call?
5665
5666 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005667 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005668
5669 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", result);
5670 }
5671
5672 return result;
5673}
5674
5675VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
5676 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
5677 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5678 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005679 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005680 assert(my_data != NULL);
5681
5682 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5683 "vkGetDisplayPlaneSupportedDisplaysKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5684
5685 // No parameter validation function for this call?
5686
5687 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005688 result = my_data->dispatch_table.GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
Chris Forbes667a5212016-11-03 10:18:35 +13005689
5690 validate_result(my_data->report_data, "vkGetDisplayPlaneSupportedDisplaysKHR", result);
5691 }
5692
5693 return result;
5694}
5695
5696VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5697 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
5698 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5699 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005700 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005701 assert(my_data != NULL);
5702
5703 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5704 "vkGetDisplayModePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5705
5706 // No parameter validation function for this call?
5707
5708 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005709 result = my_data->dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005710
5711 validate_result(my_data->report_data, "vkGetDisplayModePropertiesKHR", result);
5712 }
5713
5714 return result;
5715}
5716
5717VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5718 const VkDisplayModeCreateInfoKHR *pCreateInfo,
5719 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
5720 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5721 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005722 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005723 assert(my_data != NULL);
5724
Mark Young39389872017-01-19 21:10:49 -07005725 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled, "vkCreateDisplayModeKHR",
5726 VK_KHR_DISPLAY_EXTENSION_NAME);
Chris Forbes667a5212016-11-03 10:18:35 +13005727
5728 // No parameter validation function for this call?
5729
5730 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005731 result = my_data->dispatch_table.CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
Chris Forbes667a5212016-11-03 10:18:35 +13005732
5733 validate_result(my_data->report_data, "vkCreateDisplayModeKHR", result);
5734 }
5735
5736 return result;
5737}
5738
5739VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
5740 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
5741 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5742 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005743 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005744 assert(my_data != NULL);
5745
5746 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5747 "vkGetDisplayPlaneCapabilitiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5748
5749 // No parameter validation function for this call?
5750
5751 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005752 result = my_data->dispatch_table.GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
Chris Forbes667a5212016-11-03 10:18:35 +13005753
5754 validate_result(my_data->report_data, "vkGetDisplayPlaneCapabilitiesKHR", result);
5755 }
5756
5757 return result;
5758}
5759
5760VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
5761 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5762 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5763 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005764 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005765 assert(my_data != NULL);
5766
Mark Young39389872017-01-19 21:10:49 -07005767 skip |= require_instance_extension(instance, &instance_extension_enables::display_enabled, "vkCreateDisplayPlaneSurfaceKHR",
5768 VK_KHR_DISPLAY_EXTENSION_NAME);
Chris Forbes667a5212016-11-03 10:18:35 +13005769
5770 // No parameter validation function for this call?
5771
5772 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005773 result = my_data->dispatch_table.CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Chris Forbes667a5212016-11-03 10:18:35 +13005774
5775 validate_result(my_data->report_data, "vkCreateDisplayPlaneSurfaceKHR", result);
5776 }
5777
5778 return result;
5779}
5780
Mark Young39389872017-01-19 21:10:49 -07005781// Definitions for the VK_KHR_get_physical_device_properties2 extension
5782
5783VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures2KHR(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR *pFeatures) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005784 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005785 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005786 assert(my_data != NULL);
5787
Tobin Ehlis3da63962017-02-06 16:44:50 -07005788 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5789 "vkGetPhysicalDeviceFeatures2KHR", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005790
Tobin Ehlis3da63962017-02-06 16:44:50 -07005791 skip |= parameter_validation_vkGetPhysicalDeviceFeatures2KHR(my_data->report_data, pFeatures);
Mark Young39389872017-01-19 21:10:49 -07005792
Tobin Ehlis3da63962017-02-06 16:44:50 -07005793 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005794 my_data->dispatch_table.GetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures);
5795 }
5796}
5797
5798VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties2KHR(VkPhysicalDevice physicalDevice,
5799 VkPhysicalDeviceProperties2KHR *pProperties) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005800 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005801 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005802 assert(my_data != NULL);
5803
Tobin Ehlis3da63962017-02-06 16:44:50 -07005804 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5805 "vkGetPhysicalDeviceProperties2KHR", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005806
Tobin Ehlis3da63962017-02-06 16:44:50 -07005807 skip |= parameter_validation_vkGetPhysicalDeviceProperties2KHR(my_data->report_data, pProperties);
Mark Young39389872017-01-19 21:10:49 -07005808
Tobin Ehlis3da63962017-02-06 16:44:50 -07005809 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005810 my_data->dispatch_table.GetPhysicalDeviceProperties2KHR(physicalDevice, pProperties);
5811 }
5812}
5813
5814VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties2KHR(VkPhysicalDevice physicalDevice, VkFormat format,
5815 VkFormatProperties2KHR *pFormatProperties) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005816 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005817 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005818 assert(my_data != NULL);
5819
Tobin Ehlis3da63962017-02-06 16:44:50 -07005820 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5821 "vkGetPhysicalDeviceFormatProperties2KHR",
5822 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005823
Tobin Ehlis3da63962017-02-06 16:44:50 -07005824 skip |= parameter_validation_vkGetPhysicalDeviceFormatProperties2KHR(my_data->report_data, format, pFormatProperties);
Mark Young39389872017-01-19 21:10:49 -07005825
Tobin Ehlis3da63962017-02-06 16:44:50 -07005826 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005827 my_data->dispatch_table.GetPhysicalDeviceFormatProperties2KHR(physicalDevice, format, pFormatProperties);
5828 }
5829}
5830
5831VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties2KHR(
5832 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR *pImageFormatInfo,
5833 VkImageFormatProperties2KHR *pImageFormatProperties) {
5834 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis3da63962017-02-06 16:44:50 -07005835 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005836 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005837 assert(my_data != NULL);
5838
Tobin Ehlis3da63962017-02-06 16:44:50 -07005839 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5840 "vkGetPhysicalDeviceImageFormatProperties2KHR",
5841 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005842
Tobin Ehlis3da63962017-02-06 16:44:50 -07005843 skip |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties2KHR(my_data->report_data, pImageFormatInfo,
5844 pImageFormatProperties);
Mark Young39389872017-01-19 21:10:49 -07005845
Tobin Ehlis3da63962017-02-06 16:44:50 -07005846 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005847 result = my_data->dispatch_table.GetPhysicalDeviceImageFormatProperties2KHR(physicalDevice, pImageFormatInfo,
5848 pImageFormatProperties);
5849 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties2KHR", result);
5850 }
5851
5852 return result;
5853}
5854
5855VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties2KHR(VkPhysicalDevice physicalDevice,
5856 uint32_t *pQueueFamilyPropertyCount,
5857 VkQueueFamilyProperties2KHR *pQueueFamilyProperties) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005858 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005859 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005860 assert(my_data != NULL);
5861
Tobin Ehlis3da63962017-02-06 16:44:50 -07005862 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5863 "vkGetPhysicalDeviceQueueFamilyProperties2KHR",
5864 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005865
Tobin Ehlis3da63962017-02-06 16:44:50 -07005866 skip |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties2KHR(my_data->report_data, pQueueFamilyPropertyCount,
5867 pQueueFamilyProperties);
Mark Young39389872017-01-19 21:10:49 -07005868
Tobin Ehlis3da63962017-02-06 16:44:50 -07005869 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005870 my_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties2KHR(physicalDevice, pQueueFamilyPropertyCount,
5871 pQueueFamilyProperties);
5872 }
5873}
5874
5875VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties2KHR(VkPhysicalDevice physicalDevice,
5876 VkPhysicalDeviceMemoryProperties2KHR *pMemoryProperties) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005877 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005878 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005879 assert(my_data != NULL);
5880
Tobin Ehlis3da63962017-02-06 16:44:50 -07005881 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5882 "vkGetPhysicalDeviceMemoryProperties2KHR",
5883 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005884
Tobin Ehlis3da63962017-02-06 16:44:50 -07005885 skip |= parameter_validation_vkGetPhysicalDeviceMemoryProperties2KHR(my_data->report_data, pMemoryProperties);
Mark Young39389872017-01-19 21:10:49 -07005886
Tobin Ehlis3da63962017-02-06 16:44:50 -07005887 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005888 my_data->dispatch_table.GetPhysicalDeviceMemoryProperties2KHR(physicalDevice, pMemoryProperties);
5889 }
5890}
5891
Tobin Ehlis3da63962017-02-06 16:44:50 -07005892static bool PostGetPhysicalDeviceSparseImageFormatProperties2KHR(VkPhysicalDevice physicalDevice,
5893 const VkPhysicalDeviceSparseImageFormatInfo2KHR *pFormatInfo,
5894 uint32_t *pPropertyCount,
5895 VkSparseImageFormatProperties2KHR *pProperties) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005896 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Tobin Ehlis3da63962017-02-06 16:44:50 -07005897 if (pProperties != nullptr) {
5898 for (uint32_t i = 0; i < *pPropertyCount; ++i) {
5899 if ((pProperties[i].properties.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
5900 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
5901 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
5902 1, LayerName,
5903 "vkGetPhysicalDeviceSparseImageFormatProperties2KHR parameter, VkImageAspect "
5904 "pProperties[%i].properties.aspectMask, is an "
5905 "unrecognized enumerator",
5906 i);
5907 return false;
5908 }
5909 }
5910 }
5911 return true;
5912}
5913
Mark Young39389872017-01-19 21:10:49 -07005914VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties2KHR(
5915 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2KHR *pFormatInfo, uint32_t *pPropertyCount,
5916 VkSparseImageFormatProperties2KHR *pProperties) {
Tobin Ehlis3da63962017-02-06 16:44:50 -07005917 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005918 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005919 assert(my_data != NULL);
5920
Tobin Ehlis3da63962017-02-06 16:44:50 -07005921 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khr_get_phys_dev_properties2_enabled,
5922 "vkGetPhysicalDeviceSparseImageFormatProperties2KHR",
5923 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07005924
Tobin Ehlis3da63962017-02-06 16:44:50 -07005925 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties2KHR(my_data->report_data, pFormatInfo,
5926 pPropertyCount, pProperties);
Mark Young39389872017-01-19 21:10:49 -07005927
Tobin Ehlis3da63962017-02-06 16:44:50 -07005928 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07005929 my_data->dispatch_table.GetPhysicalDeviceSparseImageFormatProperties2KHR(physicalDevice, pFormatInfo, pPropertyCount,
5930 pProperties);
Tobin Ehlis3da63962017-02-06 16:44:50 -07005931 PostGetPhysicalDeviceSparseImageFormatProperties2KHR(physicalDevice, pFormatInfo, pPropertyCount, pProperties);
Mark Young39389872017-01-19 21:10:49 -07005932 }
5933}
5934
5935// Definitions for the VK_KHR_maintenance1 extension
5936
5937VKAPI_ATTR void VKAPI_CALL TrimCommandPoolKHR(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags) {
5938 bool skip_call = false;
Mark Young0f183a82017-02-28 09:58:04 -07005939 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07005940 assert(my_data != NULL);
5941
5942 skip_call |= require_device_extension(my_data, my_data->enables.khr_maintenance1, "vkTrimCommandPoolKHR",
5943 VK_KHR_MAINTENANCE1_EXTENSION_NAME);
5944
5945 skip_call |= parameter_validation_vkTrimCommandPoolKHR(my_data->report_data, commandPool, flags);
5946
5947 if (!skip_call) {
5948 my_data->dispatch_table.TrimCommandPoolKHR(device, commandPool, flags);
5949 }
5950}
5951
Mark Young0f183a82017-02-28 09:58:04 -07005952// Definitions for the VK_KHR_push_descriptor extension
5953
5954VKAPI_ATTR void VKAPI_CALL CmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
5955 VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount,
5956 const VkWriteDescriptorSet *pDescriptorWrites) {
5957 bool skip_call = false;
5958 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
5959 assert(my_data != NULL);
5960
5961 skip_call |= require_device_extension(my_data, my_data->enables.khr_push_descriptor, "vkCmdPushDescriptorSetKHR",
5962 VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5963
5964 skip_call |= parameter_validation_vkCmdPushDescriptorSetKHR(my_data->report_data, pipelineBindPoint, layout, set,
5965 descriptorWriteCount, pDescriptorWrites);
5966
5967 if (!skip_call) {
5968 my_data->dispatch_table.CmdPushDescriptorSetKHR(commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount,
5969 pDescriptorWrites);
5970 }
5971}
5972
5973// Definitions for the VK_KHR_descriptor_update_template extension
5974
5975VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorUpdateTemplateKHR(VkDevice device,
5976 const VkDescriptorUpdateTemplateCreateInfoKHR *pCreateInfo,
5977 const VkAllocationCallbacks *pAllocator,
5978 VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) {
5979 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5980 bool skip_call = false;
5981 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
5982 assert(my_data != NULL);
5983
5984 skip_call |= require_device_extension(my_data, my_data->enables.khr_descriptor_update_template,
5985 "vkCreateDescriptorUpdateTemplateKHR", VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME);
5986
5987 skip_call |= parameter_validation_vkCreateDescriptorUpdateTemplateKHR(my_data->report_data, pCreateInfo, pAllocator,
5988 pDescriptorUpdateTemplate);
5989
5990 if (!skip_call) {
5991 result =
5992 my_data->dispatch_table.CreateDescriptorUpdateTemplateKHR(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
5993 validate_result(my_data->report_data, "vkCreateDescriptorUpdateTemplateKHR", result);
5994 }
5995
5996 return result;
5997}
5998
5999VKAPI_ATTR void VKAPI_CALL DestroyDescriptorUpdateTemplateKHR(VkDevice device,
6000 VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate,
6001 const VkAllocationCallbacks *pAllocator) {
6002 bool skip_call = false;
6003 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6004 assert(my_data != NULL);
6005
6006 skip_call |= require_device_extension(my_data, my_data->enables.khr_descriptor_update_template,
6007 "vkDestroyDescriptorUpdateTemplateKHR", VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME);
6008
6009#if 0 // Validation not automatically generated
6010 skip_call |= parameter_validation_vkDestroyDescriptorUpdateTemplateKHR(my_data->report_data, descriptorUpdateTemplate,
6011 pAllocator);
6012#endif
6013
6014 if (!skip_call) {
6015 my_data->dispatch_table.DestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator);
6016 }
6017}
6018
6019VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
6020 VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate,
6021 const void *pData) {
6022 bool skip_call = false;
6023 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6024 assert(my_data != NULL);
6025
6026 skip_call |= require_device_extension(my_data, my_data->enables.khr_descriptor_update_template,
6027 "vkUpdateDescriptorSetWithTemplateKHR", VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME);
6028
6029 skip_call |= parameter_validation_vkUpdateDescriptorSetWithTemplateKHR(my_data->report_data, descriptorSet,
6030 descriptorUpdateTemplate, pData);
6031
6032 if (!skip_call) {
6033 my_data->dispatch_table.UpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, pData);
6034 }
6035}
6036
6037VKAPI_ATTR void VKAPI_CALL CmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
6038 VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate,
6039 VkPipelineLayout layout, uint32_t set, const void *pData) {
6040 bool skip_call = false;
6041 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6042 assert(my_data != NULL);
6043
6044 skip_call |=
6045 require_device_extension(my_data, my_data->enables.khr_descriptor_update_template, "vkCmdPushDescriptorSetWithTemplateKHR",
6046 VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME);
6047
6048 skip_call |= parameter_validation_vkCmdPushDescriptorSetWithTemplateKHR(my_data->report_data, descriptorUpdateTemplate, layout,
6049 set, pData);
6050
6051 if (!skip_call) {
6052 my_data->dispatch_table.CmdPushDescriptorSetWithTemplateKHR(commandBuffer, descriptorUpdateTemplate, layout, set, pData);
6053 }
6054}
6055
6056// Definitions for the VK_KHX_device_group_creation extension
6057
6058VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDeviceGroupsKHX(
6059 VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX *pPhysicalDeviceGroupProperties) {
6060 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6061 bool skip_call = false;
6062 auto my_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
6063 assert(my_data != NULL);
6064
6065 skip_call |= require_instance_extension(instance, &instance_extension_enables::khx_device_group_creation_enabled,
6066 "vkEnumeratePhysicalDeviceGroupsKHX", VK_KHX_DEVICE_GROUP_CREATION_EXTENSION_NAME);
6067
6068 skip_call |= parameter_validation_vkEnumeratePhysicalDeviceGroupsKHX(my_data->report_data, pPhysicalDeviceGroupCount,
6069 pPhysicalDeviceGroupProperties);
6070
6071 if (!skip_call) {
6072 result = my_data->dispatch_table.EnumeratePhysicalDeviceGroupsKHX(instance, pPhysicalDeviceGroupCount,
6073 pPhysicalDeviceGroupProperties);
6074 validate_result(my_data->report_data, "vkEnumeratePhysicalDeviceGroupsKHX", result);
6075 }
6076 return result;
6077}
6078
6079// Definitions for the VK_KHX_device_group extension
6080
6081VKAPI_ATTR void VKAPI_CALL GetDeviceGroupPeerMemoryFeaturesKHX(VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex,
6082 uint32_t remoteDeviceIndex,
6083 VkPeerMemoryFeatureFlagsKHX *pPeerMemoryFeatures) {
6084 bool skip_call = false;
6085 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6086 assert(my_data != NULL);
6087
6088 skip_call |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkGetDeviceGroupPeerMemoryFeaturesKHX",
6089 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
6090
6091 skip_call |= parameter_validation_vkGetDeviceGroupPeerMemoryFeaturesKHX(my_data->report_data, heapIndex, localDeviceIndex,
6092 remoteDeviceIndex, pPeerMemoryFeatures);
6093
6094 if (!skip_call) {
6095 my_data->dispatch_table.GetDeviceGroupPeerMemoryFeaturesKHX(device, heapIndex, localDeviceIndex, remoteDeviceIndex,
6096 pPeerMemoryFeatures);
6097 }
6098}
6099
6100VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory2KHX(VkDevice device, uint32_t bindInfoCount,
6101 const VkBindBufferMemoryInfoKHX *pBindInfos) {
6102 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6103 bool skip_call = false;
6104 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6105 assert(my_data != NULL);
6106
6107 skip_call |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkBindBufferMemory2KHX",
6108 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
6109
6110 skip_call |= parameter_validation_vkBindBufferMemory2KHX(my_data->report_data, bindInfoCount, pBindInfos);
6111
6112 if (!skip_call) {
6113 result = my_data->dispatch_table.BindBufferMemory2KHX(device, bindInfoCount, pBindInfos);
6114 validate_result(my_data->report_data, "vkBindBufferMemory2KHX", result);
6115 }
6116
6117 return result;
6118}
6119
6120VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory2KHX(VkDevice device, uint32_t bindInfoCount,
6121 const VkBindImageMemoryInfoKHX *pBindInfos) {
6122 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6123 bool skip_call = false;
6124 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6125 assert(my_data != NULL);
6126
6127 skip_call |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkBindImageMemory2KHX",
6128 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
6129
6130 skip_call |= parameter_validation_vkBindImageMemory2KHX(my_data->report_data, bindInfoCount, pBindInfos);
6131
6132 if (!skip_call) {
6133 result = my_data->dispatch_table.BindImageMemory2KHX(device, bindInfoCount, pBindInfos);
6134 validate_result(my_data->report_data, "vkBindImageMemory2KHX", result);
6135 }
6136
6137 return result;
6138}
6139
6140VKAPI_ATTR void VKAPI_CALL CmdSetDeviceMaskKHX(VkCommandBuffer commandBuffer, uint32_t deviceMask) {
6141 bool skip_call = false;
6142 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6143 assert(my_data != NULL);
6144
6145 skip_call |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkCmdSetDeviceMaskKHX",
6146 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
6147
6148#if 0 // Validation not automatically generated
6149 skip_call |= parameter_validation_vkCmdSetDeviceMaskKHX(my_data->report_data, deviceMask);
6150#endif
6151
6152 if (!skip_call) {
6153 my_data->dispatch_table.CmdSetDeviceMaskKHX(commandBuffer, deviceMask);
6154 }
6155}
6156
6157VKAPI_ATTR VkResult VKAPI_CALL
6158GetDeviceGroupPresentCapabilitiesKHX(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX *pDeviceGroupPresentCapabilities) {
6159 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6160 bool skip_call = false;
6161 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6162 assert(my_data != NULL);
6163
6164 skip_call |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkGetDeviceGroupPresentCapabilitiesKHX",
6165 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
6166
6167 skip_call |= parameter_validation_vkGetDeviceGroupPresentCapabilitiesKHX(my_data->report_data, pDeviceGroupPresentCapabilities);
6168
6169 if (!skip_call) {
6170 result = my_data->dispatch_table.GetDeviceGroupPresentCapabilitiesKHX(device, pDeviceGroupPresentCapabilities);
6171 validate_result(my_data->report_data, "vkGetDeviceGroupPresentCapabilitiesKHX", result);
6172 }
6173
6174 return result;
6175}
6176
6177VKAPI_ATTR VkResult VKAPI_CALL GetDeviceGroupSurfacePresentModesKHX(VkDevice device, VkSurfaceKHR surface,
6178 VkDeviceGroupPresentModeFlagsKHX *pModes) {
6179 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6180 bool skip_call = false;
6181 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6182 assert(my_data != NULL);
6183
6184 skip_call |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkGetDeviceGroupSurfacePresentModesKHX",
6185 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
6186
6187 skip_call |= parameter_validation_vkGetDeviceGroupSurfacePresentModesKHX(my_data->report_data, surface, pModes);
6188
6189 if (!skip_call) {
6190 result = my_data->dispatch_table.GetDeviceGroupSurfacePresentModesKHX(device, surface, pModes);
6191 validate_result(my_data->report_data, "vkGetDeviceGroupSurfacePresentModesKHX", result);
6192 }
6193 return result;
6194}
6195
6196VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImage2KHX(VkDevice device, const VkAcquireNextImageInfoKHX *pAcquireInfo,
6197 uint32_t *pImageIndex) {
6198 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6199 bool skip_call = false;
6200 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6201 assert(my_data != NULL);
6202
6203 skip_call |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkAcquireNextImage2KHX",
6204 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
6205
6206 skip_call |= parameter_validation_vkAcquireNextImage2KHX(my_data->report_data, pAcquireInfo, pImageIndex);
6207
6208 if (!skip_call) {
6209 result = my_data->dispatch_table.AcquireNextImage2KHX(device, pAcquireInfo, pImageIndex);
6210 validate_result(my_data->report_data, "vkAcquireNextImage2KHX", result);
6211 }
6212 return result;
6213}
6214
6215VKAPI_ATTR void VKAPI_CALL CmdDispatchBaseKHX(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
6216 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
6217 uint32_t groupCountZ) {
6218 bool skip_call = false;
6219 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6220 assert(my_data != NULL);
6221
6222 skip_call |= require_device_extension(my_data, my_data->enables.khx_device_group, "vkCmdDispatchBaseKHX",
6223 VK_KHX_DEVICE_GROUP_EXTENSION_NAME);
6224
6225#if 0 // Validation not automatically generated
6226 skip_call |= parameter_validation_vkCmdDispatchBaseKHX(my_data->report_data, baseGroupX, baseGroupY, baseGroupZ,
6227 groupCountX, groupCountY, groupCountZ);
6228#endif
6229
6230 if (!skip_call) {
6231 my_data->dispatch_table.CmdDispatchBaseKHX(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY,
6232 groupCountZ);
6233 }
6234}
6235
6236VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDevicePresentRectanglesKHX(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
6237 uint32_t *pRectCount, VkRect2D *pRects) {
6238 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6239 bool skip = false;
6240 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
6241 assert(my_data != NULL);
6242
6243 skip |= parameter_validation_vkGetPhysicalDevicePresentRectanglesKHX(my_data->report_data, surface, pRectCount, pRects);
6244
6245 if (!skip) {
6246 result = my_data->dispatch_table.GetPhysicalDevicePresentRectanglesKHX(physicalDevice, surface, pRectCount, pRects);
6247
6248 validate_result(my_data->report_data, "vkGetPhysicalDevicePresentRectanglesKHX", result);
6249 }
6250
6251 return result;
6252}
6253
6254// Definitions for the VK_KHX_external_memory_capabilities extension
6255
6256VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceExternalBufferPropertiesKHX(
6257 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHX *pExternalBufferInfo,
6258 VkExternalBufferPropertiesKHX *pExternalBufferProperties) {
6259 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
6260 assert(my_data != NULL);
6261 bool skip = false;
6262 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khx_external_memory_capabilities_enabled,
6263 "vkGetPhysicalDeviceExternalBufferPropertiesKHX",
6264 VK_KHX_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME);
6265 skip |= parameter_validation_vkGetPhysicalDeviceExternalBufferPropertiesKHX(my_data->report_data, pExternalBufferInfo,
6266 pExternalBufferProperties);
6267 if (!skip) {
6268 my_data->dispatch_table.GetPhysicalDeviceExternalBufferPropertiesKHX(physicalDevice, pExternalBufferInfo,
6269 pExternalBufferProperties);
6270 }
6271}
6272
Mark Young0f183a82017-02-28 09:58:04 -07006273// Definitions for the VK_KHX_external_memory_fd extension
6274
6275VKAPI_ATTR VkResult VKAPI_CALL GetMemoryFdKHX(VkDevice device, VkDeviceMemory memory,
6276 VkExternalMemoryHandleTypeFlagBitsKHX handleType, int *pFd) {
6277 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6278 bool skip_call = false;
6279 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6280 assert(my_data != NULL);
6281
6282 skip_call |= require_device_extension(my_data, my_data->enables.khx_external_memory_fd, "vkGetMemoryFdKHX",
6283 VK_KHX_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
6284
6285 skip_call |= parameter_validation_vkGetMemoryFdKHX(my_data->report_data, memory, handleType, pFd);
6286
6287 if (!skip_call) {
6288 result = my_data->dispatch_table.GetMemoryFdKHX(device, memory, handleType, pFd);
6289 validate_result(my_data->report_data, "vkGetMemoryFdKHX", result);
6290 }
6291
6292 return result;
6293}
6294
6295VKAPI_ATTR VkResult VKAPI_CALL GetMemoryFdPropertiesKHX(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHX handleType, int fd,
6296 VkMemoryFdPropertiesKHX *pMemoryFdProperties) {
6297 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6298 bool skip_call = false;
6299 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6300 assert(my_data != NULL);
6301
6302 skip_call |= require_device_extension(my_data, my_data->enables.khx_external_memory_fd, "vkGetMemoryFdPropertiesKHX",
6303 VK_KHX_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
6304
6305 skip_call |= parameter_validation_vkGetMemoryFdPropertiesKHX(my_data->report_data, handleType, fd, pMemoryFdProperties);
6306
6307 if (!skip_call) {
6308 result = my_data->dispatch_table.GetMemoryFdPropertiesKHX(device, handleType, fd, pMemoryFdProperties);
6309 validate_result(my_data->report_data, "vkGetMemoryFdPropertiesKHX", result);
6310 }
6311
6312 return result;
6313}
6314
6315// Definitions for the VK_KHX_external_memory_win32 extension
6316
6317#ifdef VK_USE_PLATFORM_WIN32_KHX
6318VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleKHX(VkDevice device, VkDeviceMemory memory,
6319 VkExternalMemoryHandleTypeFlagBitsKHX handleType, HANDLE *pHandle) {
6320 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6321 bool skip_call = false;
6322 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6323 assert(my_data != NULL);
6324 skip_call |= require_device_extension(my_data, my_data->enables.khx_external_memory_win32, "vkGetMemoryWin32HandleKHX",
6325 VK_KHX_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME);
6326
6327 skip_call |= parameter_validation_vkGetMemoryWin32HandleKHX(my_data->report_data, memory, handleType, pHandle);
6328
6329 if (!skip_call) {
6330 result = my_data->dispatch_table.GetMemoryWin32HandleKHX(device, memory, handleType, pHandle);
6331 validate_result(my_data->report_data, "vkGetMemoryWin32HandleKHX", result);
6332 }
6333 return result;
6334}
6335
6336VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandlePropertiesKHX(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHX handleType,
6337 HANDLE handle,
6338 VkMemoryWin32HandlePropertiesKHX *pMemoryWin32HandleProperties) {
6339 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6340 bool skip_call = false;
6341 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6342 assert(my_data != NULL);
6343 skip_call |= require_device_extension(my_data, my_data->enables.khx_external_memory_win32,
6344 "vkGetMemoryWin32HandlePropertiesKHX", VK_KHX_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME);
6345
6346 skip_call |= parameter_validation_vkGetMemoryWin32HandlePropertiesKHX(my_data->report_data, handleType, handle,
6347 pMemoryWin32HandleProperties);
6348
6349 if (!skip_call) {
6350 result =
6351 my_data->dispatch_table.GetMemoryWin32HandlePropertiesKHX(device, handleType, handle, pMemoryWin32HandleProperties);
6352 validate_result(my_data->report_data, "vkGetMemoryWin32HandlePropertiesKHX", result);
6353 }
6354 return result;
6355}
6356#endif // VK_USE_PLATFORM_WIN32_KHX
6357
6358// Definitions for the VK_KHX_external_semaphore_capabilities extension
6359
6360VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceExternalSemaphorePropertiesKHX(
6361 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfoKHX *pExternalSemaphoreInfo,
6362 VkExternalSemaphorePropertiesKHX *pExternalSemaphoreProperties) {
6363 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
6364 assert(my_data != NULL);
6365 bool skip = false;
6366 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::khx_external_memory_capabilities_enabled,
6367 "vkGetPhysicalDeviceExternalSemaphorePropertiesKHX",
6368 VK_KHX_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME);
6369 skip |= parameter_validation_vkGetPhysicalDeviceExternalSemaphorePropertiesKHX(my_data->report_data, pExternalSemaphoreInfo,
6370 pExternalSemaphoreProperties);
6371 if (!skip) {
6372 my_data->dispatch_table.GetPhysicalDeviceExternalSemaphorePropertiesKHX(physicalDevice, pExternalSemaphoreInfo,
6373 pExternalSemaphoreProperties);
6374 }
6375}
6376
6377// Definitions for the VK_KHX_external_semaphore_fd extension
6378
6379VKAPI_ATTR VkResult VKAPI_CALL ImportSemaphoreFdKHX(VkDevice device, const VkImportSemaphoreFdInfoKHX *pImportSemaphoreFdInfo) {
6380 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6381 bool skip_call = false;
6382 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6383 assert(my_data != NULL);
6384
6385 skip_call |= require_device_extension(my_data, my_data->enables.khx_external_semaphore_fd, "vkImportSemaphoreFdKHX",
6386 VK_KHX_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
6387
6388 skip_call |= parameter_validation_vkImportSemaphoreFdKHX(my_data->report_data, pImportSemaphoreFdInfo);
6389
6390 if (!skip_call) {
6391 result = my_data->dispatch_table.ImportSemaphoreFdKHX(device, pImportSemaphoreFdInfo);
6392 validate_result(my_data->report_data, "vkImportSemaphoreFdKHX", result);
6393 }
6394
6395 return result;
6396}
6397
6398VKAPI_ATTR VkResult VKAPI_CALL GetSemaphoreFdKHX(VkDevice device, VkSemaphore semaphore,
6399 VkExternalSemaphoreHandleTypeFlagBitsKHX handleType, int *pFd) {
6400 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6401 bool skip_call = false;
6402 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6403 assert(my_data != NULL);
6404
6405 skip_call |= require_device_extension(my_data, my_data->enables.khx_external_semaphore_fd, "vkGetSemaphoreFdKHX",
6406 VK_KHX_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
6407
6408 skip_call |= parameter_validation_vkGetSemaphoreFdKHX(my_data->report_data, semaphore, handleType, pFd);
6409
6410 if (!skip_call) {
6411 result = my_data->dispatch_table.GetSemaphoreFdKHX(device, semaphore, handleType, pFd);
6412 validate_result(my_data->report_data, "vkGetSemaphoreFdKHX", result);
6413 }
6414
6415 return result;
6416}
6417
6418// Definitions for the VK_KHX_external_semaphore_win32 extension
6419
6420#ifdef VK_USE_PLATFORM_WIN32_KHX
6421VKAPI_ATTR VkResult VKAPI_CALL
6422ImportSemaphoreWin32HandleKHX(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHX *pImportSemaphoreWin32HandleInfo) {
6423 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6424 bool skip_call = false;
6425 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6426 assert(my_data != NULL);
6427 skip_call |= require_device_extension(my_data, my_data->enables.khx_external_semaphore_win32, "vkImportSemaphoreWin32HandleKHX",
6428 VK_KHX_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME);
6429
6430 skip_call |= parameter_validation_vkImportSemaphoreWin32HandleKHX(my_data->report_data, pImportSemaphoreWin32HandleInfo);
6431 if (!skip_call) {
6432 result = my_data->dispatch_table.ImportSemaphoreWin32HandleKHX(device, pImportSemaphoreWin32HandleInfo);
6433 validate_result(my_data->report_data, "vkImportSemaphoreWin32HandleKHX", result);
6434 }
6435 return result;
6436}
6437
6438VKAPI_ATTR VkResult VKAPI_CALL GetSemaphoreWin32HandleKHX(VkDevice device, VkSemaphore semaphore,
6439 VkExternalSemaphoreHandleTypeFlagBitsKHX handleType, HANDLE *pHandle) {
6440 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6441 bool skip_call = false;
6442 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6443 assert(my_data != NULL);
6444 skip_call |= require_device_extension(my_data, my_data->enables.khx_external_semaphore_win32, "vkGetSemaphoreWin32HandleKHX",
6445 VK_KHX_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME);
6446 skip_call |= parameter_validation_vkGetSemaphoreWin32HandleKHX(my_data->report_data, semaphore, handleType, pHandle);
6447 if (!skip_call) {
6448 result = my_data->dispatch_table.GetSemaphoreWin32HandleKHX(device, semaphore, handleType, pHandle);
6449 validate_result(my_data->report_data, "vkGetSemaphoreWin32HandleKHX", result);
6450 }
6451 return result;
6452}
6453#endif // VK_USE_PLATFORM_WIN32_KHX
6454
Mark Young39389872017-01-19 21:10:49 -07006455// Definitions for the VK_EXT_acquire_xlib_display extension
6456
6457#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
6458VKAPI_ATTR VkResult VKAPI_CALL AcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, VkDisplayKHR display) {
Mark Young39389872017-01-19 21:10:49 -07006459 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006460 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006461 assert(my_data != NULL);
6462 bool skip = false;
6463 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::ext_acquire_xlib_display_enabled,
6464 "vkAcquireXlibDisplayEXT", VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME);
6465 skip |= parameter_validation_vkAcquireXlibDisplayEXT(my_data->report_data, dpy, display);
6466 if (!skip) {
6467 result = my_data->dispatch_table.AcquireXlibDisplayEXT(physicalDevice, dpy, display);
6468 validate_result(my_data->report_data, "vkAcquireXlibDisplayEXT", result);
6469 }
6470 return result;
6471}
6472
6473VKAPI_ATTR VkResult VKAPI_CALL GetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, RROutput rrOutput,
6474 VkDisplayKHR *pDisplay) {
Mark Young39389872017-01-19 21:10:49 -07006475 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006476 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006477 assert(my_data != NULL);
6478 bool skip = false;
6479 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::ext_acquire_xlib_display_enabled,
6480 "vkGetRandROutputDisplayEXT", VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME);
6481 skip |= parameter_validation_vkGetRandROutputDisplayEXT(my_data->report_data, dpy, rrOutput, pDisplay);
6482 if (!skip) {
6483 result = my_data->dispatch_table.GetRandROutputDisplayEXT(physicalDevice, dpy, rrOutput, pDisplay);
6484 validate_result(my_data->report_data, "vkGetRandROutputDisplayEXT", result);
6485 }
6486 return result;
6487}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006488#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
Mark Young39389872017-01-19 21:10:49 -07006489
6490// Definitions for the VK_EXT_debug_marker Extension
6491
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006492VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
6493 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13006494 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006495 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006496 assert(my_data != NULL);
6497
Mark Young39389872017-01-19 21:10:49 -07006498 skip |= require_device_extension(my_data, my_data->enables.ext_debug_marker, "vkDebugMarkerSetObjectTagEXT",
6499 VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
6500
Chris Forbes04b61da2016-11-03 09:53:59 +13006501 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006502
Chris Forbes04b61da2016-11-03 09:53:59 +13006503 if (!skip) {
Tobin Ehlis8ad41932016-12-01 09:37:56 -07006504 if (my_data->dispatch_table.DebugMarkerSetObjectTagEXT) {
6505 result = my_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
6506 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
6507 } else {
6508 result = VK_SUCCESS;
6509 }
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006510 }
6511
6512 return result;
6513}
6514
6515VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
6516 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13006517 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006518 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006519 assert(my_data != NULL);
6520
Mark Young39389872017-01-19 21:10:49 -07006521 skip |= require_device_extension(my_data, my_data->enables.ext_debug_marker, "vkDebugMarkerSetObjectNameEXT",
6522 VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
6523
Chris Forbes04b61da2016-11-03 09:53:59 +13006524 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006525
Chris Forbes04b61da2016-11-03 09:53:59 +13006526 if (!skip) {
Tobin Ehlis8ad41932016-12-01 09:37:56 -07006527 if (my_data->dispatch_table.DebugMarkerSetObjectNameEXT) {
6528 result = my_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
6529 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
6530 } else {
6531 result = VK_SUCCESS;
6532 }
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006533 }
6534
6535 return result;
6536}
6537
6538VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13006539 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006540 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006541 assert(my_data != NULL);
6542
Mark Young39389872017-01-19 21:10:49 -07006543 skip |= require_device_extension(my_data, my_data->enables.ext_debug_marker, "vkCmdDebugMarkerBeginEXT",
6544 VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
6545
Chris Forbes04b61da2016-11-03 09:53:59 +13006546 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006547
Tobin Ehlis8ad41932016-12-01 09:37:56 -07006548 if (!skip && my_data->dispatch_table.CmdDebugMarkerBeginEXT) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13006549 my_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006550 }
6551}
6552
6553VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13006554 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006555 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006556 assert(my_data != NULL);
6557
Mark Young39389872017-01-19 21:10:49 -07006558 skip |= require_device_extension(my_data, my_data->enables.ext_debug_marker, "vkCmdDebugMarkerInsertEXT",
6559 VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
6560
Chris Forbes04b61da2016-11-03 09:53:59 +13006561 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006562
Tobin Ehlis8ad41932016-12-01 09:37:56 -07006563 if (!skip && my_data->dispatch_table.CmdDebugMarkerInsertEXT) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13006564 my_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006565 }
6566}
6567
Mark Young39389872017-01-19 21:10:49 -07006568// Definitions for the VK_EXT_direct_mode_display extension
6569
6570VKAPI_ATTR VkResult VKAPI_CALL ReleaseDisplayEXT(VkPhysicalDevice physicalDevice, VkDisplayKHR display) {
Mark Young39389872017-01-19 21:10:49 -07006571 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006572 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006573 assert(my_data != NULL);
6574 bool skip = false;
6575 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::ext_direct_mode_display_enabled,
6576 "vkReleaseDisplayEXT", VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006577#if 0 // Validation not automatically generated
Mark Young39389872017-01-19 21:10:49 -07006578 skip |= parameter_validation_vkReleaseDisplayEXT(my_data->report_data, display);
6579#endif
6580 if (!skip) {
6581 result = my_data->dispatch_table.ReleaseDisplayEXT(physicalDevice, display);
6582 validate_result(my_data->report_data, "vkGetRandROutputDisplayEXT", result);
6583 }
6584 return result;
6585}
6586
Mark Young0f183a82017-02-28 09:58:04 -07006587// Definitions for the VK_EXT_discard_rectangles extension
6588
6589VKAPI_ATTR void VKAPI_CALL CmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
6590 uint32_t discardRectangleCount, const VkRect2D *pDiscardRectangles) {
6591 bool skip = false;
6592 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6593 assert(my_data != NULL);
6594
6595 skip |= require_device_extension(my_data, my_data->enables.ext_discard_rectangles, "vkCmdSetDiscardRectangleEXT",
6596 VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME);
6597
6598 skip |= parameter_validation_vkCmdSetDiscardRectangleEXT(my_data->report_data, firstDiscardRectangle,
6599 discardRectangleCount, pDiscardRectangles);
6600
6601 if (!skip && my_data->dispatch_table.CmdSetDiscardRectangleEXT) {
6602 my_data->dispatch_table.CmdSetDiscardRectangleEXT(commandBuffer, firstDiscardRectangle, discardRectangleCount,
6603 pDiscardRectangles);
6604 }
6605}
6606
6607// Definitions for the VK_EXT_display_control extension
6608
6609VKAPI_ATTR VkResult VKAPI_CALL DisplayPowerControlEXT(VkDevice device, VkDisplayKHR display,
6610 const VkDisplayPowerInfoEXT *pDisplayPowerInfo) {
6611 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6612 bool skip = false;
6613 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6614 assert(my_data != NULL);
6615
6616 skip |= require_device_extension(my_data, my_data->enables.ext_display_control, "vkDisplayPowerControlEXT",
6617 VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME);
6618
6619 skip |= parameter_validation_vkDisplayPowerControlEXT(my_data->report_data, display, pDisplayPowerInfo);
6620
6621 if (!skip) {
6622 if (my_data->dispatch_table.DisplayPowerControlEXT) {
6623 result = my_data->dispatch_table.DisplayPowerControlEXT(device, display, pDisplayPowerInfo);
6624 validate_result(my_data->report_data, "vkDisplayPowerControlEXT", result);
6625 } else {
6626 result = VK_SUCCESS;
6627 }
6628 }
6629
6630 return result;
6631}
6632
6633VKAPI_ATTR VkResult VKAPI_CALL RegisterDeviceEventEXT(VkDevice device, const VkDeviceEventInfoEXT *pDeviceEventInfo,
6634 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
6635 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6636 bool skip = false;
6637 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6638 assert(my_data != NULL);
6639
6640 skip |= require_device_extension(my_data, my_data->enables.ext_display_control, "vkRegisterDeviceEventEXT",
6641 VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME);
6642
6643 skip |= parameter_validation_vkRegisterDeviceEventEXT(my_data->report_data, pDeviceEventInfo, pAllocator, pFence);
6644
6645 if (!skip) {
6646 if (my_data->dispatch_table.RegisterDeviceEventEXT) {
6647 result = my_data->dispatch_table.RegisterDeviceEventEXT(device, pDeviceEventInfo, pAllocator, pFence);
6648 validate_result(my_data->report_data, "vkRegisterDeviceEventEXT", result);
6649 } else {
6650 result = VK_SUCCESS;
6651 }
6652 }
6653
6654 return result;
6655}
6656
6657VKAPI_ATTR VkResult VKAPI_CALL RegisterDisplayEventEXT(VkDevice device, VkDisplayKHR display,
6658 const VkDisplayEventInfoEXT *pDisplayEventInfo,
6659 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
6660 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6661 bool skip = false;
6662 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6663 assert(my_data != NULL);
6664
6665 skip |= require_device_extension(my_data, my_data->enables.ext_display_control, "vkRegisterDisplayEventEXT",
6666 VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME);
6667
6668 skip |= parameter_validation_vkRegisterDisplayEventEXT(my_data->report_data, display, pDisplayEventInfo, pAllocator, pFence);
6669
6670 if (!skip) {
6671 if (my_data->dispatch_table.RegisterDisplayEventEXT) {
6672 result = my_data->dispatch_table.RegisterDisplayEventEXT(device, display, pDisplayEventInfo, pAllocator, pFence);
6673 validate_result(my_data->report_data, "vkRegisterDisplayEventEXT", result);
6674 } else {
6675 result = VK_SUCCESS;
6676 }
6677 }
6678
6679 return result;
6680}
6681
6682VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainCounterEXT(VkDevice device, VkSwapchainKHR swapchain,
6683 VkSurfaceCounterFlagBitsEXT counter, uint64_t *pCounterValue) {
6684 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6685 bool skip = false;
6686 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6687 assert(my_data != NULL);
6688
6689 skip |= require_device_extension(my_data, my_data->enables.ext_display_control, "vkGetSwapchainCounterEXT",
6690 VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME);
6691
6692 skip |= parameter_validation_vkGetSwapchainCounterEXT(my_data->report_data, swapchain, counter, pCounterValue);
6693
6694 if (!skip) {
6695 if (my_data->dispatch_table.GetSwapchainCounterEXT) {
6696 result = my_data->dispatch_table.GetSwapchainCounterEXT(device, swapchain, counter, pCounterValue);
6697 validate_result(my_data->report_data, "vkGetSwapchainCounterEXT", result);
6698 } else {
6699 result = VK_SUCCESS;
6700 }
6701 }
6702
6703 return result;
6704}
6705
6706// Definitions for the VK_AMD_draw_indirect_count extension
6707
6708VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
6709 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
6710 uint32_t stride) {
6711 bool skip = false;
6712 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6713 assert(my_data != NULL);
6714 skip |= require_device_extension(my_data, my_data->enables.amd_draw_indirect_count, "vkCmdDrawIndirectCountAMD",
6715 VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6716 skip |= parameter_validation_vkCmdDrawIndirectCountAMD(my_data->report_data, buffer, offset, countBuffer, countBufferOffset,
6717 maxDrawCount, stride);
6718 if (!skip) {
6719 my_data->dispatch_table.CmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount,
6720 stride);
6721 }
6722}
6723
6724VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
6725 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
6726 uint32_t maxDrawCount, uint32_t stride) {
6727 bool skip = false;
6728 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6729 assert(my_data != NULL);
6730 skip |= require_device_extension(my_data, my_data->enables.amd_draw_indirect_count, "vkCmdDrawIndexedIndirectCountAMD",
6731 VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6732 skip |= parameter_validation_vkCmdDrawIndexedIndirectCountAMD(my_data->report_data, buffer, offset, countBuffer,
6733 countBufferOffset, maxDrawCount, stride);
6734 if (!skip) {
6735 my_data->dispatch_table.CmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset,
6736 maxDrawCount, stride);
6737 }
6738}
6739
Mark Young39389872017-01-19 21:10:49 -07006740// Definitions for the VK_EXT_display_surface_counter extension
6741
6742VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
6743 VkSurfaceCapabilities2EXT *pSurfaceCapabilities) {
Mark Young39389872017-01-19 21:10:49 -07006744 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006745 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006746 assert(my_data != NULL);
6747 bool skip = false;
6748 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::ext_display_surface_counter_enabled,
6749 "vkGetPhysicalDeviceSurfaceCapabilities2EXT", VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07006750 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceCapabilities2EXT(my_data->report_data, surface, pSurfaceCapabilities);
Mark Young39389872017-01-19 21:10:49 -07006751 if (!skip) {
6752 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, pSurfaceCapabilities);
6753 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilities2EXT", result);
6754 }
6755 return result;
6756}
6757
Mark Young0f183a82017-02-28 09:58:04 -07006758// Definitions for the VK_NV_clip_space_w_scaling Extension
6759
6760VKAPI_ATTR void VKAPI_CALL CmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
6761 const VkViewportWScalingNV *pViewportWScalings) {
6762 bool skip = false;
6763 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
6764 assert(my_data != NULL);
6765 skip |= require_device_extension(my_data, my_data->enables.amd_draw_indirect_count, "vkCmdSetViewportWScalingNV",
6766 VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6767#if 0 // Validation not automatically generated
6768 skip |= parameter_validation_vkCmdSetViewportWScalingNV(my_data->report_data, firstViewport, viewportCount, pViewportWScalings);
6769#endif
6770 if (!skip) {
6771 my_data->dispatch_table.CmdSetViewportWScalingNV(commandBuffer, firstViewport, viewportCount, pViewportWScalings);
6772 }
6773}
6774
Mark Young39389872017-01-19 21:10:49 -07006775// Definitions for the VK_NV_external_memory_capabilities Extension
6776
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006777VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
6778 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
6779 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
6780 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006781 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13006782 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006783 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006784 assert(my_data != NULL);
6785
Mark Young39389872017-01-19 21:10:49 -07006786 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::nv_external_memory_capabilities_enabled,
6787 "vkGetPhysicalDeviceExternalImageFormatPropertiesNV",
6788 VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME);
6789
Chris Forbes04b61da2016-11-03 09:53:59 +13006790 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006791 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
6792
Chris Forbes04b61da2016-11-03 09:53:59 +13006793 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13006794 result = my_data->dispatch_table.GetPhysicalDeviceExternalImageFormatPropertiesNV(
6795 physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006796
6797 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
6798 }
6799
6800 return result;
6801}
6802
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006803// VK_NV_external_memory_win32 Extension
Mark Young39389872017-01-19 21:10:49 -07006804
6805#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006806VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
6807 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006808 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13006809 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006810 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006811 assert(my_data != NULL);
6812
Mark Young39389872017-01-19 21:10:49 -07006813 skip |= require_device_extension(my_data, my_data->enables.nv_external_memory_win32, "vkGetMemoryWin32HandleNV",
6814 VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME);
6815
Chris Forbes04b61da2016-11-03 09:53:59 +13006816 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006817
Chris Forbes04b61da2016-11-03 09:53:59 +13006818 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13006819 result = my_data->dispatch_table.GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06006820 }
6821
6822 return result;
6823}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006824#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006825
Mark Young39389872017-01-19 21:10:49 -07006826// VK_NVX_device_generated_commands Extension
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06006827
Mark Youngfa552782016-12-12 16:14:55 -07006828VKAPI_ATTR void VKAPI_CALL CmdProcessCommandsNVX(VkCommandBuffer commandBuffer,
6829 const VkCmdProcessCommandsInfoNVX *pProcessCommandsInfo) {
6830 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006831 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006832 assert(my_data != NULL);
6833 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkCmdProcessCommandsNVX",
Mark Youngfa552782016-12-12 16:14:55 -07006834 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
Mark Young39389872017-01-19 21:10:49 -07006835 skip |= parameter_validation_vkCmdProcessCommandsNVX(my_data->report_data, pProcessCommandsInfo);
Mark Youngfa552782016-12-12 16:14:55 -07006836 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07006837 my_data->dispatch_table.CmdProcessCommandsNVX(commandBuffer, pProcessCommandsInfo);
Mark Youngfa552782016-12-12 16:14:55 -07006838 }
6839}
6840
6841VKAPI_ATTR void VKAPI_CALL CmdReserveSpaceForCommandsNVX(VkCommandBuffer commandBuffer,
6842 const VkCmdReserveSpaceForCommandsInfoNVX *pReserveSpaceInfo) {
6843 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006844 auto my_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07006845 assert(my_data != NULL);
6846 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkCmdReserveSpaceForCommandsNVX",
6847 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
6848 skip |= parameter_validation_vkCmdReserveSpaceForCommandsNVX(my_data->report_data, pReserveSpaceInfo);
Mark Youngfa552782016-12-12 16:14:55 -07006849 if (!skip) {
Mark Young39389872017-01-19 21:10:49 -07006850 my_data->dispatch_table.CmdReserveSpaceForCommandsNVX(commandBuffer, pReserveSpaceInfo);
Mark Youngfa552782016-12-12 16:14:55 -07006851 }
6852}
6853
6854VKAPI_ATTR VkResult VKAPI_CALL CreateIndirectCommandsLayoutNVX(VkDevice device,
6855 const VkIndirectCommandsLayoutCreateInfoNVX *pCreateInfo,
6856 const VkAllocationCallbacks *pAllocator,
6857 VkIndirectCommandsLayoutNVX *pIndirectCommandsLayout) {
6858 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6859 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006860 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006861 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006862 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkCreateIndirectCommandsLayoutNVX",
6863 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
Mark Youngfa552782016-12-12 16:14:55 -07006864 skip |= parameter_validation_vkCreateIndirectCommandsLayoutNVX(my_data->report_data, pCreateInfo, pAllocator,
6865 pIndirectCommandsLayout);
6866 if (!skip) {
6867 result = my_data->dispatch_table.CreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout);
Mark Youngfa552782016-12-12 16:14:55 -07006868 validate_result(my_data->report_data, "vkCreateIndirectCommandsLayoutNVX", result);
6869 }
6870 return result;
6871}
6872
6873VKAPI_ATTR void VKAPI_CALL DestroyIndirectCommandsLayoutNVX(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout,
6874 const VkAllocationCallbacks *pAllocator) {
6875 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006876 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006877 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006878 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkDestroyIndirectCommandsLayoutNVX",
6879 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006880#if 0 // Validation not automatically generated
Mark Youngfa552782016-12-12 16:14:55 -07006881 skip |= parameter_validation_vkDestroyIndirectCommandsLayoutNVX(my_data->report_data, indirectCommandsLayout, pAllocator);
Mark Young39389872017-01-19 21:10:49 -07006882#endif
Mark Youngfa552782016-12-12 16:14:55 -07006883 if (!skip) {
6884 my_data->dispatch_table.DestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator);
6885 }
6886}
6887
6888VKAPI_ATTR VkResult VKAPI_CALL CreateObjectTableNVX(VkDevice device, const VkObjectTableCreateInfoNVX *pCreateInfo,
6889 const VkAllocationCallbacks *pAllocator, VkObjectTableNVX *pObjectTable) {
6890 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6891 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006892 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006893 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006894 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkCreateObjectTableNVX",
Mark Youngfa552782016-12-12 16:14:55 -07006895 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
6896 skip |= parameter_validation_vkCreateObjectTableNVX(my_data->report_data, pCreateInfo, pAllocator, pObjectTable);
6897 if (!skip) {
6898 result = my_data->dispatch_table.CreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable);
Mark Young39389872017-01-19 21:10:49 -07006899 validate_result(my_data->report_data, "vkCreateObjectTableNVX", result);
Mark Youngfa552782016-12-12 16:14:55 -07006900 }
6901 return result;
6902}
6903
6904VKAPI_ATTR void VKAPI_CALL DestroyObjectTableNVX(VkDevice device, VkObjectTableNVX objectTable,
6905 const VkAllocationCallbacks *pAllocator) {
6906 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006907 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006908 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006909 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkDestroyObjectTableNVX",
Mark Youngfa552782016-12-12 16:14:55 -07006910 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006911#if 0 // Validation not automatically generated
Mark Youngfa552782016-12-12 16:14:55 -07006912 skip |= parameter_validation_vkDestroyObjectTableNVX(my_data->report_data, objectTable, pAllocator);
Mark Young39389872017-01-19 21:10:49 -07006913#endif
Mark Youngfa552782016-12-12 16:14:55 -07006914 if (!skip) {
6915 my_data->dispatch_table.DestroyObjectTableNVX(device, objectTable, pAllocator);
6916 }
6917}
6918
6919VKAPI_ATTR VkResult VKAPI_CALL RegisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
6920 const VkObjectTableEntryNVX *const *ppObjectTableEntries,
6921 const uint32_t *pObjectIndices) {
6922 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6923 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006924 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006925 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006926 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkRegisterObjectsNVX",
Mark Youngfa552782016-12-12 16:14:55 -07006927 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
6928 skip |= parameter_validation_vkRegisterObjectsNVX(my_data->report_data, objectTable, objectCount, ppObjectTableEntries,
6929 pObjectIndices);
6930 if (!skip) {
6931 result = my_data->dispatch_table.RegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices);
Mark Young39389872017-01-19 21:10:49 -07006932 validate_result(my_data->report_data, "vkRegisterObjectsNVX", result);
Mark Youngfa552782016-12-12 16:14:55 -07006933 }
6934 return result;
6935}
6936
6937VKAPI_ATTR VkResult VKAPI_CALL UnregisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
6938 const VkObjectEntryTypeNVX *pObjectEntryTypes, const uint32_t *pObjectIndices) {
6939 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6940 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07006941 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006942 assert(my_data != NULL);
Mark Young39389872017-01-19 21:10:49 -07006943 skip |= require_device_extension(my_data, my_data->enables.nvx_device_generated_commands, "vkUnregisterObjectsNVX",
Mark Youngfa552782016-12-12 16:14:55 -07006944 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
6945 skip |= parameter_validation_vkUnregisterObjectsNVX(my_data->report_data, objectTable, objectCount, pObjectEntryTypes,
6946 pObjectIndices);
6947 if (!skip) {
6948 result = my_data->dispatch_table.UnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices);
Mark Young39389872017-01-19 21:10:49 -07006949 validate_result(my_data->report_data, "vkUnregisterObjectsNVX", result);
Mark Youngfa552782016-12-12 16:14:55 -07006950 }
6951 return result;
6952}
6953
6954VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceGeneratedCommandsPropertiesNVX(VkPhysicalDevice physicalDevice,
6955 VkDeviceGeneratedCommandsFeaturesNVX *pFeatures,
6956 VkDeviceGeneratedCommandsLimitsNVX *pLimits) {
6957 bool skip = false;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07006958 auto my_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Youngfa552782016-12-12 16:14:55 -07006959 assert(my_data != NULL);
Mark Youngfa552782016-12-12 16:14:55 -07006960 skip |= parameter_validation_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX(my_data->report_data, pFeatures, pLimits);
Mark Youngfa552782016-12-12 16:14:55 -07006961 if (!skip) {
6962 my_data->dispatch_table.GetPhysicalDeviceGeneratedCommandsPropertiesNVX(physicalDevice, pFeatures, pLimits);
6963 }
6964}
Mark Lobodzinski620a9132016-09-28 13:51:51 -06006965
Mark Lobodzinski1d218cc2017-03-14 10:12:43 -06006966VKAPI_ATTR VkResult VKAPI_CALL GetPastPresentationTimingGOOGLE(VkDevice device, VkSwapchainKHR swapchain,
6967 uint32_t *pPresentationTimingCount,
6968 VkPastPresentationTimingGOOGLE *pPresentationTimings) {
6969 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6970 bool skip = false;
6971 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6972 assert(my_data != NULL);
6973 skip |= parameter_validation_vkGetPastPresentationTimingGOOGLE(my_data->report_data, swapchain, pPresentationTimingCount,
6974 pPresentationTimings);
6975 if (!skip) {
6976 result = my_data->dispatch_table.GetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount,
6977 pPresentationTimings);
6978 }
6979 return result;
6980}
6981
6982VKAPI_ATTR VkResult VKAPI_CALL GetRefreshCycleDurationGOOGLE(VkDevice device, VkSwapchainKHR swapchain,
6983 VkRefreshCycleDurationGOOGLE *pDisplayTimingProperties) {
6984 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
6985 bool skip = false;
6986 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6987 assert(my_data != NULL);
6988 skip |= parameter_validation_vkGetRefreshCycleDurationGOOGLE(my_data->report_data, swapchain, pDisplayTimingProperties);
6989 if (!skip) {
6990 result = my_data->dispatch_table.GetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties);
6991 }
6992 return result;
6993}
6994
6995VKAPI_ATTR void VKAPI_CALL SetHdrMetadataEXT(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR *pSwapchains,
6996 const VkHdrMetadataEXT *pMetadata) {
6997 bool skip = false;
6998 auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
6999 assert(my_data != NULL);
7000 skip |= parameter_validation_vkSetHdrMetadataEXT(my_data->report_data, swapchainCount, pSwapchains, pMetadata);
7001 if (!skip) {
7002 my_data->dispatch_table.SetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata);
7003 }
7004}
7005
Mark Young4e423c02017-03-07 13:09:00 -07007006static inline PFN_vkVoidFunction layer_intercept_proc(const char *name) {
7007 for (unsigned int i = 0; i < sizeof(procmap) / sizeof(procmap[0]); i++) {
7008 if (!strcmp(name, procmap[i].name)) return procmap[i].pFunc;
7009 }
7010 return NULL;
7011}
Mark Young39389872017-01-19 21:10:49 -07007012
Chia-I Wu01ca2372016-05-13 14:37:49 +08007013VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08007014 assert(device);
7015
Mark Young4e423c02017-03-07 13:09:00 -07007016 PFN_vkVoidFunction addr = layer_intercept_proc(funcName);
7017 if (addr) return addr;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07007018
Mark Young4e423c02017-03-07 13:09:00 -07007019 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07007020
Mark Young4e423c02017-03-07 13:09:00 -07007021 if (!dev_data->dispatch_table.GetDeviceProcAddr) return nullptr;
7022 return dev_data->dispatch_table.GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007023}
7024
Chia-I Wu01ca2372016-05-13 14:37:49 +08007025VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06007026
Mark Young4e423c02017-03-07 13:09:00 -07007027 PFN_vkVoidFunction addr = layer_intercept_proc(funcName);
7028 if (addr) return addr;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06007029
Chia-I Wu617f2a42016-05-16 07:41:17 +08007030 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007031
Mark Young4e423c02017-03-07 13:09:00 -07007032 auto instance_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07007033
Mark Young4e423c02017-03-07 13:09:00 -07007034 if (!instance_data->dispatch_table.GetInstanceProcAddr) return nullptr;
7035 return instance_data->dispatch_table.GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06007036}
Chia-I Wu99f701c2016-05-13 14:06:08 +08007037
Mark Young39389872017-01-19 21:10:49 -07007038VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *funcName) {
7039 assert(instance);
Mark Young4e423c02017-03-07 13:09:00 -07007040 auto pdev_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
Mark Young39389872017-01-19 21:10:49 -07007041
Mark Young4e423c02017-03-07 13:09:00 -07007042 if (!pdev_data->dispatch_table.GetPhysicalDeviceProcAddr) return nullptr;
7043 return pdev_data->dispatch_table.GetPhysicalDeviceProcAddr(instance, funcName);
Mark Young39389872017-01-19 21:10:49 -07007044}
7045
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007046} // namespace parameter_validation
Chia-I Wu1a6b1932016-05-13 14:07:36 +08007047
7048// vk_layer_logging.h expects these to be defined
7049
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06007050VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
7051 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
7052 const VkAllocationCallbacks *pAllocator,
7053 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08007054 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08007055}
7056
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06007057VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
7058 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08007059 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08007060}
7061
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06007062VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
7063 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
7064 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08007065 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08007066}
7067
7068// loader-layer interface v0
7069
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06007070VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
7071 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08007072 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08007073}
7074
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06007075VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
7076 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08007077 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08007078}
7079
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06007080VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
7081 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08007082 // the layer command handles VK_NULL_HANDLE just fine internally
7083 assert(physicalDevice == VK_NULL_HANDLE);
7084 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08007085}
7086
7087VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
7088 const char *pLayerName, uint32_t *pCount,
7089 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08007090 // the layer command handles VK_NULL_HANDLE just fine internally
7091 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08007092 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08007093}
7094
7095VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08007096 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08007097}
7098
7099VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08007100 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08007101}
Mark Young39389872017-01-19 21:10:49 -07007102
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007103VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_layerGetPhysicalDeviceProcAddr(VkInstance instance,
7104 const char *funcName) {
Mark Young39389872017-01-19 21:10:49 -07007105 return parameter_validation::GetPhysicalDeviceProcAddr(instance, funcName);
7106}
7107
7108VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface *pVersionStruct) {
7109 assert(pVersionStruct != NULL);
7110 assert(pVersionStruct->sType == LAYER_NEGOTIATE_INTERFACE_STRUCT);
7111
7112 // Fill in the function pointers if our version is at least capable of having the structure contain them.
7113 if (pVersionStruct->loaderLayerInterfaceVersion >= 2) {
7114 pVersionStruct->pfnGetInstanceProcAddr = vkGetInstanceProcAddr;
7115 pVersionStruct->pfnGetDeviceProcAddr = vkGetDeviceProcAddr;
7116 pVersionStruct->pfnGetPhysicalDeviceProcAddr = vk_layerGetPhysicalDeviceProcAddr;
7117 }
7118
7119 if (pVersionStruct->loaderLayerInterfaceVersion < CURRENT_LOADER_LAYER_INTERFACE_VERSION) {
7120 parameter_validation::loader_layer_if_version = pVersionStruct->loaderLayerInterfaceVersion;
7121 } else if (pVersionStruct->loaderLayerInterfaceVersion > CURRENT_LOADER_LAYER_INTERFACE_VERSION) {
7122 pVersionStruct->loaderLayerInterfaceVersion = CURRENT_LOADER_LAYER_INTERFACE_VERSION;
7123 }
7124
7125 return VK_SUCCESS;
7126}