blob: 9effb15bec0d59be534cb5af065b2ab2ff392d1e [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
Chris Forbes7b58a712016-11-24 11:35:31 +130072struct layer_data {
Chris Forbes7b58a712016-11-24 11:35:31 +130073 debug_report_data *report_data = nullptr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070074 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060075 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Chris Forbes7b57a392016-11-02 17:56:50 +130076 VkPhysicalDeviceLimits device_limits = {};
77 VkPhysicalDeviceFeatures physical_device_features = {};
78 VkPhysicalDevice physical_device = VK_NULL_HANDLE;
Michael Lentinebdf744f2016-01-27 15:43:43 -060079
Chris Forbes7b57a392016-11-02 17:56:50 +130080 bool swapchain_enabled = false;
81 bool display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -060082 bool amd_negative_viewport_height_enabled = false;
Mark Youngfa552782016-12-12 16:14:55 -070083 bool nvx_device_generated_commands_enabled = false;
Chris Forbese58c9fe2016-11-24 14:44:17 +130084
85 VkLayerDispatchTable dispatch_table = {};
Cody Northrop55443ef2015-09-28 15:09:32 -060086};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050087
Jon Ashburn5484e0c2016-03-08 17:48:44 -070088static std::unordered_map<void *, layer_data *> layer_data_map;
Chris Forbes7b58a712016-11-24 11:35:31 +130089static std::unordered_map<void *, instance_layer_data *> instance_layer_data_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060090
Chris Forbes7b58a712016-11-24 11:35:31 +130091static void init_parameter_validation(instance_layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060092
Mark Lobodzinski739391a2016-03-17 15:08:18 -060093 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -060094}
95
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060096VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
97 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
98 const VkAllocationCallbacks *pAllocator,
99 VkDebugReportCallbackEXT *pMsgCallback) {
Chris Forbes6444bba2016-11-24 14:15:23 +1300100 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
101 VkResult result = data->dispatch_table.CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600102
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700103 if (result == VK_SUCCESS) {
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600104 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600105 }
106
107 return result;
108}
109
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600110VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800111 const VkAllocationCallbacks *pAllocator) {
Chris Forbes7b58a712016-11-24 11:35:31 +1300112 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes6444bba2016-11-24 14:15:23 +1300113 data->dispatch_table.DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
114
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700115 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600116}
117
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600118VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
119 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
120 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chris Forbes6444bba2016-11-24 14:15:23 +1300121 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
122 data->dispatch_table.DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700123}
124
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700125static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600126
Chia-I Wu3384db82016-05-16 07:30:58 +0800127static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600128 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800129};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700130
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700131static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600132 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700133 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
134 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
135 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
136 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
137 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 -0700138 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700139 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600140 return false;
141 }
142
143 return true;
144}
145
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700146static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
147 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600148 return "unrecognized enumerator";
149 }
150
151 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700152 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600153 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
154 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700155 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600156 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
157 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700158 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600159 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
160 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700161 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600162 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
163 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700164 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600165 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
166 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600168 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
169 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700170 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600171 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
172 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700173 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600174 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
175 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700176 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600177 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
178 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700179 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600180 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
181 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700182 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800183 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600184 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700185 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800186 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600187 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700188 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700189 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
190 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600191
192 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700193 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600194 enumeratorString += string;
195
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700196 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600197 enumeratorString += '|';
198 }
199 }
200
201 return enumeratorString;
202}
203
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700204static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
205 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
206 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
207 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
208 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
209 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600210 return false;
211 }
212
213 return true;
214}
215
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700216static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
217 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600218 return "unrecognized enumerator";
219 }
220
221 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700222 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600223 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
224 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700225 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600226 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600227 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700228 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600229 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
230 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700231 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600232 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
233 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700234 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600235 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
236 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800238 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600239 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700240 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600241 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
242 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700243 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800244 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600245 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600246
247 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700248 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 enumeratorString += string;
250
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700251 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600252 enumeratorString += '|';
253 }
254 }
255
256 return enumeratorString;
257}
258
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700259static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
260 VkQueueFlagBits allFlags =
261 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
262 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600263 return false;
264 }
265
266 return true;
267}
268
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700269static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
270 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600271 return "unrecognized enumerator";
272 }
273
274 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700275 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800276 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600277 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700278 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600279 strings.push_back("VK_QUEUE_COMPUTE_BIT");
280 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700281 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800282 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600283 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700284 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600285 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
286 }
287
288 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700289 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600290 enumeratorString += string;
291
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700292 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600293 enumeratorString += '|';
294 }
295 }
296
297 return enumeratorString;
298}
299
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700300static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
301 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
302 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
303 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
304 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600305 return false;
306 }
307
308 return true;
309}
310
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700311static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
312 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600313 return "unrecognized enumerator";
314 }
315
316 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700317 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600318 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
319 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700320 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800321 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600322 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700323 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600324 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
325 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700326 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800327 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600328 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700329 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800330 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600331 }
332
333 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700334 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600335 enumeratorString += string;
336
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700337 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600338 enumeratorString += '|';
339 }
340 }
341
342 return enumeratorString;
343}
344
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700345static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700346 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700347 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600348 return false;
349 }
350
351 return true;
352}
353
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700354static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
355 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600356 return "unrecognized enumerator";
357 }
358
359 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700360 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800361 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600362 }
363
364 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700365 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600366 enumeratorString += string;
367
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700368 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600369 enumeratorString += '|';
370 }
371 }
372
373 return enumeratorString;
374}
375
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700376static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
377 VkSparseImageFormatFlagBits allFlags =
378 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
379 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
380 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600381 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600382 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600383
384 return true;
385}
386
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700387static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
388 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600389 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600390 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600391
392 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700393 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800394 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600395 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700396 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800397 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600398 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700399 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800400 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600401 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600402
403 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700404 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600405 enumeratorString += string;
406
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700407 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600408 enumeratorString += '|';
409 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600410 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600411
412 return enumeratorString;
413}
414
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700415static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700416 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700417 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600418 return false;
419 }
420
421 return true;
422}
423
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700424static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
425 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600426 return "unrecognized enumerator";
427 }
428
429 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700430 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600431 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
432 }
433
434 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700435 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600436 enumeratorString += string;
437
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700438 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600439 enumeratorString += '|';
440 }
441 }
442
443 return enumeratorString;
444}
445
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700446static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
447 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
448 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
449 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
450 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
451 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600452 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
453 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
454 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700455 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600456 return false;
457 }
458
459 return true;
460}
461
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700462static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
463 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600464 return "unrecognized enumerator";
465 }
466
467 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700468 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700469 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600470 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700471 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700472 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600473 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700474 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700475 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600476 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700477 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700478 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600479 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700480 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700481 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600482 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700483 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700484 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600485 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700486 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700487 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600488 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700489 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700490 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600491 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700492 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700493 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600494 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700495 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700496 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600497 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700498 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700499 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600500 }
501
502 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700503 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600504 enumeratorString += string;
505
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700506 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600507 enumeratorString += '|';
508 }
509 }
510
511 return enumeratorString;
512}
513
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700514static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
515 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
516 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
517 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600518 return false;
519 }
520
521 return true;
522}
523
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700524static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
525 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600526 return "unrecognized enumerator";
527 }
528
529 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700530 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600531 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
532 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700533 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600534 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
535 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700536 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600537 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
538 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700539 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600540 strings.push_back("VK_QUERY_RESULT_64_BIT");
541 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600542
543 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700544 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600545 enumeratorString += string;
546
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700547 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600548 enumeratorString += '|';
549 }
550 }
551
552 return enumeratorString;
553}
554
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700555static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
556 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
557 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
558 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
559 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
560 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600561 return false;
562 }
563
564 return true;
565}
566
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700567static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
568 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600569 return "unrecognized enumerator";
570 }
571
572 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700573 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600574 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
575 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700576 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600577 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
578 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700579 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600580 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
581 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700582 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600583 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
584 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700585 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600586 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
587 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700588 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800589 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600590 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700591 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600592 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
593 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700594 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800595 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600596 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700597 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600598 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
599 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600
601 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700602 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600603 enumeratorString += string;
604
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700605 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600606 enumeratorString += '|';
607 }
608 }
609
610 return enumeratorString;
611}
612
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700613static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
614 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
615 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
616 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600617 return false;
618 }
619
620 return true;
621}
622
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700623static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
624 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600625 return "unrecognized enumerator";
626 }
627
628 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700629 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600630 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
631 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700632 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600633 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
634 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700635 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600636 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600637 }
638
639 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700640 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600641 enumeratorString += string;
642
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700643 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600644 enumeratorString += '|';
645 }
646 }
647
648 return enumeratorString;
649}
650
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700651static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
652 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
653 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
654 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
655 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600656 return false;
657 }
658
659 return true;
660}
661
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700662static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
663 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600664 return "unrecognized enumerator";
665 }
666
667 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700668 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600669 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
670 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700671 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600672 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
673 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700674 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600675 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
676 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700677 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600678 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
679 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700680 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600681 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600682 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600683
684 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700685 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600686 enumeratorString += string;
687
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700688 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600689 enumeratorString += '|';
690 }
691 }
692
693 return enumeratorString;
694}
695
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700696static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
697 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
698 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
699 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600700 return false;
701 }
702
703 return true;
704}
705
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700706static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
707 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600708 return "unrecognized enumerator";
709 }
710
711 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700712 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800713 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600714 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700715 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800716 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600717 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700718 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800719 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600720 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700721 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800722 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600723 }
724
725 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700726 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600727 enumeratorString += string;
728
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700729 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600730 enumeratorString += '|';
731 }
732 }
733
734 return enumeratorString;
735}
736
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700737static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
738 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
739 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
740 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600741 return false;
742 }
743
744 return true;
745}
746
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700747static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
748 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600749 return "unrecognized enumerator";
750 }
751
752 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700753 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600754 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
755 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700756 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600757 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
758 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700759 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600760 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600761 }
762
763 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700764 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600765 enumeratorString += string;
766
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700767 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600768 enumeratorString += '|';
769 }
770 }
771
772 return enumeratorString;
773}
774
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700775static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
776 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
777 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
778 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
779 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600780 return false;
781 }
782
783 return true;
784}
785
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700786static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
787 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600788 return "unrecognized enumerator";
789 }
790
791 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700792 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600793 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600794 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700795 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600796 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600797 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700798 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600799 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
800 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700801 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600802 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
803 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700804 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600805 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600806 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700807 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600808 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600809 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700810 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600811 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600812 }
813
814 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700815 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600816 enumeratorString += string;
817
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700818 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600819 enumeratorString += '|';
820 }
821 }
822
823 return enumeratorString;
824}
825
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700826static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800827 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700828 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
829 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
830 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
831 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
832 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
833 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 -0700834 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700835 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600836 return false;
837 }
838
839 return true;
840}
841
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700842static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
843 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600844 return "unrecognized enumerator";
845 }
846
847 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700848 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800849 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
850 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700851 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800852 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600853 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700854 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600855 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600856 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700857 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600858 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600859 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700860 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600861 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600862 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700863 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700864 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600865 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700866 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600867 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600868 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700869 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600870 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600871 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700872 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600873 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600874 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700875 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600876 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600877 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700878 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600879 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
880 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700881 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600882 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
883 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700884 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700885 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600886 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700887 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600888 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
889 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700890 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600891 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
892 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700893 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600894 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
895 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700896 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600897 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600898 }
899
900 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700901 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600902 enumeratorString += string;
903
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700904 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600905 enumeratorString += '|';
906 }
907 }
908
909 return enumeratorString;
910}
911
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700912static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800913 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700914 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
915 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
916 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
917 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
918 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 +0800919
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700920 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600921 return false;
922 }
923
924 return true;
925}
926
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700927static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
928 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600929 return "unrecognized enumerator";
930 }
931
932 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700933 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800934 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600935 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700936 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800937 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600938 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700939 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800940 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600941 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700942 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800943 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600944 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700945 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800946 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600947 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700948 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800949 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600950 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700951 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800952 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600953 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700954 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800955 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600956 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700957 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800958 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600959 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700960 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800961 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600962 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700963 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800964 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600965 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700966 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800967 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600968 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700969 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800970 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600971 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700972 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800973 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600974 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700975 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800976 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600977 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700978 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800979 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600980 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700981 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800982 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600983 }
984
985 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700986 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600987 enumeratorString += string;
988
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700989 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600990 enumeratorString += '|';
991 }
992 }
993
994 return enumeratorString;
995}
996
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700997static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
998 VkCommandPoolCreateFlagBits allFlags =
999 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1000 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001001 return false;
1002 }
1003
1004 return true;
1005}
1006
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001007static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1008 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001009 return "unrecognized enumerator";
1010 }
1011
1012 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001013 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001014 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001015 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001016 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001017 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001018 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001019
1020 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001021 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001022 enumeratorString += string;
1023
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001024 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001025 enumeratorString += '|';
1026 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001027 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001028
1029 return enumeratorString;
1030}
1031
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001032static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001033 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001034 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001035 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001036 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001037
1038 return true;
1039}
1040
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001041static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1042 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001043 return "unrecognized enumerator";
1044 }
1045
1046 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001047 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001048 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001049 }
1050
1051 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001052 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001053 enumeratorString += string;
1054
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001055 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001056 enumeratorString += '|';
1057 }
1058 }
1059
1060 return enumeratorString;
1061}
1062
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001063static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1064 VkCommandBufferUsageFlags allFlags =
1065 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1066 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1067 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001068 return false;
1069 }
1070
1071 return true;
1072}
1073
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001074static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1075 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001076 return "unrecognized enumerator";
1077 }
1078
1079 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001080 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001081 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001082 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001083 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001084 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001085 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001086 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001087 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001088 }
1089
1090 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001091 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001092 enumeratorString += string;
1093
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001094 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001095 enumeratorString += '|';
1096 }
1097 }
1098
1099 return enumeratorString;
1100}
1101
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001102static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001103 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001104 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001105 return false;
1106 }
1107
1108 return true;
1109}
1110
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001111static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1112 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001113 return "unrecognized enumerator";
1114 }
1115
1116 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001117 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001118 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001119 }
1120
1121 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001122 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001123 enumeratorString += string;
1124
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001125 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001126 enumeratorString += '|';
1127 }
1128 }
1129
1130 return enumeratorString;
1131}
1132
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001133static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1134 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1135 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1136 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001137 return false;
1138 }
1139
1140 return true;
1141}
1142
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001143static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1144 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001145 return "unrecognized enumerator";
1146 }
1147
1148 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001149 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001150 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1151 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001152 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001153 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1154 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001155 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001156 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1157 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001158 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001159 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1160 }
1161
1162 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001163 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001164 enumeratorString += string;
1165
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001166 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001167 enumeratorString += '|';
1168 }
1169 }
1170
1171 return enumeratorString;
1172}
1173
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001174static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001175 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001176 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001177 return false;
1178 }
1179
1180 return true;
1181}
1182
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001183static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1184 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001185 return "unrecognized enumerator";
1186 }
1187
1188 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001189 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001190 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001191 }
1192
1193 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001194 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001195 enumeratorString += string;
1196
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001197 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001198 enumeratorString += '|';
1199 }
1200 }
1201
1202 return enumeratorString;
1203}
1204
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001205static const int MaxParamCheckerStringLength = 256;
1206
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001207static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001208 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001209 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001210 assert(validateString != nullptr);
1211
Chris Forbes04b61da2016-11-03 09:53:59 +13001212 bool skip = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001213
1214 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1215
1216 if (result == VK_STRING_ERROR_NONE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001217 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001218 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001219
Chris Forbes04b61da2016-11-03 09:53:59 +13001220 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001221 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1222 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001223 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001224 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001225 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1226 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001227 }
Chris Forbes04b61da2016-11-03 09:53:59 +13001228 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001229}
1230
Dustin Gravesde628532016-04-21 16:30:17 -06001231static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1232 uint32_t index) {
1233 assert(device_data != nullptr);
1234 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001235 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001236
1237 if (index == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001238 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001239 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001240 } else {
1241 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1242 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001243 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001244 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1245 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001246 function_name, parameter_name, index);
1247 return false;
1248 }
1249 }
1250
Chris Forbes04b61da2016-11-03 09:53:59 +13001251 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001252}
1253
1254static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1255 const uint32_t count, const uint32_t *indices) {
1256 assert(device_data != nullptr);
1257 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001258 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001259
1260 if (indices != nullptr) {
1261 for (uint32_t i = 0; i < count; i++) {
1262 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001263 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001264 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001265 } else {
1266 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1267 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001268 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001269 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1270 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001271 function_name, parameter_name, i, indices[i]);
1272 return false;
1273 }
1274 }
1275 }
1276 }
1277
Chris Forbes04b61da2016-11-03 09:53:59 +13001278 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001279}
1280
Chris Forbes6be763e2016-11-24 12:42:33 +13001281static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001282
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001283VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1284 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001285 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001286
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001287 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001288 assert(chain_info != nullptr);
1289 assert(chain_info->u.pLayerInfo != nullptr);
1290
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001291 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1292 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001293 if (fpCreateInstance == NULL) {
1294 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001295 }
1296
Dustin Graves842621d2016-03-03 14:17:08 -07001297 // Advance the link info for the next element on the chain
1298 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1299
1300 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001301
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001302 if (result == VK_SUCCESS) {
Chris Forbes7b58a712016-11-24 11:35:31 +13001303 auto my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), instance_layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001304 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001305
Chris Forbes6444bba2016-11-24 14:15:23 +13001306 layer_init_instance_dispatch_table(*pInstance, &my_instance_data->dispatch_table, fpGetInstanceProcAddr);
Chia-I Wua570b7c2016-05-16 07:48:14 +08001307 my_instance_data->instance = *pInstance;
Chris Forbes6444bba2016-11-24 14:15:23 +13001308 my_instance_data->report_data =
1309 debug_report_create_instance(&my_instance_data->dispatch_table, *pInstance, pCreateInfo->enabledExtensionCount,
1310 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001311
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001312 // Look for one or more debug report create info structures
1313 // and setup a callback(s) for each one found.
1314 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1315 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1316 if (my_instance_data->num_tmp_callbacks > 0) {
1317 // Setup the temporary callback(s) here to catch early issues:
1318 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1319 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1320 // Failure of setting up one or more of the callback.
1321 // Therefore, clean up and don't use those callbacks:
1322 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1323 my_instance_data->num_tmp_callbacks = 0;
1324 }
1325 }
1326 }
1327
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001328 init_parameter_validation(my_instance_data, pAllocator);
Chris Forbes6be763e2016-11-24 12:42:33 +13001329 CheckInstanceRegisterExtensions(pCreateInfo, my_instance_data);
Dustin Graves842621d2016-03-03 14:17:08 -07001330
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001331 // Ordinarily we'd check these before calling down the chain, but none of the layer
1332 // support is in place until now, if we survive we can report the issue now.
1333 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001334
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001335 if (pCreateInfo->pApplicationInfo) {
1336 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1337 validate_string(my_instance_data->report_data, "vkCreateInstance",
1338 "pCreateInfo->VkApplicationInfo->pApplicationName",
1339 pCreateInfo->pApplicationInfo->pApplicationName);
1340 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001341
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001342 if (pCreateInfo->pApplicationInfo->pEngineName) {
1343 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1344 pCreateInfo->pApplicationInfo->pEngineName);
1345 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001346 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001347
1348 // Disable the tmp callbacks:
1349 if (my_instance_data->num_tmp_callbacks > 0) {
1350 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1351 my_instance_data->tmp_callbacks);
1352 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001353 }
1354
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001355 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001356}
1357
Chia-I Wu01ca2372016-05-13 14:37:49 +08001358VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001359 // Grab the key before the instance is destroyed.
1360 dispatch_key key = get_dispatch_key(instance);
Chris Forbes04b61da2016-11-03 09:53:59 +13001361 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001362 auto my_data = get_my_data_ptr(key, instance_layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001363 assert(my_data != NULL);
1364
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001365 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1366 bool callback_setup = false;
1367 if (my_data->num_tmp_callbacks > 0) {
1368 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1369 my_data->tmp_callbacks)) {
1370 callback_setup = true;
1371 }
1372 }
1373
Chris Forbes04b61da2016-11-03 09:53:59 +13001374 skip |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001375
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001376 // Disable and cleanup the temporary callback(s):
1377 if (callback_setup) {
1378 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1379 }
1380 if (my_data->num_tmp_callbacks > 0) {
1381 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1382 my_data->num_tmp_callbacks = 0;
1383 }
1384
Chris Forbes04b61da2016-11-03 09:53:59 +13001385 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001386 my_data->dispatch_table.DestroyInstance(instance, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001387
1388 // Clean up logging callback, if any
1389 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001390 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1391 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001392 my_data->logging_callback.pop_back();
1393 }
1394
Chris Forbes78a56b02016-11-02 16:13:01 +13001395 layer_debug_report_destroy_instance(my_data->report_data);
Chris Forbes6444bba2016-11-24 14:15:23 +13001396 instance_layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001397 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001398}
1399
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001400VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1401 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001402 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001403 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001404 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001405 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001406
Chris Forbes04b61da2016-11-03 09:53:59 +13001407 skip |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001408
Chris Forbes04b61da2016-11-03 09:53:59 +13001409 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001410 result = my_data->dispatch_table.EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001411 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001412 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001413 return result;
1414}
1415
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001416VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001417 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001418 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001419 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001420
Chris Forbes04b61da2016-11-03 09:53:59 +13001421 skip |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001422
Chris Forbes04b61da2016-11-03 09:53:59 +13001423 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001424 my_data->dispatch_table.GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001425 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001426}
1427
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001428VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1429 VkFormatProperties *pFormatProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001430 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001431 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001432 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001433
Chris Forbes04b61da2016-11-03 09:53:59 +13001434 skip |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001435
Chris Forbes04b61da2016-11-03 09:53:59 +13001436 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001437 my_data->dispatch_table.GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001438 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001439}
1440
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001441VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1442 VkImageType type, VkImageTiling tiling,
1443 VkImageUsageFlags usage, VkImageCreateFlags flags,
1444 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001445 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001446 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001447 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001448 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001449
Chris Forbes04b61da2016-11-03 09:53:59 +13001450 skip |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001451 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001452
Chris Forbes04b61da2016-11-03 09:53:59 +13001453 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001454 result = my_data->dispatch_table.GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1455 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001456
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001457 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001458 }
Chia-I Wu17241042015-10-31 00:31:16 +08001459
1460 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001461}
1462
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001463VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001464 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001465 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001466 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001467
Chris Forbes04b61da2016-11-03 09:53:59 +13001468 skip |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001469
Chris Forbes04b61da2016-11-03 09:53:59 +13001470 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001471 my_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001472 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001473}
1474
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001475VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1476 uint32_t *pQueueFamilyPropertyCount,
1477 VkQueueFamilyProperties *pQueueFamilyProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001478 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001479 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001480 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001481
Chris Forbes04b61da2016-11-03 09:53:59 +13001482 skip |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001483 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001484
Chris Forbes04b61da2016-11-03 09:53:59 +13001485 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001486 my_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount,
1487 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001488 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001489}
1490
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001491VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1492 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001493 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001494 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001495 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001496
Chris Forbes04b61da2016-11-03 09:53:59 +13001497 skip |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001498
Chris Forbes04b61da2016-11-03 09:53:59 +13001499 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13001500 my_data->dispatch_table.GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001501 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001502}
1503
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001504void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1505 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001506 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001507
Chris Forbes7b58a712016-11-24 11:35:31 +13001508 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes0e0161a2016-11-02 16:21:28 +13001509
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001510 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1511 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1512 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001513 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 -06001514 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001515 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1516 "structure.",
1517 i);
1518 } else {
1519 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001520 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001521
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001522 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1523 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1524 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1525 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001526 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 -06001527 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001528 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1529 "between 0 and 1. Actual value is %f",
1530 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1531 }
1532 }
1533 }
1534
1535 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1536 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001537 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 -06001538 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001539 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1540 "of queue families.",
1541 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001542 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1543 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1544 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001545 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 -06001546 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001547 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1548 "queues for the given family index.",
1549 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001550 }
Michael Lentine774704f2016-01-27 13:36:46 -06001551 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001552 }
1553}
1554
Chris Forbes6be763e2016-11-24 12:42:33 +13001555static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001556
1557 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001558 auto name = pCreateInfo->ppEnabledExtensionNames[i];
1559
1560 if (strcmp(name, VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
1561 instance_data->extensions.surface_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001562 }
1563#ifdef VK_USE_PLATFORM_XLIB_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001564 if (strcmp(name, VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
1565 instance_data->extensions.xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001566 }
1567#endif
1568#ifdef VK_USE_PLATFORM_XCB_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001569 if (strcmp(name, VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
1570 instance_data->extensions.xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001571 }
1572#endif
1573#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001574 if (strcmp(name, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
1575 instance_data->extensions.wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001576 }
1577#endif
1578#ifdef VK_USE_PLATFORM_MIR_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001579 if (strcmp(name, VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
1580 instance_data->extensions.mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001581 }
1582#endif
1583#ifdef VK_USE_PLATFORM_ANDROID_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001584 if (strcmp(name, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
1585 instance_data->extensions.android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001586 }
1587#endif
1588#ifdef VK_USE_PLATFORM_WIN32_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001589 if (strcmp(name, VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
1590 instance_data->extensions.win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001591 }
1592#endif
Chris Forbes6be763e2016-11-24 12:42:33 +13001593 if (strcmp(name, VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
1594 instance_data->extensions.display_enabled = true;
Chris Forbes2e47f432016-11-03 10:18:18 +13001595 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001596 }
1597}
1598
1599static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1600 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes27e49622016-11-02 17:54:21 +13001601 device_data->swapchain_enabled = false;
1602 device_data->display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001603 device_data->amd_negative_viewport_height_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001604
1605 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1606 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001607 device_data->swapchain_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001608 }
Mark Youngead9b932016-09-08 12:28:38 -06001609 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001610 device_data->display_swapchain_enabled = true;
Mark Youngead9b932016-09-08 12:28:38 -06001611 }
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001612 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME) == 0) {
1613 device_data->amd_negative_viewport_height_enabled = true;
1614 }
Mark Youngfa552782016-12-12 16:14:55 -07001615 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME) == 0) {
1616 device_data->nvx_device_generated_commands_enabled = true;
1617 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001618 }
1619}
1620
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001621void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001622 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001623
1624 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1625 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1626 my_device_data->queueFamilyIndexMap.insert(
1627 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1628 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001629 }
1630}
1631
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001632VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001633 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001634 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001635 * NOTE: We do not validate physicalDevice or any dispatchable
1636 * object as the first parameter. We couldn't get here if it was wrong!
1637 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001638
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001639 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001640 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001641 auto my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001642 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001643
Chris Forbes04b61da2016-11-03 09:53:59 +13001644 skip |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001645
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001646 if (pCreateInfo != NULL) {
1647 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001648 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001649 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001650 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001651 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001652 }
Michael Lentine774704f2016-01-27 13:36:46 -06001653
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001654 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001655 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001656 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001657 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001658 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001659 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001660 }
1661
Chris Forbes04b61da2016-11-03 09:53:59 +13001662 if (!skip) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001663 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001664 assert(chain_info != nullptr);
1665 assert(chain_info->u.pLayerInfo != nullptr);
1666
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001667 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1668 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001669 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001670 if (fpCreateDevice == NULL) {
1671 return VK_ERROR_INITIALIZATION_FAILED;
1672 }
1673
1674 // Advance the link info for the next element on the chain
1675 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1676
1677 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001678
1679 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1680
1681 if (result == VK_SUCCESS) {
1682 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1683 assert(my_device_data != nullptr);
1684
1685 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
Chris Forbese58c9fe2016-11-24 14:44:17 +13001686 layer_init_device_dispatch_table(*pDevice, &my_device_data->dispatch_table, fpGetDeviceProcAddr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001687
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001688 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1689
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001690 uint32_t count;
Chris Forbes6444bba2016-11-24 14:15:23 +13001691 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001692 std::vector<VkQueueFamilyProperties> properties(count);
Chris Forbes6444bba2016-11-24 14:15:23 +13001693 my_instance_data->dispatch_table.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001694
1695 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1696 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001697
1698 // Query and save physical device limits for this device
1699 VkPhysicalDeviceProperties device_properties = {};
Chris Forbes6444bba2016-11-24 14:15:23 +13001700 my_instance_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, &device_properties);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001701 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001702 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001703
1704 // Save app-enabled features in this device's layer_data structure
1705 if (pCreateInfo->pEnabledFeatures) {
1706 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1707 } else {
1708 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1709 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001710 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001711 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001712
Jeremy Hayes99a96322015-06-26 12:48:09 -06001713 return result;
1714}
1715
Chia-I Wu01ca2372016-05-13 14:37:49 +08001716VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001717 dispatch_key key = get_dispatch_key(device);
Chris Forbes04b61da2016-11-03 09:53:59 +13001718 bool skip = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001719 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1720 assert(my_data != NULL);
1721
Chris Forbes04b61da2016-11-03 09:53:59 +13001722 skip |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001723
Chris Forbes04b61da2016-11-03 09:53:59 +13001724 if (!skip) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001725 layer_debug_report_destroy_device(device);
1726
Jeremy Hayes99a96322015-06-26 12:48:09 -06001727#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001728 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001729#endif
1730
Chris Forbese58c9fe2016-11-24 14:44:17 +13001731 my_data->dispatch_table.DestroyDevice(device, pAllocator);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001732 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001733 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001734}
1735
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001736bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001737 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001738 assert(my_device_data != nullptr);
1739
Dustin Gravesde628532016-04-21 16:30:17 -06001740 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001741
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001742 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001743 if (queue_data->second <= queueIndex) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001744 log_msg(my_device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001745 LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07001746 "vkGetDeviceQueue() parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001747 "was created.",
1748 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001749 return false;
1750 }
1751 return true;
1752}
1753
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001754VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001755 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001756 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001757 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001758
Chris Forbes04b61da2016-11-03 09:53:59 +13001759 skip |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001760
Chris Forbes04b61da2016-11-03 09:53:59 +13001761 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001762 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1763
Chris Forbese58c9fe2016-11-24 14:44:17 +13001764 my_data->dispatch_table.GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001765 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001766}
1767
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001768VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001769 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001770 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001771 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001772 assert(my_data != NULL);
1773
Chris Forbes04b61da2016-11-03 09:53:59 +13001774 skip |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001775
Chris Forbes04b61da2016-11-03 09:53:59 +13001776 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001777 result = my_data->dispatch_table.QueueSubmit(queue, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001778
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001779 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001780 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001781
Jeremy Hayes99a96322015-06-26 12:48:09 -06001782 return result;
1783}
1784
Chia-I Wu01ca2372016-05-13 14:37:49 +08001785VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001786 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1787 assert(my_data != NULL);
1788
Chris Forbese58c9fe2016-11-24 14:44:17 +13001789 VkResult result = my_data->dispatch_table.QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001790
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001791 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001792
1793 return result;
1794}
1795
Chia-I Wu01ca2372016-05-13 14:37:49 +08001796VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001797 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1798 assert(my_data != NULL);
1799
Chris Forbese58c9fe2016-11-24 14:44:17 +13001800 VkResult result = my_data->dispatch_table.DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001801
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001802 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001803
1804 return result;
1805}
1806
Chia-I Wu01ca2372016-05-13 14:37:49 +08001807VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001808 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001809 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001810 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001811 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001812 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001813
Chris Forbes04b61da2016-11-03 09:53:59 +13001814 skip |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001815
Chris Forbes04b61da2016-11-03 09:53:59 +13001816 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001817 result = my_data->dispatch_table.AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001818
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001819 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001820 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001821
1822 return result;
1823}
1824
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001825VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001826 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001827 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001828 assert(my_data != NULL);
1829
Chris Forbes04b61da2016-11-03 09:53:59 +13001830 skip |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001831
Chris Forbes04b61da2016-11-03 09:53:59 +13001832 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001833 my_data->dispatch_table.FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001834 }
1835}
1836
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001837VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1838 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001839 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001840 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001841 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001842 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001843
Chris Forbes04b61da2016-11-03 09:53:59 +13001844 skip |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001845
Chris Forbes04b61da2016-11-03 09:53:59 +13001846 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001847 result = my_data->dispatch_table.MapMemory(device, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001848
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001849 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001850 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001851
1852 return result;
1853}
1854
Chia-I Wu01ca2372016-05-13 14:37:49 +08001855VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001856 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001857 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1858 assert(my_data != NULL);
1859
Chris Forbes04b61da2016-11-03 09:53:59 +13001860 skip |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001861
Chris Forbes04b61da2016-11-03 09:53:59 +13001862 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001863 my_data->dispatch_table.UnmapMemory(device, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001864 }
1865}
1866
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001867VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1868 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001869 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001870 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001871 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001872 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001873
Chris Forbes04b61da2016-11-03 09:53:59 +13001874 skip |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001875
Chris Forbes04b61da2016-11-03 09:53:59 +13001876 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001877 result = my_data->dispatch_table.FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001878
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001879 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001880 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001881
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001882 return result;
1883}
1884
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001885VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1886 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001887 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001888 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001889 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001890 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001891
Chris Forbes04b61da2016-11-03 09:53:59 +13001892 skip |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001893
Chris Forbes04b61da2016-11-03 09:53:59 +13001894 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001895 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13001896 my_data->dispatch_table.InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001897
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001898 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001899 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001900
Tony Barbourb1250542015-04-16 19:23:13 -06001901 return result;
1902}
1903
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001904VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1905 VkDeviceSize *pCommittedMemoryInBytes) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001906 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001907 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001908 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001909
Chris Forbes04b61da2016-11-03 09:53:59 +13001910 skip |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001911
Chris Forbes04b61da2016-11-03 09:53:59 +13001912 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001913 my_data->dispatch_table.GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001914 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001915}
1916
Chia-I Wu01ca2372016-05-13 14:37:49 +08001917VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1918 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001919 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001920 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001921 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1922 assert(my_data != NULL);
1923
Chris Forbes04b61da2016-11-03 09:53:59 +13001924 skip |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001925
Chris Forbes04b61da2016-11-03 09:53:59 +13001926 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001927 result = my_data->dispatch_table.BindBufferMemory(device, buffer, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001928
1929 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1930 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001931
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001932 return result;
1933}
1934
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001935VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001936 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001937 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001938 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1939 assert(my_data != NULL);
1940
Chris Forbes04b61da2016-11-03 09:53:59 +13001941 skip |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001942
Chris Forbes04b61da2016-11-03 09:53:59 +13001943 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001944 result = my_data->dispatch_table.BindImageMemory(device, image, memory, memoryOffset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001945
1946 validate_result(my_data->report_data, "vkBindImageMemory", result);
1947 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001948
1949 return result;
1950}
1951
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001952VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1953 VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001954 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001955 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001956 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001957
Chris Forbes04b61da2016-11-03 09:53:59 +13001958 skip |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001959
Chris Forbes04b61da2016-11-03 09:53:59 +13001960 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001961 my_data->dispatch_table.GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001962 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001963}
1964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001965VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001966 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001967 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001968 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001969
Chris Forbes04b61da2016-11-03 09:53:59 +13001970 skip |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001971
Chris Forbes04b61da2016-11-03 09:53:59 +13001972 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13001973 my_data->dispatch_table.GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001974 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001975}
1976
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001977bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1978 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001979 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001980 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001981 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001982 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1983 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001984 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 -06001985 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001986 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1987 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001988 return false;
1989 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001990 }
1991
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001992 return true;
1993}
1994
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001995VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1996 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001997 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001998 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001999 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002000
Chris Forbes04b61da2016-11-03 09:53:59 +13002001 skip |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002002 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002003
Chris Forbes04b61da2016-11-03 09:53:59 +13002004 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002005 my_data->dispatch_table.GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002006
2007 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2008 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002009}
2010
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002011bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2012 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2013 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Chris Forbes7b58a712016-11-24 11:35:31 +13002014 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002015 if (pProperties != nullptr) {
2016 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2017 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002018 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 -06002019 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002020 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2021 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002022 return false;
2023 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002024 }
2025
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002026 return true;
2027}
2028
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002029VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2030 VkImageType type, VkSampleCountFlagBits samples,
2031 VkImageUsageFlags usage, VkImageTiling tiling,
2032 uint32_t *pPropertyCount,
2033 VkSparseImageFormatProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002034 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13002035 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002036 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002037
Chris Forbes04b61da2016-11-03 09:53:59 +13002038 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002039 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002040
Chris Forbes04b61da2016-11-03 09:53:59 +13002041 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13002042 my_data->dispatch_table.GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling,
2043 pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002044
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002045 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2046 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002047 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002048}
2049
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002050VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2051 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002052 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002053 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002054 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002055 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002056
Chris Forbes04b61da2016-11-03 09:53:59 +13002057 skip |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002058
Chris Forbes04b61da2016-11-03 09:53:59 +13002059 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002060 result = my_data->dispatch_table.QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002061
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002062 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002063 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002064
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002065 return result;
2066}
2067
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002068VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2069 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002070 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002071 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002072 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002073 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002074
Chris Forbes04b61da2016-11-03 09:53:59 +13002075 skip |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002076
Chris Forbes04b61da2016-11-03 09:53:59 +13002077 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002078 result = my_data->dispatch_table.CreateFence(device, pCreateInfo, pAllocator, pFence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002079
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002080 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002081 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002082
2083 return result;
2084}
2085
Chia-I Wu01ca2372016-05-13 14:37:49 +08002086VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002087 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002088 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002089 assert(my_data != NULL);
2090
Chris Forbes04b61da2016-11-03 09:53:59 +13002091 skip |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002092
Chris Forbes04b61da2016-11-03 09:53:59 +13002093 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002094 my_data->dispatch_table.DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002095 }
2096}
2097
Chia-I Wu01ca2372016-05-13 14:37:49 +08002098VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002099 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002100 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002101 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002102 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002103
Chris Forbes04b61da2016-11-03 09:53:59 +13002104 skip |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002105
Chris Forbes04b61da2016-11-03 09:53:59 +13002106 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002107 result = my_data->dispatch_table.ResetFences(device, fenceCount, pFences);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002108
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002109 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002110 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002111
2112 return result;
2113}
2114
Chia-I Wu01ca2372016-05-13 14:37:49 +08002115VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002116 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002117 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002118 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2119 assert(my_data != NULL);
2120
Chris Forbes04b61da2016-11-03 09:53:59 +13002121 skip |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002122
Chris Forbes04b61da2016-11-03 09:53:59 +13002123 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002124 result = my_data->dispatch_table.GetFenceStatus(device, fence);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002125
2126 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2127 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002128
2129 return result;
2130}
2131
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002132VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2133 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002134 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002135 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002136 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002137 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002138
Chris Forbes04b61da2016-11-03 09:53:59 +13002139 skip |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002140
Chris Forbes04b61da2016-11-03 09:53:59 +13002141 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002142 result = my_data->dispatch_table.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002143
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002144 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002145 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002146
2147 return result;
2148}
2149
Chia-I Wu01ca2372016-05-13 14:37:49 +08002150VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002151 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002152 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002153 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002154 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002155 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002156
Chris Forbes04b61da2016-11-03 09:53:59 +13002157 skip |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002158
Chris Forbes04b61da2016-11-03 09:53:59 +13002159 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002160 result = my_data->dispatch_table.CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002161
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002162 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002163 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002164
2165 return result;
2166}
2167
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002168VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002169 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002170 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002171 assert(my_data != NULL);
2172
Chris Forbes04b61da2016-11-03 09:53:59 +13002173 skip |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002174
Chris Forbes04b61da2016-11-03 09:53:59 +13002175 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002176 my_data->dispatch_table.DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002177 }
2178}
2179
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002180VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2181 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002182 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002183 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002184 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002185 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002186
Chris Forbes04b61da2016-11-03 09:53:59 +13002187 skip |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002188
Chris Forbes04b61da2016-11-03 09:53:59 +13002189 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002190 result = my_data->dispatch_table.CreateEvent(device, pCreateInfo, pAllocator, pEvent);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002191
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002192 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002193 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002194
2195 return result;
2196}
2197
Chia-I Wu01ca2372016-05-13 14:37:49 +08002198VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002199 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002200 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002201 assert(my_data != NULL);
2202
Chris Forbes04b61da2016-11-03 09:53:59 +13002203 skip |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002204
Chris Forbes04b61da2016-11-03 09:53:59 +13002205 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002206 my_data->dispatch_table.DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002207 }
2208}
2209
Chia-I Wu01ca2372016-05-13 14:37:49 +08002210VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002211 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002212 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002213 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2214 assert(my_data != NULL);
2215
Chris Forbes04b61da2016-11-03 09:53:59 +13002216 skip |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002217
Chris Forbes04b61da2016-11-03 09:53:59 +13002218 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002219 result = my_data->dispatch_table.GetEventStatus(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002220
2221 validate_result(my_data->report_data, "vkGetEventStatus", result);
2222 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002223
2224 return result;
2225}
2226
Chia-I Wu01ca2372016-05-13 14:37:49 +08002227VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002228 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002229 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002230 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2231 assert(my_data != NULL);
2232
Chris Forbes04b61da2016-11-03 09:53:59 +13002233 skip |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002234
Chris Forbes04b61da2016-11-03 09:53:59 +13002235 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002236 result = my_data->dispatch_table.SetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002237
2238 validate_result(my_data->report_data, "vkSetEvent", result);
2239 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002240
2241 return result;
2242}
2243
Chia-I Wu01ca2372016-05-13 14:37:49 +08002244VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002245 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002246 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002247 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2248 assert(my_data != NULL);
2249
Chris Forbes04b61da2016-11-03 09:53:59 +13002250 skip |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002251
Chris Forbes04b61da2016-11-03 09:53:59 +13002252 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002253 result = my_data->dispatch_table.ResetEvent(device, event);
Dustin Graves20fd66f2016-04-18 18:33:21 -06002254
2255 validate_result(my_data->report_data, "vkResetEvent", result);
2256 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002257
2258 return result;
2259}
2260
Chia-I Wu01ca2372016-05-13 14:37:49 +08002261VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002262 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002263 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002264 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002265 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2266 assert(device_data != nullptr);
2267 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002268
Chris Forbes04b61da2016-11-03 09:53:59 +13002269 skip |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002270
Dustin Gravesc900f572016-05-16 11:07:59 -06002271 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2272 if (pCreateInfo != nullptr) {
2273 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2274 // VkQueryPipelineStatisticFlagBits values
2275 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2276 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002277 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002278 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07002279 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool(): if pCreateInfo->queryType is "
Dustin Gravesc900f572016-05-16 11:07:59 -06002280 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2281 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2282 }
2283 }
2284
Chris Forbes04b61da2016-11-03 09:53:59 +13002285 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002286 result = device_data->dispatch_table.CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002287
Dustin Gravesc900f572016-05-16 11:07:59 -06002288 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002289 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002290
2291 return result;
2292}
2293
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002294VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002295 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002296 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002297 assert(my_data != NULL);
2298
Chris Forbes04b61da2016-11-03 09:53:59 +13002299 skip |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002300
Chris Forbes04b61da2016-11-03 09:53:59 +13002301 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002302 my_data->dispatch_table.DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002303 }
2304}
2305
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002306VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2307 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002308 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002309 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002310 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002311 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002312
Chris Forbes04b61da2016-11-03 09:53:59 +13002313 skip |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002314 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002315
Chris Forbes04b61da2016-11-03 09:53:59 +13002316 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002317 result = my_data->dispatch_table.GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002318
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002319 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002320 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002321
2322 return result;
2323}
2324
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002325VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2326 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002327 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002328 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002329 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2330 assert(device_data != nullptr);
2331 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002332
Chris Forbes04b61da2016-11-03 09:53:59 +13002333 skip |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002334
Dustin Gravesc900f572016-05-16 11:07:59 -06002335 if (pCreateInfo != nullptr) {
Maciej Jesionowski420b1c32016-12-14 11:01:21 +01002336 // Buffer size must be greater than 0 (error 00663)
2337 skip |=
2338 ValidateGreaterThan(report_data, "vkCreateBuffer", "pCreateInfo->size", static_cast<uint32_t>(pCreateInfo->size), 0u);
2339
Dustin Gravesc900f572016-05-16 11:07:59 -06002340 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2341 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2342 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2343 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002344 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Karl Schultza9ef1e52016-10-06 17:53:48 -06002345 __LINE__, VALIDATION_ERROR_00665, LayerName,
2346 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2347 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2348 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002349 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002350
Dustin Gravesc900f572016-05-16 11:07:59 -06002351 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2352 // queueFamilyIndexCount uint32_t values
2353 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002354 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Karl Schultza9ef1e52016-10-06 17:53:48 -06002355 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002356 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2357 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002358 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2359 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002360 }
2361
2362 // Ensure that the queue family indices were specified at device creation
Chris Forbes04b61da2016-11-03 09:53:59 +13002363 skip |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesc900f572016-05-16 11:07:59 -06002364 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2365 }
Maciej Jesionowski420b1c32016-12-14 11:01:21 +01002366
2367 // If flags contains VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must also contain
2368 // VK_BUFFER_CREATE_SPARSE_BINDING_BIT
2369 if (((pCreateInfo->flags & (VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2370 ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) != VK_BUFFER_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski181ec3a2016-12-14 13:37:04 -07002371 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2372 VALIDATION_ERROR_00669, LayerName,
2373 "vkCreateBuffer: if pCreateInfo->flags contains VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or "
2374 "VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_BUFFER_CREATE_SPARSE_BINDING_BIT. %s",
2375 validation_error_map[VALIDATION_ERROR_00669]);
Maciej Jesionowski420b1c32016-12-14 11:01:21 +01002376 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002377 }
2378
Chris Forbes04b61da2016-11-03 09:53:59 +13002379 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002380 result = device_data->dispatch_table.CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002381
Dustin Gravesc900f572016-05-16 11:07:59 -06002382 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002383 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002384
2385 return result;
2386}
2387
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002388VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002389 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002390 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002391 assert(my_data != NULL);
2392
Chris Forbes04b61da2016-11-03 09:53:59 +13002393 skip |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002394
Chris Forbes04b61da2016-11-03 09:53:59 +13002395 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002396 my_data->dispatch_table.DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002397 }
2398}
2399
Chia-I Wu01ca2372016-05-13 14:37:49 +08002400VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2401 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002402 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002403 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002404 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002405 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002406
Chris Forbes04b61da2016-11-03 09:53:59 +13002407 skip |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002408
Chris Forbes04b61da2016-11-03 09:53:59 +13002409 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002410 result = my_data->dispatch_table.CreateBufferView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002411
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002412 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002413 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002414
2415 return result;
2416}
2417
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002418VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002419 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002420 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002421 assert(my_data != NULL);
2422
Chris Forbes04b61da2016-11-03 09:53:59 +13002423 skip |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002424
Chris Forbes04b61da2016-11-03 09:53:59 +13002425 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002426 my_data->dispatch_table.DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002427 }
2428}
2429
Chia-I Wu01ca2372016-05-13 14:37:49 +08002430VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2431 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002432 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002433 bool skip = false;
Dustin Gravesf8032f22016-05-11 18:31:44 -06002434 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002435 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002436 debug_report_data *report_data = device_data->report_data;
2437
Chris Forbes04b61da2016-11-03 09:53:59 +13002438 skip |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002439
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002440 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002441 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002442 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002443 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2444 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002445 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002446 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07002447 INVALID_USAGE, LayerName, "vkCreateImage(): if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
Dustin Gravesc900f572016-05-16 11:07:59 -06002448 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2449 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002450
Dustin Gravesc900f572016-05-16 11:07:59 -06002451 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2452 // queueFamilyIndexCount uint32_t values
2453 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002454 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002455 __LINE__, REQUIRED_PARAMETER, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07002456 "vkCreateImage(): if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
Dustin Gravesc900f572016-05-16 11:07:59 -06002457 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2458 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2459 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002460
Chris Forbes04b61da2016-11-03 09:53:59 +13002461 skip |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesf8032f22016-05-11 18:31:44 -06002462 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2463 }
2464
2465 // width, height, and depth members of extent must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002466 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2467 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002468 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
Chris Forbes04b61da2016-11-03 09:53:59 +13002469 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002470
2471 // mipLevels must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002472 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002473
2474 // arrayLayers must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002475 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002476
2477 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2478 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002479 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07002480 LayerName, "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002481 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002482 }
2483
2484 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2485 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2486 // extent.height must be equal
2487 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2488 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002489 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07002490 LayerName, "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002491 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2492 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002493 }
2494
2495 if (pCreateInfo->extent.depth != 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002496 skip |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002497 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07002498 "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002499 }
2500 }
2501
2502 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2503 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2504 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002505 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002506 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07002507 "vkCreateImage(): pCreateInfo->mipLevels must be less than or equal to "
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002508 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002509 }
2510
2511 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2512 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2513 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2514 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski181ec3a2016-12-14 13:37:04 -07002515 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2516 VALIDATION_ERROR_02160, LayerName,
2517 "vkCreateImage: if pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2518 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT. %s",
2519 validation_error_map[VALIDATION_ERROR_02160]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002520 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002521 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002522
Chris Forbes04b61da2016-11-03 09:53:59 +13002523 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002524 result = device_data->dispatch_table.CreateImage(device, pCreateInfo, pAllocator, pImage);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002525
Dustin Gravesf8032f22016-05-11 18:31:44 -06002526 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002527 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002528
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002529 return result;
2530}
2531
Chia-I Wu01ca2372016-05-13 14:37:49 +08002532VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002533 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002534 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002535 assert(my_data != NULL);
2536
Chris Forbes04b61da2016-11-03 09:53:59 +13002537 skip |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002538
Chris Forbes04b61da2016-11-03 09:53:59 +13002539 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002540 my_data->dispatch_table.DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002541 }
2542}
2543
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002544bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002545 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002546 if (pSubresource != nullptr) {
2547 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2548 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002549 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 -06002550 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002551 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2552 return false;
2553 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002554 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002555
2556 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002557}
2558
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002559VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2560 VkSubresourceLayout *pLayout) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002561 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002562 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002563 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002564
Chris Forbes04b61da2016-11-03 09:53:59 +13002565 skip |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002566
Chris Forbes04b61da2016-11-03 09:53:59 +13002567 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002568 PreGetImageSubresourceLayout(device, pSubresource);
2569
Chris Forbese58c9fe2016-11-24 14:44:17 +13002570 my_data->dispatch_table.GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002571 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002572}
2573
Chia-I Wu01ca2372016-05-13 14:37:49 +08002574VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2575 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002576 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002577 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002578 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002579 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002580 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002581
Chris Forbes04b61da2016-11-03 09:53:59 +13002582 skip |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002583
Dustin Graves0b70a632016-04-27 17:44:56 -06002584 if (pCreateInfo != nullptr) {
2585 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002586 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2587 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002588 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002589 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2590 "pCreateInfo->subresourceRange.layerCount must be 1",
2591 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2592 }
2593 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002594 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2595 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2596 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002597 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002598 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2599 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2600 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2601 }
2602 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002603 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2604 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002605 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002606 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2607 "pCreateInfo->subresourceRange.layerCount must be 6");
2608 }
2609 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002610 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2611 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002612 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002613 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2614 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2615 }
2616 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2617 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002618 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002619 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2620 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2621 }
2622
Dustin Graves2a80dc62016-07-12 13:57:02 -06002623 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2624 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002625 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002626 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2627 "pCreateInfo->subresourceRange.layerCount must be 1");
2628 }
2629 }
2630 }
2631
Chris Forbes04b61da2016-11-03 09:53:59 +13002632 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002633 result = my_data->dispatch_table.CreateImageView(device, pCreateInfo, pAllocator, pView);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002634
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002635 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002636 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002637
2638 return result;
2639}
2640
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002641VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002642 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002643 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002644 assert(my_data != NULL);
2645
Chris Forbes04b61da2016-11-03 09:53:59 +13002646 skip |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002647
Chris Forbes04b61da2016-11-03 09:53:59 +13002648 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002649 my_data->dispatch_table.DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002650 }
2651}
2652
Chia-I Wu01ca2372016-05-13 14:37:49 +08002653VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002654 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002655 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002656 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002657 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002658 assert(my_data != NULL);
2659
Chris Forbes04b61da2016-11-03 09:53:59 +13002660 skip |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002661
Chris Forbes04b61da2016-11-03 09:53:59 +13002662 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002663 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13002664 my_data->dispatch_table.CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002665
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002666 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002667 }
2668
Michael Lentine03d8e572015-09-15 14:59:14 -05002669 return result;
2670}
2671
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002672VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2673 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002674 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002675 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002676 assert(my_data != NULL);
2677
Chris Forbes04b61da2016-11-03 09:53:59 +13002678 skip |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002679
Chris Forbes04b61da2016-11-03 09:53:59 +13002680 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002681 my_data->dispatch_table.DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002682 }
2683}
2684
Chia-I Wu01ca2372016-05-13 14:37:49 +08002685VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002686 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002687 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002688 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002689 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002690 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002691
Chris Forbes04b61da2016-11-03 09:53:59 +13002692 skip |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002693
Chris Forbes04b61da2016-11-03 09:53:59 +13002694 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002695 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13002696 my_data->dispatch_table.CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002697
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002698 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002699 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002700
2701 return result;
2702}
2703
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002704VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2705 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002706 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002707 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002708 assert(my_data != NULL);
2709
Chris Forbes04b61da2016-11-03 09:53:59 +13002710 skip |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002711
Chris Forbes04b61da2016-11-03 09:53:59 +13002712 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002713 my_data->dispatch_table.DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002714 }
2715}
2716
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002717VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2718 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002719 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002720 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002721 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002722 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002723
Chris Forbes04b61da2016-11-03 09:53:59 +13002724 skip |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002725
Chris Forbes04b61da2016-11-03 09:53:59 +13002726 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002727 result = my_data->dispatch_table.GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002728
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002729 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002730 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002731
2732 return result;
2733}
2734
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002735VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2736 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002737 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002738 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002739 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002740 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002741
Chris Forbes04b61da2016-11-03 09:53:59 +13002742 skip |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002743
Chris Forbes04b61da2016-11-03 09:53:59 +13002744 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13002745 result = my_data->dispatch_table.MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002746
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002747 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002748 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002749
2750 return result;
2751}
2752
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002753bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002754 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2755
2756 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002757 if (pCreateInfos != nullptr) {
Maks Naumov34f52a12016-12-28 01:15:17 +02002758 if (pCreateInfos->flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002759 if (pCreateInfos->basePipelineIndex != -1) {
2760 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002761 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002762 VALIDATION_ERROR_00526, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002763 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2764 "pCreateInfos->flags "
Mike Weiblen9858d962016-10-31 23:59:10 -06002765 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1. %s",
2766 validation_error_map[VALIDATION_ERROR_00526]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002767 return false;
2768 }
2769 }
2770
2771 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2772 if (pCreateInfos->basePipelineIndex != -1) {
2773 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002774 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 -06002775 VALIDATION_ERROR_00528, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002776 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2777 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
Mike Weiblen9858d962016-10-31 23:59:10 -06002778 "VK_NULL_HANDLE. %s",
2779 validation_error_map[VALIDATION_ERROR_00528]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002780 return false;
2781 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002782 }
2783 }
2784
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002785 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002786 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002787 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002788 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002789 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2790 "unrecognized enumerator");
2791 return false;
2792 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002793
2794 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2795 (data->physical_device_features.fillModeNonSolid == false)) {
2796 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002797 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 -06002798 DEVICE_FEATURE, LayerName,
2799 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2800 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2801 return false;
2802 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002803 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002804
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002805 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002806 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002807 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2808 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002809 pCreateInfos[i].pStages[j].pName);
2810 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002811 }
2812
2813 return true;
2814}
2815
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002816VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2817 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2818 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002819 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002820 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002821 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2822 assert(device_data != nullptr);
2823 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002824
Chris Forbes04b61da2016-11-03 09:53:59 +13002825 skip |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
Dustin Gravesc900f572016-05-16 11:07:59 -06002826 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002827
Dustin Gravesc900f572016-05-16 11:07:59 -06002828 if (pCreateInfos != nullptr) {
2829 for (uint32_t i = 0; i < createInfoCount; ++i) {
2830 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2831 if (pCreateInfos[i].pTessellationState == nullptr) {
2832 if (pCreateInfos[i].pStages != nullptr) {
2833 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2834 // pTessellationState must not be NULL
2835 bool has_control = false;
2836 bool has_eval = false;
2837
2838 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2839 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2840 has_control = true;
2841 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2842 has_eval = true;
2843 }
2844 }
2845
2846 if (has_control && has_eval) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002847 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 -06002848 __LINE__, VALIDATION_ERROR_00536, LayerName,
2849 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2850 "control shader stage and a tessellation evaluation shader stage, "
2851 "pCreateInfos[%d].pTessellationState must not be NULL. %s",
2852 i, i, validation_error_map[VALIDATION_ERROR_00536]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002853 }
2854 }
Dustin Graves629259b2016-05-30 16:14:27 -06002855 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002856 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002857 report_data, "vkCreateGraphicsPipelines",
2858 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2859 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002860
Chris Forbes04b61da2016-11-03 09:53:59 +13002861 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002862 report_data, "vkCreateGraphicsPipelines",
2863 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2864 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002865
2866 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002867 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 -06002868 __LINE__, VALIDATION_ERROR_00538, LayerName,
2869 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2870 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO. %s",
2871 i, validation_error_map[VALIDATION_ERROR_00538]);
Dustin Graves629259b2016-05-30 16:14:27 -06002872 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002873 }
2874
2875 if (pCreateInfos[i].pViewportState == nullptr) {
2876 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2877 // valid VkPipelineViewportStateCreateInfo structure
2878 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2879 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002880 skip |= log_msg(
Dustin Gravesc900f572016-05-16 11:07:59 -06002881 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002882 VALIDATION_ERROR_02113, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002883 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
Mike Weiblen9858d962016-10-31 23:59:10 -06002884 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure. "
2885 "%s",
2886 i, i, validation_error_map[VALIDATION_ERROR_02113]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002887 }
2888 } else {
Mark Lobodzinskib81000e2016-12-16 13:08:00 -07002889 if (pCreateInfos[i].pViewportState->scissorCount != pCreateInfos[i].pViewportState->viewportCount) {
2890 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
2891 VALIDATION_ERROR_01434, LayerName,
2892 "Graphics Pipeline viewport count (%u) must match scissor count (%u). %s",
2893 pCreateInfos[i].pViewportState->viewportCount, pCreateInfos[i].pViewportState->scissorCount,
2894 validation_error_map[VALIDATION_ERROR_01434]);
2895 }
2896
Chris Forbes04b61da2016-11-03 09:53:59 +13002897 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002898 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2899 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2900 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002901
Chris Forbes04b61da2016-11-03 09:53:59 +13002902 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002903 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2904 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002905 pCreateInfos[i].pViewportState->flags);
2906
Dustin Gravesc900f572016-05-16 11:07:59 -06002907 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002908 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002909 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2910 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2911 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2912 i);
2913 }
2914
Mark Lobodzinskid40eeb12016-12-18 09:43:01 -07002915 if (device_data->physical_device_features.multiViewport == false) {
2916 if (pCreateInfos[i].pViewportState->viewportCount != 1) {
2917 skip |=
2918 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2919 __LINE__, VALIDATION_ERROR_01430, LayerName,
2920 "vkCreateGraphicsPipelines: The multiViewport feature is not enabled, so "
2921 "pCreateInfos[%d].pViewportState->viewportCount must be 1 but is %d. %s",
2922 i, pCreateInfos[i].pViewportState->viewportCount, validation_error_map[VALIDATION_ERROR_01430]);
2923 }
2924 if (pCreateInfos[i].pViewportState->scissorCount != 1) {
2925 skip |=
2926 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2927 __LINE__, VALIDATION_ERROR_01431, LayerName,
2928 "vkCreateGraphicsPipelines: The multiViewport feature is not enabled, so "
2929 "pCreateInfos[%d].pViewportState->scissorCount must be 1 but is %d. %s",
2930 i, pCreateInfos[i].pViewportState->scissorCount, validation_error_map[VALIDATION_ERROR_01431]);
2931 }
2932 } else {
2933 if ((pCreateInfos[i].pViewportState->viewportCount < 1) ||
2934 (pCreateInfos[i].pViewportState->viewportCount > device_data->device_limits.maxViewports)) {
2935 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2936 __LINE__, VALIDATION_ERROR_01432, LayerName,
2937 "vkCreateGraphicsPipelines: multiViewport feature is enabled; "
2938 "pCreateInfos[%d].pViewportState->viewportCount is %d but must be between 1 and "
2939 "maxViewports (%d), inclusive. %s",
2940 i, pCreateInfos[i].pViewportState->viewportCount, device_data->device_limits.maxViewports,
2941 validation_error_map[VALIDATION_ERROR_01432]);
2942 }
2943 if ((pCreateInfos[i].pViewportState->scissorCount < 1) ||
2944 (pCreateInfos[i].pViewportState->scissorCount > device_data->device_limits.maxViewports)) {
2945 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2946 __LINE__, VALIDATION_ERROR_01433, LayerName,
2947 "vkCreateGraphicsPipelines: multiViewport feature is enabled; "
2948 "pCreateInfos[%d].pViewportState->scissorCount is %d but must be between 1 and "
2949 "maxViewports (%d), inclusive. %s",
2950 i, pCreateInfos[i].pViewportState->scissorCount, device_data->device_limits.maxViewports,
2951 validation_error_map[VALIDATION_ERROR_01433]);
2952 }
2953 }
2954
Dustin Gravesc900f572016-05-16 11:07:59 -06002955 if (pCreateInfos[i].pDynamicState != nullptr) {
2956 bool has_dynamic_viewport = false;
2957 bool has_dynamic_scissor = false;
2958
2959 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2960 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2961 has_dynamic_viewport = true;
2962 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2963 has_dynamic_scissor = true;
2964 }
2965 }
2966
Dustin Gravesc900f572016-05-16 11:07:59 -06002967 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2968 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2969 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002970 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002971 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 -06002972 __LINE__, VALIDATION_ERROR_02110, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002973 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002974 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL. %s",
2975 i, i, validation_error_map[VALIDATION_ERROR_02110]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002976 }
2977
Dustin Gravesc900f572016-05-16 11:07:59 -06002978 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2979 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2980 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002981 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002982 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 -06002983 __LINE__, VALIDATION_ERROR_02111, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002984 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002985 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL. %s",
2986 i, i, validation_error_map[VALIDATION_ERROR_02111]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002987 }
2988 }
2989 }
2990
2991 if (pCreateInfos[i].pMultisampleState == nullptr) {
2992 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2993 // a valid VkPipelineMultisampleStateCreateInfo structure
2994 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2995 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
Mike Weiblen9858d962016-10-31 23:59:10 -06002996 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2997 __LINE__, VALIDATION_ERROR_02114, LayerName,
2998 "vkCreateGraphicsPipelines: if "
2999 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
3000 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL. %s",
3001 i, i, validation_error_map[VALIDATION_ERROR_02114]);
Dustin Gravesc900f572016-05-16 11:07:59 -06003002 }
Dustin Graves629259b2016-05-30 16:14:27 -06003003 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13003004 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003005 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3006 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003007 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003008
Chris Forbes04b61da2016-11-03 09:53:59 +13003009 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003010 report_data, "vkCreateGraphicsPipelines",
3011 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
3012 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003013
Chris Forbes04b61da2016-11-03 09:53:59 +13003014 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003015 report_data, "vkCreateGraphicsPipelines",
3016 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
3017 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003018
Chris Forbes04b61da2016-11-03 09:53:59 +13003019 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003020 report_data, "vkCreateGraphicsPipelines",
3021 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3022 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3023 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3024 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003025
Chris Forbes04b61da2016-11-03 09:53:59 +13003026 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003027 report_data, "vkCreateGraphicsPipelines",
3028 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3029 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003030
Chris Forbes04b61da2016-11-03 09:53:59 +13003031 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003032 report_data, "vkCreateGraphicsPipelines",
3033 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3034 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003035
3036 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003037 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Graves629259b2016-05-30 16:14:27 -06003038 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3039 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3040 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3041 i);
3042 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003043 }
3044
3045 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003046 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003047 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003048 report_data, "vkCreateGraphicsPipelines",
3049 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3050 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003051
Chris Forbes04b61da2016-11-03 09:53:59 +13003052 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003053 report_data, "vkCreateGraphicsPipelines",
3054 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3055 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003056
Chris Forbes04b61da2016-11-03 09:53:59 +13003057 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003058 report_data, "vkCreateGraphicsPipelines",
3059 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3060 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003061
Chris Forbes04b61da2016-11-03 09:53:59 +13003062 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003063 report_data, "vkCreateGraphicsPipelines",
3064 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3065 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003066
Chris Forbes04b61da2016-11-03 09:53:59 +13003067 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003068 report_data, "vkCreateGraphicsPipelines",
3069 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3070 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3071 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003072
Chris Forbes04b61da2016-11-03 09:53:59 +13003073 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003074 report_data, "vkCreateGraphicsPipelines",
3075 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3076 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003077
Chris Forbes04b61da2016-11-03 09:53:59 +13003078 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003079 report_data, "vkCreateGraphicsPipelines",
3080 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3081 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003082
Chris Forbes04b61da2016-11-03 09:53:59 +13003083 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003084 report_data, "vkCreateGraphicsPipelines",
3085 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3086 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3087 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003088
Chris Forbes04b61da2016-11-03 09:53:59 +13003089 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003090 report_data, "vkCreateGraphicsPipelines",
3091 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3092 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3093 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003094
Chris Forbes04b61da2016-11-03 09:53:59 +13003095 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003096 report_data, "vkCreateGraphicsPipelines",
3097 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3098 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3099 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003100
Chris Forbes04b61da2016-11-03 09:53:59 +13003101 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003102 report_data, "vkCreateGraphicsPipelines",
3103 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3104 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3105 pCreateInfos[i].pDepthStencilState->front.compareOp);
3106
Chris Forbes04b61da2016-11-03 09:53:59 +13003107 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003108 report_data, "vkCreateGraphicsPipelines",
3109 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003110 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3111
Chris Forbes04b61da2016-11-03 09:53:59 +13003112 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003113 report_data, "vkCreateGraphicsPipelines",
3114 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003115 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3116
Chris Forbes04b61da2016-11-03 09:53:59 +13003117 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003118 report_data, "vkCreateGraphicsPipelines",
3119 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3120 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3121 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003122
Chris Forbes04b61da2016-11-03 09:53:59 +13003123 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003124 report_data, "vkCreateGraphicsPipelines",
3125 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3126 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3127 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003128
3129 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003130 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Graves629259b2016-05-30 16:14:27 -06003131 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3132 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3133 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3134 i);
3135 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003136 }
3137
3138 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3139 if (pCreateInfos[i].pColorBlendState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003140 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003141 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3142 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3143 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003144
Chris Forbes04b61da2016-11-03 09:53:59 +13003145 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003146 report_data, "vkCreateGraphicsPipelines",
3147 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3148 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003149
Chris Forbes04b61da2016-11-03 09:53:59 +13003150 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003151 report_data, "vkCreateGraphicsPipelines",
3152 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3153 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003154
Chris Forbes04b61da2016-11-03 09:53:59 +13003155 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003156 report_data, "vkCreateGraphicsPipelines",
3157 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3158 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3159 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003160
3161 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3162 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3163 ++attachmentIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003164 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003165 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3166 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3167 ParameterName::IndexVector{i, attachmentIndex}),
3168 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003169
Chris Forbes04b61da2016-11-03 09:53:59 +13003170 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003171 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003172 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3173 ParameterName::IndexVector{i, attachmentIndex}),
3174 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003175 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3176
Chris Forbes04b61da2016-11-03 09:53:59 +13003177 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003178 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003179 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3180 ParameterName::IndexVector{i, attachmentIndex}),
3181 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003182 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3183
Chris Forbes04b61da2016-11-03 09:53:59 +13003184 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003185 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3186 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3187 ParameterName::IndexVector{i, attachmentIndex}),
3188 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3189 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003190
Chris Forbes04b61da2016-11-03 09:53:59 +13003191 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003192 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003193 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3194 ParameterName::IndexVector{i, attachmentIndex}),
3195 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003196 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3197
Chris Forbes04b61da2016-11-03 09:53:59 +13003198 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003199 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003200 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3201 ParameterName::IndexVector{i, attachmentIndex}),
3202 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003203 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3204
Chris Forbes04b61da2016-11-03 09:53:59 +13003205 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003206 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3207 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3208 ParameterName::IndexVector{i, attachmentIndex}),
3209 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3210 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003211
Chris Forbes04b61da2016-11-03 09:53:59 +13003212 skip |=
Dustin Graves629259b2016-05-30 16:14:27 -06003213 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003214 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3215 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003216 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3217 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3218 }
3219 }
3220
Dustin Gravesc900f572016-05-16 11:07:59 -06003221 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003222 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003223 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3224 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3225 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3226 i);
3227 }
3228
3229 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3230 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003231 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003232 report_data, "vkCreateGraphicsPipelines",
3233 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003234 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3235 }
3236 }
3237 }
3238 }
3239
Chris Forbes04b61da2016-11-03 09:53:59 +13003240 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003241 PreCreateGraphicsPipelines(device, pCreateInfos);
3242
Chris Forbese58c9fe2016-11-24 14:44:17 +13003243 result = device_data->dispatch_table.CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003244
Dustin Gravesc900f572016-05-16 11:07:59 -06003245 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003246 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003247
3248 return result;
3249}
3250
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003251bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003252 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3253
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003254 if (pCreateInfos != nullptr) {
3255 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003256 uint32_t i = 0;
3257 validate_string(data->report_data, "vkCreateComputePipelines",
3258 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003259 }
3260
3261 return true;
3262}
3263
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003264VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3265 const VkComputePipelineCreateInfo *pCreateInfos,
3266 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003267 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003268 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003269 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003270 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003271
Chris Forbes04b61da2016-11-03 09:53:59 +13003272 skip |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003273 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003274
Chris Forbes04b61da2016-11-03 09:53:59 +13003275 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003276 PreCreateComputePipelines(device, pCreateInfos);
3277
Chris Forbese58c9fe2016-11-24 14:44:17 +13003278 result = my_data->dispatch_table.CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003279
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003280 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003281 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003282
3283 return result;
3284}
3285
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003286VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003287 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003288 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003289 assert(my_data != NULL);
3290
Chris Forbes04b61da2016-11-03 09:53:59 +13003291 skip |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003292
Chris Forbes04b61da2016-11-03 09:53:59 +13003293 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003294 my_data->dispatch_table.DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003295 }
3296}
3297
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003298VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3299 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003300 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003301 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003302 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003303 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003304
Chris Forbes04b61da2016-11-03 09:53:59 +13003305 skip |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003306
Chris Forbes04b61da2016-11-03 09:53:59 +13003307 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003308 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13003309 my_data->dispatch_table.CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003310
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003311 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003312 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003313
3314 return result;
3315}
3316
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003317VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3318 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003319 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003320 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003321 assert(my_data != NULL);
3322
Chris Forbes04b61da2016-11-03 09:53:59 +13003323 skip |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003324
Chris Forbes04b61da2016-11-03 09:53:59 +13003325 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003326 my_data->dispatch_table.DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003327 }
3328}
3329
Chia-I Wu01ca2372016-05-13 14:37:49 +08003330VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3331 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003332 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003333 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003334 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3335 assert(device_data != NULL);
3336 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003337
Chris Forbes04b61da2016-11-03 09:53:59 +13003338 skip |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003339
Dustin Gravesc900f572016-05-16 11:07:59 -06003340 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3341 if (pCreateInfo != nullptr) {
3342 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3343 if (pCreateInfo->compareEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003344 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003345 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3346 }
3347
3348 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3349 // valid VkBorderColor value
3350 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3351 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3352 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003353 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
Dustin Gravesc900f572016-05-16 11:07:59 -06003354 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3355 }
3356 }
3357
Chris Forbes04b61da2016-11-03 09:53:59 +13003358 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003359 result = device_data->dispatch_table.CreateSampler(device, pCreateInfo, pAllocator, pSampler);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003360
Dustin Gravesc900f572016-05-16 11:07:59 -06003361 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003362 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003363
3364 return result;
3365}
3366
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003367VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003368 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003369 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003370 assert(my_data != NULL);
3371
Chris Forbes04b61da2016-11-03 09:53:59 +13003372 skip |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003373
Chris Forbes04b61da2016-11-03 09:53:59 +13003374 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003375 my_data->dispatch_table.DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003376 }
3377}
3378
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003379VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3380 const VkAllocationCallbacks *pAllocator,
3381 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003382 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003383 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003384 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3385 assert(device_data != nullptr);
3386 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003387
Chris Forbes04b61da2016-11-03 09:53:59 +13003388 skip |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003389
Dustin Gravesc900f572016-05-16 11:07:59 -06003390 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3391 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3392 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3393 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3394 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3395 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3396 // valid VkSampler handles
3397 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3398 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3399 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3400 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3401 ++descriptor_index) {
3402 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003403 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003404 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3405 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3406 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3407 " specified as VK_NULL_HANDLE",
3408 i, descriptor_index);
3409 }
3410 }
3411 }
3412
3413 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3414 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3415 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003416 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003417 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3418 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07003419 "vkCreateDescriptorSetLayout(): if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
Dustin Gravesc900f572016-05-16 11:07:59 -06003420 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3421 i, i);
3422 }
3423 }
3424 }
3425 }
3426
Chris Forbes04b61da2016-11-03 09:53:59 +13003427 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003428 result = device_data->dispatch_table.CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003429
Dustin Gravesc900f572016-05-16 11:07:59 -06003430 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003431 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003432
3433 return result;
3434}
3435
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003436VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3437 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003438 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003439 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003440 assert(my_data != NULL);
3441
Chris Forbes04b61da2016-11-03 09:53:59 +13003442 skip |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003443
Chris Forbes04b61da2016-11-03 09:53:59 +13003444 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003445 my_data->dispatch_table.DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003446 }
3447}
3448
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003449VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3450 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003451 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003452 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003453 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003454 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003455
Chris Forbes04b61da2016-11-03 09:53:59 +13003456 skip |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003457
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003458 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3459
Chris Forbes04b61da2016-11-03 09:53:59 +13003460 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003461 result =
Chris Forbese58c9fe2016-11-24 14:44:17 +13003462 my_data->dispatch_table.CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003463
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003464 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003465 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003466
3467 return result;
3468}
3469
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003470VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3471 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003472 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003473 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003474 assert(my_data != NULL);
3475
Chris Forbes04b61da2016-11-03 09:53:59 +13003476 skip |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003477
Chris Forbes04b61da2016-11-03 09:53:59 +13003478 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003479 my_data->dispatch_table.DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003480 }
3481}
3482
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003483VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3484 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003485 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003486 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003487 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3488 assert(my_data != NULL);
3489
Chris Forbes04b61da2016-11-03 09:53:59 +13003490 skip |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003491
Chris Forbes04b61da2016-11-03 09:53:59 +13003492 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003493 result = my_data->dispatch_table.ResetDescriptorPool(device, descriptorPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06003494
3495 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3496 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003497
3498 return result;
3499}
3500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003501VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3502 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003503 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003504 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003505 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003506 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003507
Chris Forbes04b61da2016-11-03 09:53:59 +13003508 skip |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003509
Chris Forbes04b61da2016-11-03 09:53:59 +13003510 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003511 result = my_data->dispatch_table.AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003512
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003513 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003514 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003515
3516 return result;
3517}
3518
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003519VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003520 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003521 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003522 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003523 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3524 assert(device_data != nullptr);
3525 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003526
Chris Forbes04b61da2016-11-03 09:53:59 +13003527 skip |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003528
Dustin Gravesc900f572016-05-16 11:07:59 -06003529 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3530 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3531 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003532 skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003533 pDescriptorSets, true, true);
3534
Chris Forbes04b61da2016-11-03 09:53:59 +13003535 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003536 result = device_data->dispatch_table.FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003537
Dustin Gravesc900f572016-05-16 11:07:59 -06003538 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003539 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003540
3541 return result;
3542}
3543
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003544VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3545 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3546 const VkCopyDescriptorSet *pDescriptorCopies) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003547 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003548 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3549 assert(device_data != NULL);
3550 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003551
Chris Forbes04b61da2016-11-03 09:53:59 +13003552 skip |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
Dustin Gravesc900f572016-05-16 11:07:59 -06003553 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003554
Dustin Gravesc900f572016-05-16 11:07:59 -06003555 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3556 if (pDescriptorWrites != NULL) {
3557 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3558 // descriptorCount must be greater than 0
3559 if (pDescriptorWrites[i].descriptorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003560 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003561 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3562 REQUIRED_PARAMETER, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07003563 "vkUpdateDescriptorSets(): parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
Dustin Gravesc900f572016-05-16 11:07:59 -06003564 }
3565
3566 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3567 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3568 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3569 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3570 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3571 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3572 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3573 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3574 if (pDescriptorWrites[i].pImageInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003575 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003576 __LINE__, REQUIRED_PARAMETER, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07003577 "vkUpdateDescriptorSets(): if pDescriptorWrites[%d].descriptorType is "
Dustin Gravesc900f572016-05-16 11:07:59 -06003578 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3579 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3580 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3581 i, i);
3582 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3583 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3584 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3585 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3586 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3587 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003588 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003589 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3590 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003591 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
Chris Forbes04b61da2016-11-03 09:53:59 +13003592 skip |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003593 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3594 ParameterName::IndexVector{i, descriptor_index}),
3595 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003596 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3597 }
3598 }
3599 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3600 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3601 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3602 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3603 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3604 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3605 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3606 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003607 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003608 __LINE__, REQUIRED_PARAMETER, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07003609 "vkUpdateDescriptorSets(): if pDescriptorWrites[%d].descriptorType is "
Dustin Gravesc900f572016-05-16 11:07:59 -06003610 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3611 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3612 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3613 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003614 } else {
3615 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003616 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003617 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3618 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003619 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3620 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003621 }
3622 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3623 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3624 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3625 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3626 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003627 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003628 __LINE__, REQUIRED_PARAMETER, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07003629 "vkUpdateDescriptorSets(): if pDescriptorWrites[%d].descriptorType is "
Dustin Gravesc900f572016-05-16 11:07:59 -06003630 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3631 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3632 i, i);
3633 } else {
3634 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3635 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003636 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003637 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3638 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003639 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3640 }
3641 }
3642 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003643
3644 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3645 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3646 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3647 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3648 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3649 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003650 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003651 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003652 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003653 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3654 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3655 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3656 }
3657 }
3658 }
3659 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3660 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3661 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3662 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3663 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3664 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003665 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003666 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003667 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003668 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3669 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3670 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3671 }
3672 }
3673 }
3674 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003675 }
3676 }
3677
Chris Forbes04b61da2016-11-03 09:53:59 +13003678 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003679 device_data->dispatch_table.UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003680 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003681}
3682
Chia-I Wu01ca2372016-05-13 14:37:49 +08003683VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003684 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003685 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003686 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003687 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003688 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003689
Chris Forbes04b61da2016-11-03 09:53:59 +13003690 skip |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003691
Chris Forbes04b61da2016-11-03 09:53:59 +13003692 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003693 result = my_data->dispatch_table.CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003694
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003695 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003696 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003697
3698 return result;
3699}
3700
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003701VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003702 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003703 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003704 assert(my_data != NULL);
3705
Chris Forbes04b61da2016-11-03 09:53:59 +13003706 skip |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003707
Chris Forbes04b61da2016-11-03 09:53:59 +13003708 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003709 my_data->dispatch_table.DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003710 }
3711}
3712
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003713bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003714 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003715 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3716
3717 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3718 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003719 skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003720 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003721 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3722 }
3723 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003724 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003725}
3726
Chia-I Wu01ca2372016-05-13 14:37:49 +08003727VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003728 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003729 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003730 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003731 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003732 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003733
Chris Forbes04b61da2016-11-03 09:53:59 +13003734 skip |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3735 skip |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003736
Chris Forbes04b61da2016-11-03 09:53:59 +13003737 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003738 result = my_data->dispatch_table.CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003739
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003740 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003741 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003742
3743 return result;
3744}
3745
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003746VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003747 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003748 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003749 assert(my_data != NULL);
3750
Chris Forbes04b61da2016-11-03 09:53:59 +13003751 skip |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003752
Chris Forbes04b61da2016-11-03 09:53:59 +13003753 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003754 my_data->dispatch_table.DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003755 }
3756}
3757
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003758VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003759 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003760 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003761 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003762
Chris Forbes04b61da2016-11-03 09:53:59 +13003763 skip |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003764
Chris Forbes04b61da2016-11-03 09:53:59 +13003765 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003766 my_data->dispatch_table.GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003767 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003768}
3769
Chia-I Wu01ca2372016-05-13 14:37:49 +08003770VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003771 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003772 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003773 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003774 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003775 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003776
Chris Forbes04b61da2016-11-03 09:53:59 +13003777 skip |=
Dustin Gravesde628532016-04-21 16:30:17 -06003778 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003779
Chris Forbes04b61da2016-11-03 09:53:59 +13003780 skip |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003781
Chris Forbes04b61da2016-11-03 09:53:59 +13003782 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003783 result = my_data->dispatch_table.CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003784
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003785 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003786 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003787
3788 return result;
3789}
3790
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003791VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003792 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003793 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003794 assert(my_data != NULL);
3795
Chris Forbes04b61da2016-11-03 09:53:59 +13003796 skip |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003797
Chris Forbes04b61da2016-11-03 09:53:59 +13003798 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003799 my_data->dispatch_table.DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003800 }
3801}
3802
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003803VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003804 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003805 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003806 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3807 assert(my_data != NULL);
3808
Chris Forbes04b61da2016-11-03 09:53:59 +13003809 skip |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003810
Chris Forbes04b61da2016-11-03 09:53:59 +13003811 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003812 result = my_data->dispatch_table.ResetCommandPool(device, commandPool, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06003813
3814 validate_result(my_data->report_data, "vkResetCommandPool", result);
3815 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003816
3817 return result;
3818}
3819
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003820VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3821 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003822 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003823 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003824 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003825 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003826
Chris Forbes04b61da2016-11-03 09:53:59 +13003827 skip |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003828
Chris Forbes04b61da2016-11-03 09:53:59 +13003829 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003830 result = my_data->dispatch_table.AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003831
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003832 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003833 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003834
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003835 return result;
3836}
3837
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003838VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003839 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003840 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003841 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3842 assert(device_data != nullptr);
3843 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003844
Chris Forbes04b61da2016-11-03 09:53:59 +13003845 skip |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003846
Dustin Gravesc900f572016-05-16 11:07:59 -06003847 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3848 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3849 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003850 skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003851 pCommandBuffers, true, true);
3852
Chris Forbes04b61da2016-11-03 09:53:59 +13003853 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003854 device_data->dispatch_table.FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003855 }
3856}
3857
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003858bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003859 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003860 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3861
3862 if (pInfo != NULL) {
Chris Forbesc5554a52016-11-24 14:45:16 +13003863 if ((dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003864 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003865 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003866 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003867 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3868 "inheritedQueries.");
3869 }
Mark Lobodzinski38df4562016-12-15 13:06:55 -07003870 // VALIDATION_ERROR_00117 check
3871 if ((dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3872 skip |= validate_flags(dev_data->report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3873 "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pInfo->queryFlags, false);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003874 }
3875 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003876 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003877}
3878
3879VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003880 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003881 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003882 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3883 assert(device_data != nullptr);
3884 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003885
Chris Forbes04b61da2016-11-03 09:53:59 +13003886 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003887
Dustin Gravesc900f572016-05-16 11:07:59 -06003888 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3889 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13003890 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Dustin Gravesc900f572016-05-16 11:07:59 -06003891 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3892 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3893
3894 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003895 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003896 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003897
Chris Forbes04b61da2016-11-03 09:53:59 +13003898 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Dustin Graves629259b2016-05-30 16:14:27 -06003899 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3900
Dustin Gravesc900f572016-05-16 11:07:59 -06003901 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003902 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06003903 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3904
3905 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003906 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Dustin Gravesc900f572016-05-16 11:07:59 -06003907 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3908 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3909 }
3910
Chris Forbes04b61da2016-11-03 09:53:59 +13003911 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003912
Chris Forbes04b61da2016-11-03 09:53:59 +13003913 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003914 result = device_data->dispatch_table.BeginCommandBuffer(commandBuffer, pBeginInfo);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003915
Dustin Gravesc900f572016-05-16 11:07:59 -06003916 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003917 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003918
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003919 return result;
3920}
3921
Chia-I Wu01ca2372016-05-13 14:37:49 +08003922VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003923 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3924 assert(my_data != NULL);
3925
Chris Forbese58c9fe2016-11-24 14:44:17 +13003926 VkResult result = my_data->dispatch_table.EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003927
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003928 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003929
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003930 return result;
3931}
3932
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003933VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003934 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003935 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3936 assert(my_data != NULL);
3937
Chris Forbes04b61da2016-11-03 09:53:59 +13003938 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003939
Chris Forbes04b61da2016-11-03 09:53:59 +13003940 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003941 result = my_data->dispatch_table.ResetCommandBuffer(commandBuffer, flags);
Dustin Graves16d18972016-05-09 17:36:57 -06003942
3943 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3944 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003945
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003946 return result;
3947}
3948
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003949VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3950 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003951 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003952 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3953 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003954
Chris Forbes04b61da2016-11-03 09:53:59 +13003955 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003956
Chris Forbes04b61da2016-11-03 09:53:59 +13003957 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13003958 my_data->dispatch_table.CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003959 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003960}
3961
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003962bool preCmdSetViewport(layer_data *my_data, uint32_t viewport_count, const VkViewport *viewports) {
3963 debug_report_data *report_data = my_data->report_data;
3964
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003965 bool skip =
3966 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003967
3968 if (viewport_count > 0 && viewports != nullptr) {
3969 const VkPhysicalDeviceLimits &limits = my_data->device_limits;
3970 for (uint32_t viewportIndex = 0; viewportIndex < viewport_count; ++viewportIndex) {
3971 const VkViewport &viewport = viewports[viewportIndex];
3972
3973 if (viewport.width <= 0 || viewport.width > limits.maxViewportDimensions[0]) {
3974 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3975 VALIDATION_ERROR_01448, LayerName,
3976 "vkCmdSetViewport %d: width (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3977 viewport.width, limits.maxViewportDimensions[0], validation_error_map[VALIDATION_ERROR_01448]);
3978 }
3979
3980 bool invalid_height = (viewport.height <= 0 || viewport.height > limits.maxViewportDimensions[1]);
3981 if (my_data->amd_negative_viewport_height_enabled && (viewport.height < 0)) {
3982 // VALIDATION_ERROR_01790
3983 invalid_height = false;
3984 }
3985 if (invalid_height) {
3986 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3987 VALIDATION_ERROR_01449, LayerName,
3988 "vkCmdSetViewport %d: height (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3989 viewport.height, limits.maxViewportDimensions[1], validation_error_map[VALIDATION_ERROR_01449]);
3990 }
3991
3992 if (viewport.x < limits.viewportBoundsRange[0] || viewport.x > limits.viewportBoundsRange[1]) {
3993 skip |=
3994 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3995 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: x (%f) exceeds permitted bounds (%f,%f). %s",
3996 viewportIndex, viewport.x, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3997 validation_error_map[VALIDATION_ERROR_01450]);
3998 }
3999
4000 if (viewport.y < limits.viewportBoundsRange[0] || viewport.y > limits.viewportBoundsRange[1]) {
4001 skip |=
4002 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4003 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: y (%f) exceeds permitted bounds (%f,%f). %s",
4004 viewportIndex, viewport.y, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
4005 validation_error_map[VALIDATION_ERROR_01450]);
4006 }
4007
4008 if (viewport.x + viewport.width > limits.viewportBoundsRange[1]) {
4009 skip |=
4010 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4011 VALIDATION_ERROR_01451, LayerName,
4012 "vkCmdSetViewport %d: x (%f) + width (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.x,
4013 viewport.width, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01451]);
4014 }
4015
4016 if (viewport.y + viewport.height > limits.viewportBoundsRange[1]) {
4017 skip |=
4018 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4019 VALIDATION_ERROR_01452, LayerName,
4020 "vkCmdSetViewport %d: y (%f) + height (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.y,
4021 viewport.height, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01452]);
4022 }
4023 }
4024 }
4025
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004026 return skip;
4027}
4028
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004029VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4030 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004031 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004032 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004033 assert(my_data != NULL);
4034
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004035 skip |= preCmdSetViewport(my_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004036
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004037 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004038 my_data->dispatch_table.CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004039 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004040}
4041
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004042VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
4043 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004044 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004045 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004046 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004047 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07004048
Chris Forbes04b61da2016-11-03 09:53:59 +13004049 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004050
Mike Weiblena4742dc2016-10-31 11:05:56 -06004051 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4052 const VkRect2D &pScissor = pScissors[scissorIndex];
4053
4054 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004055 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004056 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4057 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
4058 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004059 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004060 VALIDATION_ERROR_01490, LayerName,
4061 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4062 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
4063 }
4064
4065 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004066 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004067 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4068 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4069 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004070 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004071 VALIDATION_ERROR_01491, LayerName,
4072 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4073 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4074 }
4075 }
4076
Chris Forbes04b61da2016-11-03 09:53:59 +13004077 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004078 my_data->dispatch_table.CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004079 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004080}
4081
Chia-I Wu01ca2372016-05-13 14:37:49 +08004082VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004083 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4084 my_data->dispatch_table.CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004085}
4086
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004087VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4088 float depthBiasSlopeFactor) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004089 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4090 my_data->dispatch_table.CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004091}
4092
Chia-I Wu01ca2372016-05-13 14:37:49 +08004093VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004094 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004095 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004096 assert(my_data != NULL);
4097
Chris Forbes04b61da2016-11-03 09:53:59 +13004098 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004099
Chris Forbes04b61da2016-11-03 09:53:59 +13004100 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004101 my_data->dispatch_table.CmdSetBlendConstants(commandBuffer, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004102 }
Cody Northrop12365112015-08-17 11:10:49 -06004103}
4104
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004105VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004106 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4107 my_data->dispatch_table.CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004108}
4109
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004110VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4111 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004112 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004113 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4114 assert(my_data != NULL);
4115
Chris Forbes04b61da2016-11-03 09:53:59 +13004116 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004117
Chris Forbes04b61da2016-11-03 09:53:59 +13004118 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004119 my_data->dispatch_table.CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004120 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004121}
4122
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004123VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004124 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004125 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4126 assert(my_data != NULL);
4127
Chris Forbes04b61da2016-11-03 09:53:59 +13004128 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004129
Chris Forbes04b61da2016-11-03 09:53:59 +13004130 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004131 my_data->dispatch_table.CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004132 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004133}
4134
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004135VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004136 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004137 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4138 assert(my_data != NULL);
4139
Chris Forbes04b61da2016-11-03 09:53:59 +13004140 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004141
Chris Forbes04b61da2016-11-03 09:53:59 +13004142 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004143 my_data->dispatch_table.CmdSetStencilReference(commandBuffer, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004144 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004145}
4146
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004147VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4148 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4149 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4150 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004151 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004152 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004153 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004154
Chris Forbes04b61da2016-11-03 09:53:59 +13004155 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004156 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4157 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004158
Chris Forbes04b61da2016-11-03 09:53:59 +13004159 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004160 my_data->dispatch_table.CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004161 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004162 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004163}
4164
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004165VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4166 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004167 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004168 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4169 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004170
Chris Forbes04b61da2016-11-03 09:53:59 +13004171 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004172
Chris Forbes04b61da2016-11-03 09:53:59 +13004173 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004174 my_data->dispatch_table.CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004175 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004176}
4177
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004178VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4179 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004180 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004181 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004182 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004183
Chris Forbes04b61da2016-11-03 09:53:59 +13004184 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004185
Chris Forbes04b61da2016-11-03 09:53:59 +13004186 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004187 my_data->dispatch_table.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004188 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004189}
4190
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004191bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4192 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004193 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004194 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004195 // 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 -07004196 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004197 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 -06004198 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004199 return false;
4200 }
4201
4202 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004203 // 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 -07004204 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004205 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 -06004206 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004207 return false;
4208 }
4209
4210 return true;
4211}
4212
Chia-I Wu01ca2372016-05-13 14:37:49 +08004213VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4214 uint32_t firstVertex, uint32_t firstInstance) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004215 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004216 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004217
Chris Forbese58c9fe2016-11-24 14:44:17 +13004218 my_data->dispatch_table.CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004219}
4220
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004221VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4222 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004223 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4224 my_data->dispatch_table.CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004225}
4226
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004227VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4228 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004229 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004230 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4231 assert(my_data != NULL);
4232
Chris Forbes04b61da2016-11-03 09:53:59 +13004233 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004234
Chris Forbes04b61da2016-11-03 09:53:59 +13004235 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004236 my_data->dispatch_table.CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004237 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004238}
4239
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004240VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4241 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004242 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004243 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4244 assert(my_data != NULL);
4245
Chris Forbes04b61da2016-11-03 09:53:59 +13004246 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004247
Chris Forbes04b61da2016-11-03 09:53:59 +13004248 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004249 my_data->dispatch_table.CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004250 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004251}
4252
Chia-I Wu01ca2372016-05-13 14:37:49 +08004253VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004254 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4255 my_data->dispatch_table.CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004256}
4257
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004258VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004259 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004260 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4261 assert(my_data != NULL);
4262
Chris Forbes04b61da2016-11-03 09:53:59 +13004263 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004264
Chris Forbes04b61da2016-11-03 09:53:59 +13004265 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004266 my_data->dispatch_table.CmdDispatchIndirect(commandBuffer, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004267 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004268}
4269
Chia-I Wu01ca2372016-05-13 14:37:49 +08004270VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4271 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004272 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004273 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004274 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004275
Chris Forbes04b61da2016-11-03 09:53:59 +13004276 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004277
Chris Forbes04b61da2016-11-03 09:53:59 +13004278 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004279 my_data->dispatch_table.CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004280 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004281}
4282
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004283bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004284 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004285 if (pRegions != nullptr) {
4286 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4287 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004288 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 -06004289 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004290 "vkCmdCopyImage() parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004291 return false;
4292 }
4293 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4294 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004295 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 -06004296 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004297 "vkCmdCopyImage() parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004298 return false;
4299 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004300 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004301
4302 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004303}
4304
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004305VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4306 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4307 const VkImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004308 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004309 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004310 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004311
Chris Forbes04b61da2016-11-03 09:53:59 +13004312 skip |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004313 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004314
Chris Forbes04b61da2016-11-03 09:53:59 +13004315 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004316 PreCmdCopyImage(commandBuffer, pRegions);
4317
Chris Forbese58c9fe2016-11-24 14:44:17 +13004318 my_data->dispatch_table.CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004319 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004320}
4321
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004322bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004323 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004324 if (pRegions != nullptr) {
4325 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4326 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004327 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 -06004328 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004329 "vkCmdBlitImage() parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004330 return false;
4331 }
4332 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4333 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004334 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 -06004335 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004336 "vkCmdBlitImage() parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004337 return false;
4338 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004339 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004340
4341 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004342}
4343
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004344VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4345 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4346 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004347 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004348 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004349 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004350
Chris Forbes04b61da2016-11-03 09:53:59 +13004351 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004352 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004353
Chris Forbes04b61da2016-11-03 09:53:59 +13004354 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004355 PreCmdBlitImage(commandBuffer, pRegions);
4356
Chris Forbese58c9fe2016-11-24 14:44:17 +13004357 my_data->dispatch_table.CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004358 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004359}
4360
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004361bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004362 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004363 if (pRegions != nullptr) {
4364 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4365 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004366 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 -06004367 UNRECOGNIZED_VALUE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004368 "vkCmdCopyBufferToImage() parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004369 "enumerator");
4370 return false;
4371 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004372 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004373
4374 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004375}
4376
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004377VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4378 VkImageLayout dstImageLayout, uint32_t regionCount,
4379 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004380 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004381 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004382 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004383
Chris Forbes04b61da2016-11-03 09:53:59 +13004384 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004385 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004386
Chris Forbes04b61da2016-11-03 09:53:59 +13004387 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004388 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4389
Chris Forbese58c9fe2016-11-24 14:44:17 +13004390 my_data->dispatch_table.CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004391 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004392}
4393
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004394bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004395 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004396 if (pRegions != nullptr) {
4397 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4398 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004399 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 -06004400 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004401 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4402 "enumerator");
4403 return false;
4404 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004405 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004406
4407 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004408}
4409
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004410VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4411 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004412 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004413 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004414 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004415
Chris Forbes04b61da2016-11-03 09:53:59 +13004416 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004417 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004418
Chris Forbes04b61da2016-11-03 09:53:59 +13004419 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004420 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4421
Chris Forbese58c9fe2016-11-24 14:44:17 +13004422 my_data->dispatch_table.CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004423 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004424}
4425
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004426VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4427 VkDeviceSize dataSize, const uint32_t *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004428 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004429 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004430 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004431
Chris Forbes04b61da2016-11-03 09:53:59 +13004432 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004433
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004434 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004435 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004436 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004437 LayerName, "vkCmdUpdateBuffer() parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004438 }
4439
4440 if ((dataSize <= 0) || (dataSize > 65536)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004441 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004442 INVALID_USAGE, LayerName, "vkCmdUpdateBuffer() parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004443 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004444 dataSize);
4445 } else if (dataSize & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004446 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004447 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004448 LayerName, "vkCmdUpdateBuffer() parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004449 }
4450
Chris Forbes04b61da2016-11-03 09:53:59 +13004451 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004452 my_data->dispatch_table.CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004453 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004454}
4455
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004456VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4457 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004458 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004459 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4460 assert(my_data != NULL);
4461
Chris Forbes04b61da2016-11-03 09:53:59 +13004462 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004463
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004464 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004465 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004466 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004467 LayerName, "vkCmdFillBuffer() parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004468 }
4469
4470 if (size != VK_WHOLE_SIZE) {
4471 if (size <= 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004472 skip |= log_msg(
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004473 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004474 LayerName, "vkCmdFillBuffer() parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004475 } else if (size & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004476 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004477 INVALID_USAGE, LayerName,
Mike Weiblenfa0fd072017-01-06 16:20:51 -07004478 "vkCmdFillBuffer() parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004479 }
4480 }
4481
Chris Forbes04b61da2016-11-03 09:53:59 +13004482 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004483 my_data->dispatch_table.CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004484 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004485}
4486
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004487VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4488 const VkClearColorValue *pColor, uint32_t rangeCount,
4489 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004490 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004491 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004492 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004493
Chris Forbes04b61da2016-11-03 09:53:59 +13004494 skip |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004495
Chris Forbes04b61da2016-11-03 09:53:59 +13004496 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004497 my_data->dispatch_table.CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004498 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004499}
4500
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004501VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4502 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4503 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004504 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004505 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004506 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004507
Chris Forbes04b61da2016-11-03 09:53:59 +13004508 skip |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004509 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004510
Chris Forbes04b61da2016-11-03 09:53:59 +13004511 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004512 my_data->dispatch_table.CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004513 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004514}
4515
Chia-I Wu01ca2372016-05-13 14:37:49 +08004516VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4517 const VkClearAttachment *pAttachments, uint32_t rectCount,
4518 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004519 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004520 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004521 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004522
Chris Forbes04b61da2016-11-03 09:53:59 +13004523 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004524
Chris Forbes04b61da2016-11-03 09:53:59 +13004525 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004526 my_data->dispatch_table.CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004527 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004528}
4529
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004530bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004531 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004532 if (pRegions != nullptr) {
4533 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4534 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4535 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004536 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 -06004537 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004538 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4539 return false;
4540 }
4541 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4542 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4543 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004544 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 -06004545 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004546 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4547 return false;
4548 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004549 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004550
4551 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004552}
4553
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004554VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4555 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4556 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004557 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004558 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004559 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004560
Chris Forbes04b61da2016-11-03 09:53:59 +13004561 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004562 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004563
Chris Forbes04b61da2016-11-03 09:53:59 +13004564 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004565 PreCmdResolveImage(commandBuffer, pRegions);
4566
Chris Forbese58c9fe2016-11-24 14:44:17 +13004567 my_data->dispatch_table.CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004568 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004569}
4570
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004571VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004572 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004573 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4574 assert(my_data != NULL);
4575
Chris Forbes04b61da2016-11-03 09:53:59 +13004576 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004577
Chris Forbes04b61da2016-11-03 09:53:59 +13004578 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004579 my_data->dispatch_table.CmdSetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004580 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004581}
4582
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004583VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004584 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004585 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4586 assert(my_data != NULL);
4587
Chris Forbes04b61da2016-11-03 09:53:59 +13004588 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004589
Chris Forbes04b61da2016-11-03 09:53:59 +13004590 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004591 my_data->dispatch_table.CmdResetEvent(commandBuffer, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004592 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004593}
4594
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004595VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4596 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4597 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4598 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4599 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004600 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004601 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004602 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004603
Chris Forbes04b61da2016-11-03 09:53:59 +13004604 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004605 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4606 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004607
Chris Forbes04b61da2016-11-03 09:53:59 +13004608 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004609 my_data->dispatch_table.CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004610 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004611 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004612}
4613
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004614VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4615 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4616 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4617 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4618 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004619 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004620 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004621 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004622
Chris Forbes04b61da2016-11-03 09:53:59 +13004623 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004624 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4625 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004626
Chris Forbes04b61da2016-11-03 09:53:59 +13004627 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004628 my_data->dispatch_table.CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004629 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004630 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004631}
4632
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004633VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4634 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004635 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004636 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4637 assert(my_data != NULL);
4638
Chris Forbes04b61da2016-11-03 09:53:59 +13004639 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004640
Chris Forbes04b61da2016-11-03 09:53:59 +13004641 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004642 my_data->dispatch_table.CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004643 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004644}
4645
Chia-I Wu01ca2372016-05-13 14:37:49 +08004646VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004647 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004648 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4649 assert(my_data != NULL);
4650
Chris Forbes04b61da2016-11-03 09:53:59 +13004651 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004652
Chris Forbes04b61da2016-11-03 09:53:59 +13004653 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004654 my_data->dispatch_table.CmdEndQuery(commandBuffer, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004655 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004656}
4657
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004658VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4659 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004660 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004661 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4662 assert(my_data != NULL);
4663
Chris Forbes04b61da2016-11-03 09:53:59 +13004664 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004665
Chris Forbes04b61da2016-11-03 09:53:59 +13004666 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004667 my_data->dispatch_table.CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004668 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004669}
4670
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004671bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4672 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004673
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004674 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004675
4676 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004677}
4678
Chia-I Wu01ca2372016-05-13 14:37:49 +08004679VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4680 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004681 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004682 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4683 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004684
Chris Forbes04b61da2016-11-03 09:53:59 +13004685 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004686
Chris Forbes04b61da2016-11-03 09:53:59 +13004687 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004688 my_data->dispatch_table.CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004689
4690 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4691 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004692}
4693
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004694VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4695 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4696 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004697 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004698 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4699 assert(my_data != NULL);
4700
Chris Forbes04b61da2016-11-03 09:53:59 +13004701 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004702 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004703
Chris Forbes04b61da2016-11-03 09:53:59 +13004704 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004705 my_data->dispatch_table.CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004706 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004707}
4708
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004709VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4710 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004711 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004712 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004713 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004714
Chris Forbes04b61da2016-11-03 09:53:59 +13004715 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004716
Chris Forbes04b61da2016-11-03 09:53:59 +13004717 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004718 my_data->dispatch_table.CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004719 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004720}
4721
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004722VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4723 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004724 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004725 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004726 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004727
Chris Forbes04b61da2016-11-03 09:53:59 +13004728 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004729
Chris Forbes04b61da2016-11-03 09:53:59 +13004730 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004731 my_data->dispatch_table.CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004732 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004733}
4734
Chia-I Wu01ca2372016-05-13 14:37:49 +08004735VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004736 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004737 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4738 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004739
Chris Forbes04b61da2016-11-03 09:53:59 +13004740 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004741
Chris Forbes04b61da2016-11-03 09:53:59 +13004742 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004743 my_data->dispatch_table.CmdNextSubpass(commandBuffer, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004744 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004745}
4746
Chia-I Wu01ca2372016-05-13 14:37:49 +08004747VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004748 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4749 my_data->dispatch_table.CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004750}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004751
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004752VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4753 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004754 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004755 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004756 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004757
Chris Forbes04b61da2016-11-03 09:53:59 +13004758 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004759
Chris Forbes04b61da2016-11-03 09:53:59 +13004760 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004761 my_data->dispatch_table.CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004762 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004763}
4764
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004765VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004766 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4767}
4768
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004769VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4770 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004771 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4772}
4773
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004774VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4775 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004776 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4777 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4778
4779 return VK_ERROR_LAYER_NOT_PRESENT;
4780}
4781
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004782VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4783 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004784 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004785 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004786 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004787
4788 assert(physicalDevice);
4789
Chris Forbes6444bba2016-11-24 14:15:23 +13004790 return get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map)
4791 ->dispatch_table.EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004792}
4793
Chris Forbes448ebcb2016-11-03 09:29:52 +13004794bool require_device_extension(layer_data *my_data, bool layer_data::*flag, char const *function_name, char const *extension_name)
4795{
4796 if (!(my_data->*flag)) {
4797 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4798 __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4799 "%s() called even though the %s extension was not enabled for this VkDevice.",
4800 function_name, extension_name);
4801 }
4802
4803 return false;
4804}
4805
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004806// WSI Extension Functions
4807
4808VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004809 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004810 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004811 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004812 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4813 assert(my_data != NULL);
4814
Chris Forbes04b61da2016-11-03 09:53:59 +13004815 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkCreateSwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004816
Chris Forbes04b61da2016-11-03 09:53:59 +13004817 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004818
Chris Forbes04b61da2016-11-03 09:53:59 +13004819 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004820 result = my_data->dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004821
4822 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4823 }
4824
4825 return result;
4826}
4827
4828VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004829 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004830 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004831 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004832 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4833 assert(my_data != NULL);
4834
Chris Forbes04b61da2016-11-03 09:53:59 +13004835 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkGetSwapchainImagesKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004836
Chris Forbes04b61da2016-11-03 09:53:59 +13004837 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004838 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4839
Chris Forbes04b61da2016-11-03 09:53:59 +13004840 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004841 result = my_data->dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004842
4843 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4844 }
4845
4846 return result;
4847}
4848
4849VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004850 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004851 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004852 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004853 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4854 assert(my_data != NULL);
4855
Chris Forbes04b61da2016-11-03 09:53:59 +13004856 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkAcquireNextImageKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004857
Chris Forbes04b61da2016-11-03 09:53:59 +13004858 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004859 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4860
Chris Forbes04b61da2016-11-03 09:53:59 +13004861 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004862 result = my_data->dispatch_table.AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004863
4864 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4865 }
4866
4867 return result;
4868}
4869
4870VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4871 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004872 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004873 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4874 assert(my_data != NULL);
4875
Chris Forbes04b61da2016-11-03 09:53:59 +13004876 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkQueuePresentKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004877
Chris Forbes04b61da2016-11-03 09:53:59 +13004878 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004879
Chris Forbes04b61da2016-11-03 09:53:59 +13004880 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004881 result = my_data->dispatch_table.QueuePresentKHR(queue, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004882
4883 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4884 }
4885
4886 return result;
4887}
4888
Chris Forbesbe5f5202016-11-02 18:34:25 +13004889VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004890 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13004891 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4892 assert(my_data != NULL);
4893
Chris Forbes04b61da2016-11-03 09:53:59 +13004894 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkDestroySwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004895
4896 /* No generated validation function for this call */
4897
Chris Forbes04b61da2016-11-03 09:53:59 +13004898 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13004899 my_data->dispatch_table.DestroySwapchainKHR(device, swapchain, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004900 }
4901}
4902
Chris Forbes115f98c2016-11-03 09:51:48 +13004903bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name, char const *extension_name)
4904{
Chris Forbes6be763e2016-11-24 12:42:33 +13004905 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
4906 if (!(my_data->extensions.*flag)) {
Chris Forbes115f98c2016-11-03 09:51:48 +13004907 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
4908 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4909 "%s() called even though the %s extension was not enabled for this VkInstance.",
4910 function_name, extension_name);
4911 }
4912
4913 return false;
4914}
4915
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004916VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4917 VkSurfaceKHR surface, VkBool32 *pSupported) {
4918 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004919 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004920 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004921 assert(my_data != NULL);
4922
Chris Forbes04b61da2016-11-03 09:53:59 +13004923 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004924 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004925
Chris Forbes04b61da2016-11-03 09:53:59 +13004926 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004927 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4928
Chris Forbes04b61da2016-11-03 09:53:59 +13004929 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004930 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004931
4932 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4933 }
4934
4935 return result;
4936}
4937
4938VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4939 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4940 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004941 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004942 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004943 assert(my_data != NULL);
4944
Chris Forbes04b61da2016-11-03 09:53:59 +13004945 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004946 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004947
Chris Forbes04b61da2016-11-03 09:53:59 +13004948 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004949 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004950
Chris Forbes04b61da2016-11-03 09:53:59 +13004951 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004952 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004953
4954 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4955 }
4956
4957 return result;
4958}
4959
4960VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4961 uint32_t *pSurfaceFormatCount,
4962 VkSurfaceFormatKHR *pSurfaceFormats) {
4963 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004964 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004965 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004966 assert(my_data != NULL);
4967
Chris Forbes04b61da2016-11-03 09:53:59 +13004968 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004969 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004970
Chris Forbes04b61da2016-11-03 09:53:59 +13004971 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004972 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004973
Chris Forbes04b61da2016-11-03 09:53:59 +13004974 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004975 result = my_data->dispatch_table.GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount,
4976 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004977
4978 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4979 }
4980
4981 return result;
4982}
4983
4984VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4985 uint32_t *pPresentModeCount,
4986 VkPresentModeKHR *pPresentModes) {
4987 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004988 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004989 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004990 assert(my_data != NULL);
4991
Chris Forbes04b61da2016-11-03 09:53:59 +13004992 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004993 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004994
Chris Forbes04b61da2016-11-03 09:53:59 +13004995 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004996 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004997
Chris Forbes04b61da2016-11-03 09:53:59 +13004998 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13004999 result = my_data->dispatch_table.GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount,
5000 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005001
5002 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
5003 }
5004
5005 return result;
5006}
5007
Chris Forbesbe5f5202016-11-02 18:34:25 +13005008VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005009 bool skip = false;
Chris Forbes6444bba2016-11-24 14:15:23 +13005010 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005011
Chris Forbes04b61da2016-11-03 09:53:59 +13005012 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005013 "vkDestroySurfaceKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005014
Chris Forbes04b61da2016-11-03 09:53:59 +13005015 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005016 my_data->dispatch_table.DestroySurfaceKHR(instance, surface, pAllocator);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005017 }
5018}
5019
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005020#ifdef VK_USE_PLATFORM_WIN32_KHR
5021VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
5022 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5023 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5024
Chris Forbes7b58a712016-11-24 11:35:31 +13005025 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005026 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005027 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005028
Chris Forbes04b61da2016-11-03 09:53:59 +13005029 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005030 "vkCreateWin32SurfaceKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005031
Chris Forbes04b61da2016-11-03 09:53:59 +13005032 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005033
Chris Forbes04b61da2016-11-03 09:53:59 +13005034 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005035 result = my_data->dispatch_table.CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005036 }
5037
5038 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5039
5040 return result;
5041}
Chris Forbes9a083b92016-11-02 16:58:15 +13005042
5043VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
5044 uint32_t queueFamilyIndex)
5045{
5046 VkBool32 result = false;
5047
Chris Forbes7b58a712016-11-24 11:35:31 +13005048 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes9a083b92016-11-02 16:58:15 +13005049 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005050 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005051
Chris Forbes04b61da2016-11-03 09:53:59 +13005052 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005053 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005054
Chris Forbes7281a502016-11-08 08:45:03 +13005055 // TODO: codegen doesn't produce this function?
5056 //skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005057
Chris Forbes04b61da2016-11-03 09:53:59 +13005058 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005059 result = my_data->dispatch_table.GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005060 }
5061
5062 return result;
5063}
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005064#endif // VK_USE_PLATFORM_WIN32_KHR
5065
5066#ifdef VK_USE_PLATFORM_XCB_KHR
5067VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5068 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5069 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5070
Chris Forbes7b58a712016-11-24 11:35:31 +13005071 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005072 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005073 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005074
Chris Forbes04b61da2016-11-03 09:53:59 +13005075 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005076 "vkCreateXcbSurfaceKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005077
Chris Forbes04b61da2016-11-03 09:53:59 +13005078 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005079
Chris Forbes04b61da2016-11-03 09:53:59 +13005080 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005081 result = my_data->dispatch_table.CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005082 }
5083
5084 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5085
5086 return result;
5087}
5088
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005089VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5090 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5091 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005092 VkBool32 result = false;
5093
Chris Forbes7b58a712016-11-24 11:35:31 +13005094 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005095 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005096 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005097
Chris Forbes04b61da2016-11-03 09:53:59 +13005098 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005099 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005100
Chris Forbes04b61da2016-11-03 09:53:59 +13005101 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005102 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005103
Chris Forbes04b61da2016-11-03 09:53:59 +13005104 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005105 result = my_data->dispatch_table.GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection,
5106 visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005107 }
5108
5109 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005110}
5111#endif // VK_USE_PLATFORM_XCB_KHR
5112
5113#ifdef VK_USE_PLATFORM_XLIB_KHR
5114VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005115 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005116 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5117
Chris Forbes7b58a712016-11-24 11:35:31 +13005118 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005119 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005120 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005121
Chris Forbes04b61da2016-11-03 09:53:59 +13005122 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005123 "vkCreateXlibSurfaceKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005124
Chris Forbes04b61da2016-11-03 09:53:59 +13005125 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005126
Chris Forbes04b61da2016-11-03 09:53:59 +13005127 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005128 result = my_data->dispatch_table.CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005129 }
5130
5131 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5132
5133 return result;
5134}
5135
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005136VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5137 uint32_t queueFamilyIndex, Display *dpy,
5138 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005139 VkBool32 result = false;
5140
Chris Forbes7b58a712016-11-24 11:35:31 +13005141 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005142 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005143 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005144
Chris Forbes04b61da2016-11-03 09:53:59 +13005145 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005146 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005147
Chris Forbes04b61da2016-11-03 09:53:59 +13005148 skip |= parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005149
Chris Forbes04b61da2016-11-03 09:53:59 +13005150 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005151 result =
5152 my_data->dispatch_table.GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005153 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005154 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005155}
5156#endif // VK_USE_PLATFORM_XLIB_KHR
5157
5158#ifdef VK_USE_PLATFORM_MIR_KHR
5159VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005160 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005161 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5162
Chris Forbes7b58a712016-11-24 11:35:31 +13005163 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005164 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005165 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005166
Chris Forbes04b61da2016-11-03 09:53:59 +13005167 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005168 "vkCreateMirSurfaceKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005169
Chris Forbes04b61da2016-11-03 09:53:59 +13005170 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005171
Chris Forbes04b61da2016-11-03 09:53:59 +13005172 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005173 result = my_data->dispatch_table.CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005174 }
5175
5176 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5177
5178 return result;
5179}
5180
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005181VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5182 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005183 VkBool32 result = false;
5184
Chris Forbes7b58a712016-11-24 11:35:31 +13005185 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005186 assert(my_data != NULL);
5187
Chris Forbes04b61da2016-11-03 09:53:59 +13005188 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005189
Chris Forbes04b61da2016-11-03 09:53:59 +13005190 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005191 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5192
Chris Forbes04b61da2016-11-03 09:53:59 +13005193 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005194
Chris Forbes04b61da2016-11-03 09:53:59 +13005195 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005196 result = my_data->dispatch_table.GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005197 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005198 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005199}
5200#endif // VK_USE_PLATFORM_MIR_KHR
5201
5202#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5203VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005204 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005205 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5206
Chris Forbes7b58a712016-11-24 11:35:31 +13005207 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005208 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005209 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005210
Chris Forbes04b61da2016-11-03 09:53:59 +13005211 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005212 "vkCreateWaylandSurfaceKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5213
Chris Forbes04b61da2016-11-03 09:53:59 +13005214 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005215
Chris Forbes04b61da2016-11-03 09:53:59 +13005216 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005217 result = my_data->dispatch_table.CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005218 }
5219
5220 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5221
5222 return result;
5223}
5224
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005225VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5226 uint32_t queueFamilyIndex,
5227 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005228 VkBool32 result = false;
5229
Chris Forbes7b58a712016-11-24 11:35:31 +13005230 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005231 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005232 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005233
Chris Forbes04b61da2016-11-03 09:53:59 +13005234 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005235 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5236
Chris Forbes04b61da2016-11-03 09:53:59 +13005237 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005238 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005239
Chris Forbes04b61da2016-11-03 09:53:59 +13005240 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005241 result = my_data->dispatch_table.GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005242 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005243
5244 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005245}
5246#endif // VK_USE_PLATFORM_WAYLAND_KHR
5247
5248#ifdef VK_USE_PLATFORM_ANDROID_KHR
5249VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005250 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005251 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5252
Chris Forbes7b58a712016-11-24 11:35:31 +13005253 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005254 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005255 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005256
Chris Forbes04b61da2016-11-03 09:53:59 +13005257 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005258 "vkCreateAndroidSurfaceKHR", VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005259
Chris Forbes04b61da2016-11-03 09:53:59 +13005260 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005261
Chris Forbes04b61da2016-11-03 09:53:59 +13005262 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005263 result = my_data->dispatch_table.CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005264 }
5265
5266 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5267
5268 return result;
5269}
5270#endif // VK_USE_PLATFORM_ANDROID_KHR
5271
Mark Youngead9b932016-09-08 12:28:38 -06005272VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5273 const VkSwapchainCreateInfoKHR *pCreateInfos,
5274 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5275 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005276 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005277 auto my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06005278 assert(my_data != NULL);
5279
Chris Forbes04b61da2016-11-03 09:53:59 +13005280 skip |= require_device_extension(my_data, &layer_data::display_swapchain_enabled, "vkCreateSharedSwapchainsKHR", VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005281
Chris Forbes04b61da2016-11-03 09:53:59 +13005282 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Youngead9b932016-09-08 12:28:38 -06005283 pSwapchains);
5284
Chris Forbes04b61da2016-11-03 09:53:59 +13005285 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005286 result = my_data->dispatch_table.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Youngead9b932016-09-08 12:28:38 -06005287
5288 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5289 }
5290
5291 return result;
5292}
5293
Chris Forbes667a5212016-11-03 10:18:35 +13005294VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5295 VkDisplayPropertiesKHR *pProperties) {
5296 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5297 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005298 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005299 assert(my_data != NULL);
5300
5301 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5302 "vkGetPhysicalDeviceDisplayPropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5303
5304 // No parameter validation function for this call?
5305
5306 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005307 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005308
5309 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPropertiesKHR", result);
5310 }
5311
5312 return result;
5313}
5314
5315VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5316 VkDisplayPlanePropertiesKHR *pProperties) {
5317 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5318 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005319 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005320 assert(my_data != NULL);
5321
5322 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5323 "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5324
5325 // No parameter validation function for this call?
5326
5327 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005328 result = my_data->dispatch_table.GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005329
5330 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", result);
5331 }
5332
5333 return result;
5334}
5335
5336VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
5337 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
5338 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5339 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005340 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005341 assert(my_data != NULL);
5342
5343 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5344 "vkGetDisplayPlaneSupportedDisplaysKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5345
5346 // No parameter validation function for this call?
5347
5348 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005349 result = my_data->dispatch_table.GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
Chris Forbes667a5212016-11-03 10:18:35 +13005350
5351 validate_result(my_data->report_data, "vkGetDisplayPlaneSupportedDisplaysKHR", result);
5352 }
5353
5354 return result;
5355}
5356
5357VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5358 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
5359 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5360 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005361 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005362 assert(my_data != NULL);
5363
5364 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5365 "vkGetDisplayModePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5366
5367 // No parameter validation function for this call?
5368
5369 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005370 result = my_data->dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
Chris Forbes667a5212016-11-03 10:18:35 +13005371
5372 validate_result(my_data->report_data, "vkGetDisplayModePropertiesKHR", result);
5373 }
5374
5375 return result;
5376}
5377
5378VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5379 const VkDisplayModeCreateInfoKHR *pCreateInfo,
5380 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
5381 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5382 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005383 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005384 assert(my_data != NULL);
5385
5386 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5387 "vkCreateDisplayModeKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5388
5389 // No parameter validation function for this call?
5390
5391 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005392 result = my_data->dispatch_table.CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
Chris Forbes667a5212016-11-03 10:18:35 +13005393
5394 validate_result(my_data->report_data, "vkCreateDisplayModeKHR", result);
5395 }
5396
5397 return result;
5398}
5399
5400VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
5401 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
5402 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5403 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005404 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005405 assert(my_data != NULL);
5406
5407 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5408 "vkGetDisplayPlaneCapabilitiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5409
5410 // No parameter validation function for this call?
5411
5412 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005413 result = my_data->dispatch_table.GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
Chris Forbes667a5212016-11-03 10:18:35 +13005414
5415 validate_result(my_data->report_data, "vkGetDisplayPlaneCapabilitiesKHR", result);
5416 }
5417
5418 return result;
5419}
5420
5421VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
5422 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5423 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5424 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005425 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005426 assert(my_data != NULL);
5427
5428 skip |= require_instance_extension(instance, &instance_extension_enables::display_enabled,
5429 "vkCreateDisplayPlaneSurfaceKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5430
5431 // No parameter validation function for this call?
5432
5433 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005434 result = my_data->dispatch_table.CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Chris Forbes667a5212016-11-03 10:18:35 +13005435
5436 validate_result(my_data->report_data, "vkCreateDisplayPlaneSurfaceKHR", result);
5437 }
5438
5439 return result;
5440}
5441
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005442// VK_EXT_debug_marker Extension
5443VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5444 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005445 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005446 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5447 assert(my_data != NULL);
5448
Chris Forbes04b61da2016-11-03 09:53:59 +13005449 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005450
Chris Forbes04b61da2016-11-03 09:53:59 +13005451 if (!skip) {
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005452 if (my_data->dispatch_table.DebugMarkerSetObjectTagEXT) {
5453 result = my_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
5454 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5455 } else {
5456 result = VK_SUCCESS;
5457 }
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005458 }
5459
5460 return result;
5461}
5462
5463VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5464 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005465 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005466 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5467 assert(my_data != NULL);
5468
Chris Forbes04b61da2016-11-03 09:53:59 +13005469 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005470
Chris Forbes04b61da2016-11-03 09:53:59 +13005471 if (!skip) {
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005472 if (my_data->dispatch_table.DebugMarkerSetObjectNameEXT) {
5473 result = my_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
5474 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5475 } else {
5476 result = VK_SUCCESS;
5477 }
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005478 }
5479
5480 return result;
5481}
5482
5483VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005484 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005485 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5486 assert(my_data != NULL);
5487
Chris Forbes04b61da2016-11-03 09:53:59 +13005488 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005489
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005490 if (!skip && my_data->dispatch_table.CmdDebugMarkerBeginEXT) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005491 my_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005492 }
5493}
5494
5495VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005496 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005497 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5498 assert(my_data != NULL);
5499
Chris Forbes04b61da2016-11-03 09:53:59 +13005500 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005501
Tobin Ehlis8ad41932016-12-01 09:37:56 -07005502 if (!skip && my_data->dispatch_table.CmdDebugMarkerInsertEXT) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005503 my_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005504 }
5505}
5506
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005507// VK_NV_external_memory_capabilities Extension
5508VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5509 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5510 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5511 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5512
5513 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005514 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005515 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005516 assert(my_data != NULL);
5517
Chris Forbes04b61da2016-11-03 09:53:59 +13005518 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005519 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5520
Chris Forbes04b61da2016-11-03 09:53:59 +13005521 if (!skip) {
Chris Forbes6444bba2016-11-24 14:15:23 +13005522 result = my_data->dispatch_table.GetPhysicalDeviceExternalImageFormatPropertiesNV(
5523 physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005524
5525 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5526 }
5527
5528 return result;
5529}
5530
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005531#ifdef VK_USE_PLATFORM_WIN32_KHR
5532// VK_NV_external_memory_win32 Extension
5533VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5534 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5535
5536 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005537 bool skip = false;
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005538 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5539 assert(my_data != NULL);
5540
Chris Forbes04b61da2016-11-03 09:53:59 +13005541 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005542
Chris Forbes04b61da2016-11-03 09:53:59 +13005543 if (!skip) {
Chris Forbese58c9fe2016-11-24 14:44:17 +13005544 result = my_data->dispatch_table.GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005545 }
5546
5547 return result;
5548}
5549#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005550
Mark Youngfa552782016-12-12 16:14:55 -07005551// VK_NVX_device_generated_commands extension
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005552
Mark Youngfa552782016-12-12 16:14:55 -07005553VKAPI_ATTR void VKAPI_CALL CmdProcessCommandsNVX(VkCommandBuffer commandBuffer,
5554 const VkCmdProcessCommandsInfoNVX *pProcessCommandsInfo) {
5555 bool skip = false;
5556 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5557 assert(device_data != nullptr);
5558 debug_report_data *report_data = device_data->report_data;
5559
5560 skip |= require_device_extension(device_data, &layer_data::nvx_device_generated_commands_enabled, "vkCmdProcessCommandsNVX",
5561 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5562 skip |= parameter_validation_vkCmdProcessCommandsNVX(report_data, pProcessCommandsInfo);
5563
5564 if (!skip) {
5565 device_data->dispatch_table.CmdProcessCommandsNVX(commandBuffer, pProcessCommandsInfo);
5566 }
5567}
5568
5569VKAPI_ATTR void VKAPI_CALL CmdReserveSpaceForCommandsNVX(VkCommandBuffer commandBuffer,
5570 const VkCmdReserveSpaceForCommandsInfoNVX *pReserveSpaceInfo) {
5571 bool skip = false;
5572 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5573 assert(device_data != nullptr);
5574 debug_report_data *report_data = device_data->report_data;
5575
5576 skip |= require_device_extension(device_data, &layer_data::nvx_device_generated_commands_enabled,
5577 "vkCmdReserveSpaceForCommandsNVX", VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5578 skip |= parameter_validation_vkCmdReserveSpaceForCommandsNVX(report_data, pReserveSpaceInfo);
5579
5580 if (!skip) {
5581 device_data->dispatch_table.CmdReserveSpaceForCommandsNVX(commandBuffer, pReserveSpaceInfo);
5582 }
5583}
5584
5585VKAPI_ATTR VkResult VKAPI_CALL CreateIndirectCommandsLayoutNVX(VkDevice device,
5586 const VkIndirectCommandsLayoutCreateInfoNVX *pCreateInfo,
5587 const VkAllocationCallbacks *pAllocator,
5588 VkIndirectCommandsLayoutNVX *pIndirectCommandsLayout) {
5589 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5590 bool skip = false;
5591 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5592 assert(my_data != NULL);
5593 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled,
5594 "vkCreateIndirectCommandsLayoutNVX", VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5595 skip |= parameter_validation_vkCreateIndirectCommandsLayoutNVX(my_data->report_data, pCreateInfo, pAllocator,
5596 pIndirectCommandsLayout);
5597 if (!skip) {
5598 result = my_data->dispatch_table.CreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout);
5599
5600 validate_result(my_data->report_data, "vkCreateIndirectCommandsLayoutNVX", result);
5601 }
5602 return result;
5603}
5604
5605VKAPI_ATTR void VKAPI_CALL DestroyIndirectCommandsLayoutNVX(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout,
5606 const VkAllocationCallbacks *pAllocator) {
5607 bool skip = false;
5608 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5609 assert(my_data != NULL);
5610 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled,
5611 "vkDestroyIndirectCommandsLayoutNVX", VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5612 skip |= parameter_validation_vkDestroyIndirectCommandsLayoutNVX(my_data->report_data, indirectCommandsLayout, pAllocator);
5613 if (!skip) {
5614 my_data->dispatch_table.DestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator);
5615 }
5616}
5617
5618VKAPI_ATTR VkResult VKAPI_CALL CreateObjectTableNVX(VkDevice device, const VkObjectTableCreateInfoNVX *pCreateInfo,
5619 const VkAllocationCallbacks *pAllocator, VkObjectTableNVX *pObjectTable) {
5620 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5621 bool skip = false;
5622 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5623 assert(my_data != NULL);
5624 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled, "vkCreateObjectTableNVX",
5625 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5626 skip |= parameter_validation_vkCreateObjectTableNVX(my_data->report_data, pCreateInfo, pAllocator, pObjectTable);
5627 if (!skip) {
5628 result = my_data->dispatch_table.CreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable);
5629 }
5630 return result;
5631}
5632
5633VKAPI_ATTR void VKAPI_CALL DestroyObjectTableNVX(VkDevice device, VkObjectTableNVX objectTable,
5634 const VkAllocationCallbacks *pAllocator) {
5635 bool skip = false;
5636 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5637 assert(my_data != NULL);
5638 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled, "vkDestroyObjectTableNVX",
5639 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5640 skip |= parameter_validation_vkDestroyObjectTableNVX(my_data->report_data, objectTable, pAllocator);
5641 if (!skip) {
5642 my_data->dispatch_table.DestroyObjectTableNVX(device, objectTable, pAllocator);
5643 }
5644}
5645
5646VKAPI_ATTR VkResult VKAPI_CALL RegisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
5647 const VkObjectTableEntryNVX *const *ppObjectTableEntries,
5648 const uint32_t *pObjectIndices) {
5649 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5650 bool skip = false;
5651 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5652 assert(my_data != NULL);
5653 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled, "vkRegisterObjectsNVX",
5654 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5655 skip |= parameter_validation_vkRegisterObjectsNVX(my_data->report_data, objectTable, objectCount, ppObjectTableEntries,
5656 pObjectIndices);
5657 if (!skip) {
5658 result = my_data->dispatch_table.RegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices);
5659 }
5660 return result;
5661}
5662
5663VKAPI_ATTR VkResult VKAPI_CALL UnregisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
5664 const VkObjectEntryTypeNVX *pObjectEntryTypes, const uint32_t *pObjectIndices) {
5665 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5666 bool skip = false;
5667 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5668 assert(my_data != NULL);
5669 skip |= require_device_extension(my_data, &layer_data::nvx_device_generated_commands_enabled, "vkUnregisterObjectsNVX",
5670 VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
5671 skip |= parameter_validation_vkUnregisterObjectsNVX(my_data->report_data, objectTable, objectCount, pObjectEntryTypes,
5672 pObjectIndices);
5673 if (!skip) {
5674 result = my_data->dispatch_table.UnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices);
5675 }
5676 return result;
5677}
5678
5679VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceGeneratedCommandsPropertiesNVX(VkPhysicalDevice physicalDevice,
5680 VkDeviceGeneratedCommandsFeaturesNVX *pFeatures,
5681 VkDeviceGeneratedCommandsLimitsNVX *pLimits) {
5682 bool skip = false;
5683 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
5684 assert(my_data != NULL);
5685
5686 skip |= parameter_validation_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX(my_data->report_data, pFeatures, pLimits);
5687
5688 if (!skip) {
5689 my_data->dispatch_table.GetPhysicalDeviceGeneratedCommandsPropertiesNVX(physicalDevice, pFeatures, pLimits);
5690 }
5691}
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005692
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005693static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005694
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005695static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005696
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005697static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005698
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005699static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005700
Chia-I Wu01ca2372016-05-13 14:37:49 +08005701VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005702 assert(device);
5703
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005704 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5705
Dustin Graves080069b2016-04-05 13:48:15 -06005706 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005707 return NULL;
5708 }
5709
Chia-I Wuf9b01382016-05-16 07:37:41 +08005710 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5711 if (proc)
5712 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005713
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005714 proc = InterceptWsiEnabledCommand(funcName, device);
5715 if (proc)
5716 return proc;
5717
Chris Forbese58c9fe2016-11-24 14:44:17 +13005718 if (!data->dispatch_table.GetDeviceProcAddr)
5719 return nullptr;
5720 return data->dispatch_table.GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005721}
5722
Chia-I Wu01ca2372016-05-13 14:37:49 +08005723VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005724 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005725 if (!proc)
5726 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005727
5728 if (!proc)
5729 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005730
Chia-I Wu617f2a42016-05-16 07:41:17 +08005731 if (proc)
5732 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005733
Chia-I Wu617f2a42016-05-16 07:41:17 +08005734 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005735
Chris Forbes7b58a712016-11-24 11:35:31 +13005736 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005737
Chia-I Wu617f2a42016-05-16 07:41:17 +08005738 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005739 if (!proc)
5740 proc = InterceptWsiEnabledCommand(funcName, instance);
5741
Chia-I Wu617f2a42016-05-16 07:41:17 +08005742 if (proc)
5743 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005744
Chris Forbes6444bba2016-11-24 14:15:23 +13005745 if (!data->dispatch_table.GetInstanceProcAddr)
5746 return nullptr;
5747 return data->dispatch_table.GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005748}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005749
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005750static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005751 static const struct {
5752 const char *name;
5753 PFN_vkVoidFunction proc;
5754 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005755 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5756 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5757 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5758 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5759 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5760 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5761 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5762 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5763 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5764 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5765 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5766 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5767 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5768 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5769 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5770 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5771 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Youngfa552782016-12-12 16:14:55 -07005772 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV",
5773 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV)},
5774 // NVX_device_generated_commands
5775 {"vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX",
5776 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceGeneratedCommandsPropertiesNVX)},
Chia-I Wu617f2a42016-05-16 07:41:17 +08005777 };
5778
5779 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5780 if (!strcmp(core_instance_commands[i].name, name))
5781 return core_instance_commands[i].proc;
5782 }
5783
5784 return nullptr;
5785}
5786
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005787static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005788 static const struct {
5789 const char *name;
5790 PFN_vkVoidFunction proc;
5791 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005792 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5793 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5794 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5795 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5796 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5797 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5798 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5799 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5800 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5801 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5802 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5803 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5804 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5805 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5806 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5807 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5808 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5809 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5810 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5811 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5812 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5813 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5814 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5815 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5816 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5817 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5818 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5819 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5820 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5821 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5822 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5823 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5824 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5825 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5826 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5827 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5828 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5829 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5830 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5831 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5832 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5833 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5834 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5835 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5836 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5837 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5838 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5839 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5840 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5841 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5842 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5843 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5844 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5845 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5846 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5847 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5848 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5849 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5850 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5851 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5852 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5853 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5854 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5855 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5856 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5857 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5858 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5859 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5860 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5861 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5862 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5863 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5864 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5865 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5866 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5867 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5868 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5869 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5870 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5871 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5872 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5873 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5874 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5875 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5876 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5877 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5878 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5879 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5880 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5881 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5882 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5883 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5884 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5885 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5886 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5887 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5888 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5889 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5890 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5891 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5892 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5893 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5894 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5895 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5896 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5897 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5898 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5899 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5900 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5901 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5902 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5903 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5904 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5905 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5906 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5907 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5908 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Youngfa552782016-12-12 16:14:55 -07005909 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT)},
5910 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT)},
5911 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT)},
5912 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT)},
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005913#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Youngfa552782016-12-12 16:14:55 -07005914 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV)},
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005915#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Youngfa552782016-12-12 16:14:55 -07005916 // NVX_device_generated_commands
5917 {"vkCmdProcessCommandsNVX", reinterpret_cast<PFN_vkVoidFunction>(CmdProcessCommandsNVX)},
5918 {"vkCmdReserveSpaceForCommandsNVX", reinterpret_cast<PFN_vkVoidFunction>(CmdReserveSpaceForCommandsNVX)},
5919 {"vkCreateIndirectCommandsLayoutNVX", reinterpret_cast<PFN_vkVoidFunction>(CreateIndirectCommandsLayoutNVX)},
5920 {"vkDestroyIndirectCommandsLayoutNVX", reinterpret_cast<PFN_vkVoidFunction>(DestroyIndirectCommandsLayoutNVX)},
5921 {"vkCreateObjectTableNVX", reinterpret_cast<PFN_vkVoidFunction>(CreateObjectTableNVX)},
5922 {"vkDestroyObjectTableNVX", reinterpret_cast<PFN_vkVoidFunction>(DestroyObjectTableNVX)},
5923 {"vkRegisterObjectsNVX", reinterpret_cast<PFN_vkVoidFunction>(RegisterObjectsNVX)},
5924 {"vkUnregisterObjectsNVX", reinterpret_cast<PFN_vkVoidFunction>(UnregisterObjectsNVX)},
5925 };
Chia-I Wuf9b01382016-05-16 07:37:41 +08005926
5927 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5928 if (!strcmp(core_device_commands[i].name, name))
5929 return core_device_commands[i].proc;
5930 }
5931
5932 return nullptr;
5933}
5934
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005935static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005936 static const struct {
5937 const char *name;
5938 PFN_vkVoidFunction proc;
5939 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005940 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5941 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5942 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5943 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005944 {"vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR)},
Chris Forbes64c3c652016-11-03 10:15:31 +13005945 {"vkCreateSharedSwapchainsKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005946 };
5947
5948 if (device) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005949 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5950 if (!strcmp(wsi_device_commands[i].name, name))
5951 return wsi_device_commands[i].proc;
Mark Youngead9b932016-09-08 12:28:38 -06005952 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005953 }
5954
5955 return nullptr;
5956}
5957
5958static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5959 static const struct {
5960 const char *name;
5961 PFN_vkVoidFunction proc;
5962 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005963 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5964 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5965 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5966 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5967 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5968 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005969 {"vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR)},
Chris Forbes667a5212016-11-03 10:18:35 +13005970 {"vkGetPhysicalDeviceDisplayPropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR)},
5971 {"vkGetPhysicalDeviceDisplayPlanePropertiesKHR",
5972 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR)},
5973 {"vkGetDisplayPlaneSupportedDisplaysKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR)},
5974 {"vkGetDisplayModePropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR)},
5975 {"vkCreateDisplayModeKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR)},
5976 {"vkGetDisplayPlaneCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR)},
5977 {"vkCreateDisplayPlaneSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR)},
Chris Forbesb858dc82016-11-03 11:28:19 +13005978#ifdef VK_USE_PLATFORM_WIN32_KHR
5979 {"vkCreateWin32SurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR)},
5980 {"vkGetPhysicalDeviceWin32PresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR)},
5981#endif
5982#ifdef VK_USE_PLATFORM_XCB_KHR
5983 {"vkCreateXcbSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR)},
5984 {"vkGetPhysicalDeviceXcbPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR)},
5985#endif
5986#ifdef VK_USE_PLATFORM_XLIB_KHR
5987 {"vkCreateXlibSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR)},
5988 {"vkGetPhysicalDeviceXlibPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR)},
5989#endif
5990#ifdef VK_USE_PLATFORM_MIR_KHR
5991 {"vkCreateMirSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR)},
5992 {"vkGetPhysicalDeviceMirPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR)},
5993#endif
5994#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5995 {"vkCreateWaylandSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR)},
5996 {"vkGetPhysicalDeviceWaylandPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR)},
5997#endif
5998#ifdef VK_USE_PLATFORM_ANDROID_KHR
5999 {"vkCreateAndroidSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR)},
6000#endif
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06006001 };
6002
Chris Forbes8a13e272016-11-02 17:43:34 +13006003 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
6004 if (!strcmp(wsi_instance_commands[i].name, name))
6005 return wsi_instance_commands[i].proc;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06006006 }
6007
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06006008 return nullptr;
6009}
6010
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006011} // namespace parameter_validation
6012
6013// vk_layer_logging.h expects these to be defined
6014
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006015VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
6016 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
6017 const VkAllocationCallbacks *pAllocator,
6018 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006019 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006020}
6021
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006022VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
6023 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006024 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006025}
6026
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006027VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
6028 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
6029 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006030 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006031}
6032
6033// loader-layer interface v0
6034
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006035VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
6036 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08006037 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08006038}
6039
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006040VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
6041 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08006042 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08006043}
6044
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06006045VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
6046 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08006047 // the layer command handles VK_NULL_HANDLE just fine internally
6048 assert(physicalDevice == VK_NULL_HANDLE);
6049 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006050}
6051
6052VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
6053 const char *pLayerName, uint32_t *pCount,
6054 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08006055 // the layer command handles VK_NULL_HANDLE just fine internally
6056 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08006057 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006058}
6059
6060VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006061 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08006062}
6063
6064VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08006065 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08006066}