blob: d1eeb74162dd4063456b6ffdddcc54c2af13e22c [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060017 *
18 * Author: Jeremy Hayes <jeremy@lunarg.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070020 * Author: Mark Lobodzinski <mark@LunarG.com>
Dustin Graves1e92cd72016-02-09 14:00:18 -070021 * Author: Dustin Graves <dustin@lunarg.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060022 */
23
Dustin Gravesf8032f22016-05-11 18:31:44 -060024#define NOMINMAX
25
Mike Weiblena4742dc2016-10-31 11:05:56 -060026#include <limits.h>
Dustin Gravesf8032f22016-05-11 18:31:44 -060027#include <math.h>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060028#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31
32#include <iostream>
33#include <string>
34#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050035#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060036#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060037#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060038
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060039#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070040#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060041#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060042#include "vk_enum_validate_helper.h"
43#include "vk_struct_validate_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
Cody Northrop55443ef2015-09-28 15:09:32 -060056struct 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;
Ian Elliotted6b5ac2016-04-28 09:08:13 -060067
Jon Ashburn5484e0c2016-03-08 17:48:44 -070068 // TODO: Split instance/device structs
69 // Device Data
70 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060071 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Chris Forbes7b57a392016-11-02 17:56:50 +130072 VkPhysicalDeviceLimits device_limits = {};
73 VkPhysicalDeviceFeatures physical_device_features = {};
74 VkPhysicalDevice physical_device = VK_NULL_HANDLE;
Michael Lentinebdf744f2016-01-27 15:43:43 -060075
Chris Forbes7b57a392016-11-02 17:56:50 +130076 bool swapchain_enabled = false;
77 bool display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -060078 bool amd_negative_viewport_height_enabled = false;
Cody Northrop55443ef2015-09-28 15:09:32 -060079};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050080
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060081static std::unordered_map<void *, struct instance_extension_enables> instance_extension_map;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070082static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060083static device_table_map pc_device_table_map;
84static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060085
Mark Lobodzinski739391a2016-03-17 15:08:18 -060086static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060087
Mark Lobodzinski739391a2016-03-17 15:08:18 -060088 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -060089}
90
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060091VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
92 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
93 const VkAllocationCallbacks *pAllocator,
94 VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070095 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -070096 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -060097
Jon Ashburn5484e0c2016-03-08 17:48:44 -070098 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070099 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600100 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600101 }
102
103 return result;
104}
105
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600106VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800107 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700108 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700109 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600110
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700111 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700112 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600113}
114
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600115VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
116 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
117 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700118 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
119 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700120}
121
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700122static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600123
Chia-I Wu3384db82016-05-16 07:30:58 +0800124static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600125 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800126};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700127
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700128static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600129 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700130 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
131 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
132 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
133 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
134 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 -0700135 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700136 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600137 return false;
138 }
139
140 return true;
141}
142
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700143static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
144 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600145 return "unrecognized enumerator";
146 }
147
148 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700149 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600150 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
151 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700152 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600153 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
154 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700155 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600156 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
157 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700158 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600159 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
160 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700161 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600162 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
163 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700164 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600165 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
166 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700167 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600168 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
169 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700170 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600171 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
172 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700173 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600174 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
175 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700176 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600177 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
178 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700179 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800180 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600181 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700182 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800183 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600184 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700185 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700186 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
187 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600188
189 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700190 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600191 enumeratorString += string;
192
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700193 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600194 enumeratorString += '|';
195 }
196 }
197
198 return enumeratorString;
199}
200
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700201static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
202 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
203 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
204 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
205 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
206 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600207 return false;
208 }
209
210 return true;
211}
212
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700213static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
214 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600215 return "unrecognized enumerator";
216 }
217
218 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700219 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600220 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
221 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700222 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600223 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600224 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700225 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600226 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
227 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700228 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600229 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
230 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700231 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600232 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
233 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700234 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800235 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600236 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600238 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
239 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700240 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800241 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600242 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600243
244 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700245 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600246 enumeratorString += string;
247
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700248 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600249 enumeratorString += '|';
250 }
251 }
252
253 return enumeratorString;
254}
255
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700256static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
257 VkQueueFlagBits allFlags =
258 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
259 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600260 return false;
261 }
262
263 return true;
264}
265
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700266static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
267 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600268 return "unrecognized enumerator";
269 }
270
271 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700272 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800273 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600274 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700275 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600276 strings.push_back("VK_QUEUE_COMPUTE_BIT");
277 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700278 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800279 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600280 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700281 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600282 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
283 }
284
285 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700286 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600287 enumeratorString += string;
288
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700289 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600290 enumeratorString += '|';
291 }
292 }
293
294 return enumeratorString;
295}
296
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700297static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
298 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
299 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
300 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
301 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600302 return false;
303 }
304
305 return true;
306}
307
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700308static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
309 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600310 return "unrecognized enumerator";
311 }
312
313 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700314 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600315 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
316 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700317 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800318 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600319 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700320 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600321 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
322 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700323 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800324 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600325 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700326 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800327 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600328 }
329
330 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700331 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600332 enumeratorString += string;
333
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700334 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600335 enumeratorString += '|';
336 }
337 }
338
339 return enumeratorString;
340}
341
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700342static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700343 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700344 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600345 return false;
346 }
347
348 return true;
349}
350
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700351static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
352 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600353 return "unrecognized enumerator";
354 }
355
356 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700357 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800358 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600359 }
360
361 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700362 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600363 enumeratorString += string;
364
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700365 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600366 enumeratorString += '|';
367 }
368 }
369
370 return enumeratorString;
371}
372
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700373static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
374 VkSparseImageFormatFlagBits allFlags =
375 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
376 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
377 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600378 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600379 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600380
381 return true;
382}
383
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700384static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
385 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600386 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600387 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600388
389 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700390 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800391 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600392 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700393 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800394 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600395 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700396 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800397 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600398 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600399
400 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700401 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600402 enumeratorString += string;
403
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700404 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600405 enumeratorString += '|';
406 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600407 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600408
409 return enumeratorString;
410}
411
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700412static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700413 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700414 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600415 return false;
416 }
417
418 return true;
419}
420
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700421static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
422 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600423 return "unrecognized enumerator";
424 }
425
426 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700427 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600428 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
429 }
430
431 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700432 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600433 enumeratorString += string;
434
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700435 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600436 enumeratorString += '|';
437 }
438 }
439
440 return enumeratorString;
441}
442
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700443static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
444 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
445 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
446 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
447 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
448 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600449 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
450 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
451 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700452 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600453 return false;
454 }
455
456 return true;
457}
458
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700459static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
460 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600461 return "unrecognized enumerator";
462 }
463
464 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700465 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700466 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600467 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700468 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700469 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_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_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700472 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600473 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700474 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700475 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600476 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700477 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700478 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600479 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700480 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700481 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600482 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700483 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700484 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600485 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700486 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700487 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600488 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700489 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700490 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600491 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700492 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700493 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600494 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700495 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700496 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600497 }
498
499 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700500 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600501 enumeratorString += string;
502
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700503 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600504 enumeratorString += '|';
505 }
506 }
507
508 return enumeratorString;
509}
510
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700511static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
512 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
513 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
514 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600515 return false;
516 }
517
518 return true;
519}
520
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700521static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
522 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600523 return "unrecognized enumerator";
524 }
525
526 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700527 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600528 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
529 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700530 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600531 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
532 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700533 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600534 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
535 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700536 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600537 strings.push_back("VK_QUERY_RESULT_64_BIT");
538 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600539
540 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700541 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600542 enumeratorString += string;
543
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700544 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600545 enumeratorString += '|';
546 }
547 }
548
549 return enumeratorString;
550}
551
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700552static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
553 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
554 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
555 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
556 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
557 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600558 return false;
559 }
560
561 return true;
562}
563
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700564static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
565 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600566 return "unrecognized enumerator";
567 }
568
569 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700570 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600571 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
572 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700573 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600574 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
575 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700576 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600577 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
578 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700579 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600580 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
581 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700582 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600583 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
584 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700585 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800586 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600587 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700588 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600589 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
590 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700591 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800592 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600593 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700594 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600595 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
596 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600597
598 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700599 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600 enumeratorString += string;
601
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700602 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600603 enumeratorString += '|';
604 }
605 }
606
607 return enumeratorString;
608}
609
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700610static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
611 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
612 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
613 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600614 return false;
615 }
616
617 return true;
618}
619
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700620static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
621 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600622 return "unrecognized enumerator";
623 }
624
625 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700626 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600627 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
628 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700629 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600630 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
631 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700632 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600633 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600634 }
635
636 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700637 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600638 enumeratorString += string;
639
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700640 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600641 enumeratorString += '|';
642 }
643 }
644
645 return enumeratorString;
646}
647
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700648static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
649 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
650 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
651 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
652 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600653 return false;
654 }
655
656 return true;
657}
658
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700659static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
660 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600661 return "unrecognized enumerator";
662 }
663
664 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700665 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600666 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
667 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700668 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600669 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
670 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700671 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600672 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
673 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700674 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600675 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
676 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700677 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600678 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600679 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600680
681 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700682 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600683 enumeratorString += string;
684
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700685 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600686 enumeratorString += '|';
687 }
688 }
689
690 return enumeratorString;
691}
692
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700693static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
694 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
695 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
696 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600697 return false;
698 }
699
700 return true;
701}
702
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700703static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
704 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600705 return "unrecognized enumerator";
706 }
707
708 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700709 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800710 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600711 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700712 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800713 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600714 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700715 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800716 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600717 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700718 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800719 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600720 }
721
722 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700723 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600724 enumeratorString += string;
725
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700726 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600727 enumeratorString += '|';
728 }
729 }
730
731 return enumeratorString;
732}
733
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700734static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
735 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
736 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
737 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600738 return false;
739 }
740
741 return true;
742}
743
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700744static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
745 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600746 return "unrecognized enumerator";
747 }
748
749 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700750 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600751 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
752 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700753 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600754 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
755 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700756 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600757 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600758 }
759
760 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700761 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600762 enumeratorString += string;
763
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700764 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600765 enumeratorString += '|';
766 }
767 }
768
769 return enumeratorString;
770}
771
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700772static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
773 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
774 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
775 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
776 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600777 return false;
778 }
779
780 return true;
781}
782
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700783static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
784 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600785 return "unrecognized enumerator";
786 }
787
788 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700789 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600790 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600791 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700792 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600793 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600794 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700795 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600796 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
797 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700798 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600799 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
800 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700801 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600802 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600803 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700804 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600805 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600806 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700807 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600808 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600809 }
810
811 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700812 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600813 enumeratorString += string;
814
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700815 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600816 enumeratorString += '|';
817 }
818 }
819
820 return enumeratorString;
821}
822
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700823static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800824 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700825 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
826 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
827 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
828 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
829 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
830 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 -0700831 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700832 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600833 return false;
834 }
835
836 return true;
837}
838
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700839static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
840 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600841 return "unrecognized enumerator";
842 }
843
844 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700845 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800846 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
847 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700848 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800849 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600850 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700851 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600852 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600853 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700854 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600855 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600856 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700857 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600858 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600859 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700860 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700861 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600862 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700863 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600864 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600865 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700866 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600867 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600868 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700869 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600870 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600871 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700872 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600873 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600874 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700875 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600876 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
877 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700878 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600879 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
880 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700881 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700882 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600883 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700884 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600885 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
886 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700887 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600888 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
889 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700890 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600891 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
892 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700893 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600894 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600895 }
896
897 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700898 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600899 enumeratorString += string;
900
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700901 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600902 enumeratorString += '|';
903 }
904 }
905
906 return enumeratorString;
907}
908
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700909static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800910 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700911 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
912 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
913 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
914 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
915 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 +0800916
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700917 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600918 return false;
919 }
920
921 return true;
922}
923
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700924static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
925 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600926 return "unrecognized enumerator";
927 }
928
929 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700930 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800931 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600932 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700933 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800934 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600935 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700936 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800937 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600938 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700939 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800940 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600941 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700942 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800943 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600944 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700945 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800946 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600947 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700948 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800949 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600950 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700951 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800952 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600953 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700954 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800955 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600956 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700957 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800958 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600959 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700960 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800961 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600962 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700963 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800964 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600965 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700966 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800967 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600968 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700969 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800970 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600971 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700972 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800973 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600974 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700975 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800976 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600977 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700978 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800979 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600980 }
981
982 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700983 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600984 enumeratorString += string;
985
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700986 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600987 enumeratorString += '|';
988 }
989 }
990
991 return enumeratorString;
992}
993
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700994static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
995 VkCommandPoolCreateFlagBits allFlags =
996 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
997 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600998 return false;
999 }
1000
1001 return true;
1002}
1003
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001004static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1005 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001006 return "unrecognized enumerator";
1007 }
1008
1009 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001010 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001011 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001012 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001013 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001014 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001015 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001016
1017 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001018 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001019 enumeratorString += string;
1020
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001021 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001022 enumeratorString += '|';
1023 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001024 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001025
1026 return enumeratorString;
1027}
1028
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001029static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001030 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001031 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001032 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001033 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001034
1035 return true;
1036}
1037
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001038static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1039 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001040 return "unrecognized enumerator";
1041 }
1042
1043 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001044 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001045 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001046 }
1047
1048 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001049 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001050 enumeratorString += string;
1051
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001052 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001053 enumeratorString += '|';
1054 }
1055 }
1056
1057 return enumeratorString;
1058}
1059
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001060static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1061 VkCommandBufferUsageFlags allFlags =
1062 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1063 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1064 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001065 return false;
1066 }
1067
1068 return true;
1069}
1070
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001071static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1072 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001073 return "unrecognized enumerator";
1074 }
1075
1076 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001077 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001078 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001079 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001080 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001081 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001082 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001083 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001084 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001085 }
1086
1087 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001088 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001089 enumeratorString += string;
1090
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001091 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001092 enumeratorString += '|';
1093 }
1094 }
1095
1096 return enumeratorString;
1097}
1098
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001099static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001100 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001101 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001102 return false;
1103 }
1104
1105 return true;
1106}
1107
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001108static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1109 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001110 return "unrecognized enumerator";
1111 }
1112
1113 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001114 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001115 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001116 }
1117
1118 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001119 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001120 enumeratorString += string;
1121
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001122 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001123 enumeratorString += '|';
1124 }
1125 }
1126
1127 return enumeratorString;
1128}
1129
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001130static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1131 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1132 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1133 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001134 return false;
1135 }
1136
1137 return true;
1138}
1139
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001140static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1141 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001142 return "unrecognized enumerator";
1143 }
1144
1145 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001146 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001147 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1148 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001149 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001150 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1151 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001152 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001153 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1154 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001155 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001156 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1157 }
1158
1159 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001160 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001161 enumeratorString += string;
1162
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001163 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001164 enumeratorString += '|';
1165 }
1166 }
1167
1168 return enumeratorString;
1169}
1170
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001171static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001172 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001173 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001174 return false;
1175 }
1176
1177 return true;
1178}
1179
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001180static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1181 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001182 return "unrecognized enumerator";
1183 }
1184
1185 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001186 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001187 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001188 }
1189
1190 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001191 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001192 enumeratorString += string;
1193
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001194 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001195 enumeratorString += '|';
1196 }
1197 }
1198
1199 return enumeratorString;
1200}
1201
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001202static const int MaxParamCheckerStringLength = 256;
1203
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001204static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001205 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001206 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001207 assert(validateString != nullptr);
1208
Chris Forbes04b61da2016-11-03 09:53:59 +13001209 bool skip = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001210
1211 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1212
1213 if (result == VK_STRING_ERROR_NONE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001214 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001215 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001216
Chris Forbes04b61da2016-11-03 09:53:59 +13001217 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 -06001218 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1219 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001220 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001221 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001222 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1223 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001224 }
Chris Forbes04b61da2016-11-03 09:53:59 +13001225 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001226}
1227
Dustin Gravesde628532016-04-21 16:30:17 -06001228static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1229 uint32_t index) {
1230 assert(device_data != nullptr);
1231 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001232 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001233
1234 if (index == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001235 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001236 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001237 } else {
1238 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1239 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001240 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001241 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1242 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001243 function_name, parameter_name, index);
1244 return false;
1245 }
1246 }
1247
Chris Forbes04b61da2016-11-03 09:53:59 +13001248 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001249}
1250
1251static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1252 const uint32_t count, const uint32_t *indices) {
1253 assert(device_data != nullptr);
1254 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001255 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001256
1257 if (indices != nullptr) {
1258 for (uint32_t i = 0; i < count; i++) {
1259 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001260 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001261 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001262 } else {
1263 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1264 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001265 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001266 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1267 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001268 function_name, parameter_name, i, indices[i]);
1269 return false;
1270 }
1271 }
1272 }
1273 }
1274
Chris Forbes04b61da2016-11-03 09:53:59 +13001275 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001276}
1277
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001278static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance);
1279
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001280VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1281 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001282 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001283
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001284 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001285 assert(chain_info != nullptr);
1286 assert(chain_info->u.pLayerInfo != nullptr);
1287
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001288 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1289 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001290 if (fpCreateInstance == NULL) {
1291 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001292 }
1293
Dustin Graves842621d2016-03-03 14:17:08 -07001294 // Advance the link info for the next element on the chain
1295 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1296
1297 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001298
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001299 if (result == VK_SUCCESS) {
1300 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1301 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001302
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001303 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001304
Chia-I Wua570b7c2016-05-16 07:48:14 +08001305 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001306 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1307 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001308
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001309 // Look for one or more debug report create info structures
1310 // and setup a callback(s) for each one found.
1311 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1312 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1313 if (my_instance_data->num_tmp_callbacks > 0) {
1314 // Setup the temporary callback(s) here to catch early issues:
1315 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1316 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1317 // Failure of setting up one or more of the callback.
1318 // Therefore, clean up and don't use those callbacks:
1319 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1320 my_instance_data->num_tmp_callbacks = 0;
1321 }
1322 }
1323 }
1324
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001325 init_parameter_validation(my_instance_data, pAllocator);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001326 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001327
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001328 // Ordinarily we'd check these before calling down the chain, but none of the layer
1329 // support is in place until now, if we survive we can report the issue now.
1330 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001331
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001332 if (pCreateInfo->pApplicationInfo) {
1333 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1334 validate_string(my_instance_data->report_data, "vkCreateInstance",
1335 "pCreateInfo->VkApplicationInfo->pApplicationName",
1336 pCreateInfo->pApplicationInfo->pApplicationName);
1337 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001338
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001339 if (pCreateInfo->pApplicationInfo->pEngineName) {
1340 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1341 pCreateInfo->pApplicationInfo->pEngineName);
1342 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001343 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001344
1345 // Disable the tmp callbacks:
1346 if (my_instance_data->num_tmp_callbacks > 0) {
1347 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1348 my_instance_data->tmp_callbacks);
1349 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001350 }
1351
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001352 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001353}
1354
Chia-I Wu01ca2372016-05-13 14:37:49 +08001355VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001356 // Grab the key before the instance is destroyed.
1357 dispatch_key key = get_dispatch_key(instance);
Chris Forbes04b61da2016-11-03 09:53:59 +13001358 bool skip = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001359 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001360 assert(my_data != NULL);
1361
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001362 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1363 bool callback_setup = false;
1364 if (my_data->num_tmp_callbacks > 0) {
1365 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1366 my_data->tmp_callbacks)) {
1367 callback_setup = true;
1368 }
1369 }
1370
Chris Forbes04b61da2016-11-03 09:53:59 +13001371 skip |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001372
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001373 // Disable and cleanup the temporary callback(s):
1374 if (callback_setup) {
1375 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1376 }
1377 if (my_data->num_tmp_callbacks > 0) {
1378 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1379 my_data->num_tmp_callbacks = 0;
1380 }
1381
Chris Forbes04b61da2016-11-03 09:53:59 +13001382 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001383 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001384 pTable->DestroyInstance(instance, pAllocator);
1385
1386 // Clean up logging callback, if any
1387 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001388 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1389 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001390 my_data->logging_callback.pop_back();
1391 }
1392
Chris Forbes78a56b02016-11-02 16:13:01 +13001393 layer_debug_report_destroy_instance(my_data->report_data);
Dustin Graves27a912a2016-03-07 17:52:14 -07001394 layer_data_map.erase(pTable);
1395
1396 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001397 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001398 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001399}
1400
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001401VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1402 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001403 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001404 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001405 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001406 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001407
Chris Forbes04b61da2016-11-03 09:53:59 +13001408 skip |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001409
Chris Forbes04b61da2016-11-03 09:53:59 +13001410 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001411 result = get_dispatch_table(pc_instance_table_map, instance)
1412 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001413
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001414 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001415 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1416 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1417 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1418 // Save the supported features for each physical device
1419 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1420 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1421 }
1422 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001423 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001424 return result;
1425}
1426
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001427VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001428 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001429 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001430 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001431
Chris Forbes04b61da2016-11-03 09:53:59 +13001432 skip |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001433
Chris Forbes04b61da2016-11-03 09:53:59 +13001434 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001435 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001436 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001437}
1438
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001439VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1440 VkFormatProperties *pFormatProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001441 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001442 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001443 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001444
Chris Forbes04b61da2016-11-03 09:53:59 +13001445 skip |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001446
Chris Forbes04b61da2016-11-03 09:53:59 +13001447 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001448 get_dispatch_table(pc_instance_table_map, physicalDevice)
1449 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001450 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001451}
1452
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001453VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1454 VkImageType type, VkImageTiling tiling,
1455 VkImageUsageFlags usage, VkImageCreateFlags flags,
1456 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001457 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001458 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001459 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001460 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001461
Chris Forbes04b61da2016-11-03 09:53:59 +13001462 skip |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001463 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001464
Chris Forbes04b61da2016-11-03 09:53:59 +13001465 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001466 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1467 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1468 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001469
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001470 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001471 }
Chia-I Wu17241042015-10-31 00:31:16 +08001472
1473 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001474}
1475
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001476VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001477 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001478 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001479 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001480
Chris Forbes04b61da2016-11-03 09:53:59 +13001481 skip |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001482
Chris Forbes04b61da2016-11-03 09:53:59 +13001483 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001484 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001485 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001486}
1487
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001488VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1489 uint32_t *pQueueFamilyPropertyCount,
1490 VkQueueFamilyProperties *pQueueFamilyProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001491 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001492 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001493 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001494
Chris Forbes04b61da2016-11-03 09:53:59 +13001495 skip |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001496 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001497
Chris Forbes04b61da2016-11-03 09:53:59 +13001498 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001499 get_dispatch_table(pc_instance_table_map, physicalDevice)
1500 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001501 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001502}
1503
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001504VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1505 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001506 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001507 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001508 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001509
Chris Forbes04b61da2016-11-03 09:53:59 +13001510 skip |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001511
Chris Forbes04b61da2016-11-03 09:53:59 +13001512 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001513 get_dispatch_table(pc_instance_table_map, physicalDevice)
1514 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001515 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001516}
1517
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001518void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1519 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001520 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001521
Chris Forbes0e0161a2016-11-02 16:21:28 +13001522 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1523
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001524 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1525 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1526 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001527 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001528 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001529 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1530 "structure.",
1531 i);
1532 } else {
1533 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001534 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001535
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001536 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1537 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1538 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1539 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001540 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 -06001541 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001542 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1543 "between 0 and 1. Actual value is %f",
1544 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1545 }
1546 }
1547 }
1548
1549 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1550 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001551 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 -06001552 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001553 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1554 "of queue families.",
1555 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001556 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1557 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1558 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001559 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 -06001560 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001561 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1562 "queues for the given family index.",
1563 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001564 }
Michael Lentine774704f2016-01-27 13:36:46 -06001565 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001566 }
1567}
1568
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001569static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001570 VkLayerInstanceDispatchTable *dispatch_table = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001571
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001572 instance_extension_map[dispatch_table] = {};
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001573
1574 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1575 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbesd017eff2016-11-02 17:36:42 +13001576 instance_extension_map[dispatch_table].surface_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001577 }
1578#ifdef VK_USE_PLATFORM_XLIB_KHR
1579 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001580 instance_extension_map[dispatch_table].xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001581 }
1582#endif
1583#ifdef VK_USE_PLATFORM_XCB_KHR
1584 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001585 instance_extension_map[dispatch_table].xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001586 }
1587#endif
1588#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1589 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001590 instance_extension_map[dispatch_table].wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001591 }
1592#endif
1593#ifdef VK_USE_PLATFORM_MIR_KHR
1594 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001595 instance_extension_map[dispatch_table].mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001596 }
1597#endif
1598#ifdef VK_USE_PLATFORM_ANDROID_KHR
1599 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001600 instance_extension_map[dispatch_table].android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001601 }
1602#endif
1603#ifdef VK_USE_PLATFORM_WIN32_KHR
1604 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001605 instance_extension_map[dispatch_table].win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001606 }
1607#endif
Chris Forbes2e47f432016-11-03 10:18:18 +13001608 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
1609 instance_extension_map[dispatch_table].display_enabled = true;
1610 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001611 }
1612}
1613
1614static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1615 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes27e49622016-11-02 17:54:21 +13001616 device_data->swapchain_enabled = false;
1617 device_data->display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001618 device_data->amd_negative_viewport_height_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001619
1620 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1621 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001622 device_data->swapchain_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001623 }
Mark Youngead9b932016-09-08 12:28:38 -06001624 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001625 device_data->display_swapchain_enabled = true;
Mark Youngead9b932016-09-08 12:28:38 -06001626 }
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001627 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME) == 0) {
1628 device_data->amd_negative_viewport_height_enabled = true;
1629 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001630 }
1631}
1632
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001633void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001634 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001635
1636 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1637 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1638 my_device_data->queueFamilyIndexMap.insert(
1639 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1640 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001641 }
1642}
1643
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001644VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001645 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001646 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001647 * NOTE: We do not validate physicalDevice or any dispatchable
1648 * object as the first parameter. We couldn't get here if it was wrong!
1649 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001650
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001651 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001652 bool skip = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001653 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001654 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001655
Chris Forbes04b61da2016-11-03 09:53:59 +13001656 skip |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001657
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001658 if (pCreateInfo != NULL) {
1659 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001660 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001661 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001662 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001663 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001664 }
Michael Lentine774704f2016-01-27 13:36:46 -06001665
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001666 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001667 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001668 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001669 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001670 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001671 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001672 }
1673
Chris Forbes04b61da2016-11-03 09:53:59 +13001674 if (!skip) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001675 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001676 assert(chain_info != nullptr);
1677 assert(chain_info->u.pLayerInfo != nullptr);
1678
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001679 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1680 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001681 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001682 if (fpCreateDevice == NULL) {
1683 return VK_ERROR_INITIALIZATION_FAILED;
1684 }
1685
1686 // Advance the link info for the next element on the chain
1687 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1688
1689 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001690
1691 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1692
1693 if (result == VK_SUCCESS) {
1694 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1695 assert(my_device_data != nullptr);
1696
1697 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1698 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1699
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001700 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1701
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001702 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001703 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1704 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001705 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001706 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001707
1708 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1709 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001710
1711 // Query and save physical device limits for this device
1712 VkPhysicalDeviceProperties device_properties = {};
1713 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1714 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001715 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001716
1717 // Save app-enabled features in this device's layer_data structure
1718 if (pCreateInfo->pEnabledFeatures) {
1719 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1720 } else {
1721 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1722 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001723 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001724 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001725
Jeremy Hayes99a96322015-06-26 12:48:09 -06001726 return result;
1727}
1728
Chia-I Wu01ca2372016-05-13 14:37:49 +08001729VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001730 dispatch_key key = get_dispatch_key(device);
Chris Forbes04b61da2016-11-03 09:53:59 +13001731 bool skip = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001732 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1733 assert(my_data != NULL);
1734
Chris Forbes04b61da2016-11-03 09:53:59 +13001735 skip |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001736
Chris Forbes04b61da2016-11-03 09:53:59 +13001737 if (!skip) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001738 layer_debug_report_destroy_device(device);
1739
Jeremy Hayes99a96322015-06-26 12:48:09 -06001740#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001741 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001742#endif
1743
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001744 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001745 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001746 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001747 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001748}
1749
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001750bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001751 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001752 assert(my_device_data != nullptr);
1753
Dustin Gravesde628532016-04-21 16:30:17 -06001754 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001755
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001756 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001757 if (queue_data->second <= queueIndex) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001758 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 -06001759 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001760 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1761 "was created.",
1762 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001763 return false;
1764 }
1765 return true;
1766}
1767
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001768VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001769 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001770 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001771 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001772
Chris Forbes04b61da2016-11-03 09:53:59 +13001773 skip |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001774
Chris Forbes04b61da2016-11-03 09:53:59 +13001775 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001776 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1777
1778 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001779 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001780}
1781
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001782VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001783 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001784 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001785 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001786 assert(my_data != NULL);
1787
Chris Forbes04b61da2016-11-03 09:53:59 +13001788 skip |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001789
Chris Forbes04b61da2016-11-03 09:53:59 +13001790 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001791 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1792
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001793 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001794 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001795
Jeremy Hayes99a96322015-06-26 12:48:09 -06001796 return result;
1797}
1798
Chia-I Wu01ca2372016-05-13 14:37:49 +08001799VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001800 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1801 assert(my_data != NULL);
1802
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001803 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001804
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001805 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001806
1807 return result;
1808}
1809
Chia-I Wu01ca2372016-05-13 14:37:49 +08001810VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001811 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1812 assert(my_data != NULL);
1813
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001814 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001815
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001816 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001817
1818 return result;
1819}
1820
Chia-I Wu01ca2372016-05-13 14:37:49 +08001821VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001822 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001823 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001824 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001825 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001826 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001827
Chris Forbes04b61da2016-11-03 09:53:59 +13001828 skip |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001829
Chris Forbes04b61da2016-11-03 09:53:59 +13001830 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001831 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1832
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001833 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001834 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001835
1836 return result;
1837}
1838
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001839VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
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 Graves27a912a2016-03-07 17:52:14 -07001842 assert(my_data != NULL);
1843
Chris Forbes04b61da2016-11-03 09:53:59 +13001844 skip |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001845
Chris Forbes04b61da2016-11-03 09:53:59 +13001846 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001847 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001848 }
1849}
1850
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001851VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1852 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001853 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001854 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001855 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001856 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001857
Chris Forbes04b61da2016-11-03 09:53:59 +13001858 skip |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001859
Chris Forbes04b61da2016-11-03 09:53:59 +13001860 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001861 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1862
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001863 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001864 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001865
1866 return result;
1867}
1868
Chia-I Wu01ca2372016-05-13 14:37:49 +08001869VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001870 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001871 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1872 assert(my_data != NULL);
1873
Chris Forbes04b61da2016-11-03 09:53:59 +13001874 skip |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001875
Chris Forbes04b61da2016-11-03 09:53:59 +13001876 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001877 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1878 }
1879}
1880
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001881VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1882 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001883 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001884 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001885 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001886 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001887
Chris Forbes04b61da2016-11-03 09:53:59 +13001888 skip |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001889
Chris Forbes04b61da2016-11-03 09:53:59 +13001890 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001891 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1892
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001893 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001894 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001895
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001896 return result;
1897}
1898
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001899VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1900 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001901 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001902 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001903 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001904 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001905
Chris Forbes04b61da2016-11-03 09:53:59 +13001906 skip |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001907
Chris Forbes04b61da2016-11-03 09:53:59 +13001908 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001909 result =
1910 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001911
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001912 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001913 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001914
Tony Barbourb1250542015-04-16 19:23:13 -06001915 return result;
1916}
1917
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001918VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1919 VkDeviceSize *pCommittedMemoryInBytes) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001920 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001921 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001922 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001923
Chris Forbes04b61da2016-11-03 09:53:59 +13001924 skip |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001925
Chris Forbes04b61da2016-11-03 09:53:59 +13001926 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001927 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001928 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001929}
1930
Chia-I Wu01ca2372016-05-13 14:37:49 +08001931VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1932 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001933 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001934 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001935 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1936 assert(my_data != NULL);
1937
Chris Forbes04b61da2016-11-03 09:53:59 +13001938 skip |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001939
Chris Forbes04b61da2016-11-03 09:53:59 +13001940 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001941 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1942
1943 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1944 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001945
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001946 return result;
1947}
1948
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001949VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001950 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001951 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001952 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1953 assert(my_data != NULL);
1954
Chris Forbes04b61da2016-11-03 09:53:59 +13001955 skip |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001956
Chris Forbes04b61da2016-11-03 09:53:59 +13001957 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001958 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1959
1960 validate_result(my_data->report_data, "vkBindImageMemory", result);
1961 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001962
1963 return result;
1964}
1965
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001966VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1967 VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001968 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001969 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001970 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001971
Chris Forbes04b61da2016-11-03 09:53:59 +13001972 skip |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001973
Chris Forbes04b61da2016-11-03 09:53:59 +13001974 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001975 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001976 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001977}
1978
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001979VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001980 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001981 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001982 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001983
Chris Forbes04b61da2016-11-03 09:53:59 +13001984 skip |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001985
Chris Forbes04b61da2016-11-03 09:53:59 +13001986 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001987 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001988 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001989}
1990
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001991bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1992 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001993 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001994 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001995 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001996 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1997 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001998 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 -06001999 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002000 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2001 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002002 return false;
2003 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002004 }
2005
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002006 return true;
2007}
2008
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002009VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2010 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002011 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002012 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002013 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002014
Chris Forbes04b61da2016-11-03 09:53:59 +13002015 skip |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002016 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002017
Chris Forbes04b61da2016-11-03 09:53:59 +13002018 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002019 get_dispatch_table(pc_device_table_map, device)
2020 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002021
2022 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2023 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002024}
2025
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002026bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2027 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2028 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002029 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002030 if (pProperties != nullptr) {
2031 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2032 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002033 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 -06002034 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002035 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2036 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002037 return false;
2038 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002039 }
2040
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002041 return true;
2042}
2043
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002044VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2045 VkImageType type, VkSampleCountFlagBits samples,
2046 VkImageUsageFlags usage, VkImageTiling tiling,
2047 uint32_t *pPropertyCount,
2048 VkSparseImageFormatProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002049 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002050 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002051 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002052
Chris Forbes04b61da2016-11-03 09:53:59 +13002053 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002054 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002055
Chris Forbes04b61da2016-11-03 09:53:59 +13002056 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002057 get_dispatch_table(pc_instance_table_map, physicalDevice)
2058 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2059 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002060
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002061 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2062 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002063 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002064}
2065
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002066VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2067 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002068 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002069 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002070 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002071 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002072
Chris Forbes04b61da2016-11-03 09:53:59 +13002073 skip |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002074
Chris Forbes04b61da2016-11-03 09:53:59 +13002075 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002076 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2077
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002078 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002079 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002080
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002081 return result;
2082}
2083
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002084VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2085 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002086 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
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 Graves1e92cd72016-02-09 14:00:18 -07002089 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002090
Chris Forbes04b61da2016-11-03 09:53:59 +13002091 skip |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002092
Chris Forbes04b61da2016-11-03 09:53:59 +13002093 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002094 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2095
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002096 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002097 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002098
2099 return result;
2100}
2101
Chia-I Wu01ca2372016-05-13 14:37:49 +08002102VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002103 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002104 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002105 assert(my_data != NULL);
2106
Chris Forbes04b61da2016-11-03 09:53:59 +13002107 skip |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002108
Chris Forbes04b61da2016-11-03 09:53:59 +13002109 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002110 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002111 }
2112}
2113
Chia-I Wu01ca2372016-05-13 14:37:49 +08002114VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002115 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002116 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002117 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002118 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002119
Chris Forbes04b61da2016-11-03 09:53:59 +13002120 skip |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002121
Chris Forbes04b61da2016-11-03 09:53:59 +13002122 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002123 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2124
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002125 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002126 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002127
2128 return result;
2129}
2130
Chia-I Wu01ca2372016-05-13 14:37:49 +08002131VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002132 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002133 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002134 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2135 assert(my_data != NULL);
2136
Chris Forbes04b61da2016-11-03 09:53:59 +13002137 skip |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002138
Chris Forbes04b61da2016-11-03 09:53:59 +13002139 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002140 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2141
2142 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2143 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002144
2145 return result;
2146}
2147
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002148VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2149 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002150 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002151 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002152 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002153 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002154
Chris Forbes04b61da2016-11-03 09:53:59 +13002155 skip |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002156
Chris Forbes04b61da2016-11-03 09:53:59 +13002157 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002158 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2159
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002160 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002161 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002162
2163 return result;
2164}
2165
Chia-I Wu01ca2372016-05-13 14:37:49 +08002166VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002167 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002168 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
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 Graves1e92cd72016-02-09 14:00:18 -07002171 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002172
Chris Forbes04b61da2016-11-03 09:53:59 +13002173 skip |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002174
Chris Forbes04b61da2016-11-03 09:53:59 +13002175 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002176 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2177
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002178 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002179 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002180
2181 return result;
2182}
2183
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002184VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002185 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002186 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002187 assert(my_data != NULL);
2188
Chris Forbes04b61da2016-11-03 09:53:59 +13002189 skip |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002190
Chris Forbes04b61da2016-11-03 09:53:59 +13002191 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002192 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002193 }
2194}
2195
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002196VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2197 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002198 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
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 Graves1e92cd72016-02-09 14:00:18 -07002201 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002202
Chris Forbes04b61da2016-11-03 09:53:59 +13002203 skip |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002204
Chris Forbes04b61da2016-11-03 09:53:59 +13002205 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002206 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2207
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002208 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002209 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002210
2211 return result;
2212}
2213
Chia-I Wu01ca2372016-05-13 14:37:49 +08002214VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002215 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002216 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002217 assert(my_data != NULL);
2218
Chris Forbes04b61da2016-11-03 09:53:59 +13002219 skip |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002220
Chris Forbes04b61da2016-11-03 09:53:59 +13002221 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002222 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002223 }
2224}
2225
Chia-I Wu01ca2372016-05-13 14:37:49 +08002226VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002227 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002228 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002229 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2230 assert(my_data != NULL);
2231
Chris Forbes04b61da2016-11-03 09:53:59 +13002232 skip |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002233
Chris Forbes04b61da2016-11-03 09:53:59 +13002234 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002235 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2236
2237 validate_result(my_data->report_data, "vkGetEventStatus", result);
2238 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002239
2240 return result;
2241}
2242
Chia-I Wu01ca2372016-05-13 14:37:49 +08002243VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002244 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002245 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002246 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2247 assert(my_data != NULL);
2248
Chris Forbes04b61da2016-11-03 09:53:59 +13002249 skip |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002250
Chris Forbes04b61da2016-11-03 09:53:59 +13002251 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002252 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2253
2254 validate_result(my_data->report_data, "vkSetEvent", result);
2255 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002256
2257 return result;
2258}
2259
Chia-I Wu01ca2372016-05-13 14:37:49 +08002260VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002261 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002262 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002263 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2264 assert(my_data != NULL);
2265
Chris Forbes04b61da2016-11-03 09:53:59 +13002266 skip |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002267
Chris Forbes04b61da2016-11-03 09:53:59 +13002268 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002269 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2270
2271 validate_result(my_data->report_data, "vkResetEvent", result);
2272 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002273
2274 return result;
2275}
2276
Chia-I Wu01ca2372016-05-13 14:37:49 +08002277VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002278 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002279 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002280 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002281 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2282 assert(device_data != nullptr);
2283 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002284
Chris Forbes04b61da2016-11-03 09:53:59 +13002285 skip |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002286
Dustin Gravesc900f572016-05-16 11:07:59 -06002287 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2288 if (pCreateInfo != nullptr) {
2289 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2290 // VkQueryPipelineStatisticFlagBits values
2291 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2292 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002293 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002294 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2295 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2296 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2297 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2298 }
2299 }
2300
Chris Forbes04b61da2016-11-03 09:53:59 +13002301 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002302 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2303
Dustin Gravesc900f572016-05-16 11:07:59 -06002304 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002305 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002306
2307 return result;
2308}
2309
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002310VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002311 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002312 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002313 assert(my_data != NULL);
2314
Chris Forbes04b61da2016-11-03 09:53:59 +13002315 skip |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002316
Chris Forbes04b61da2016-11-03 09:53:59 +13002317 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002318 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002319 }
2320}
2321
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002322VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2323 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002324 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002325 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002326 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002327 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002328
Chris Forbes04b61da2016-11-03 09:53:59 +13002329 skip |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002330 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002331
Chris Forbes04b61da2016-11-03 09:53:59 +13002332 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002333 result = get_dispatch_table(pc_device_table_map, device)
2334 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002335
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002336 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002337 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002338
2339 return result;
2340}
2341
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002342VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2343 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002344 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002345 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002346 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2347 assert(device_data != nullptr);
2348 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002349
Karl Schultza9ef1e52016-10-06 17:53:48 -06002350 // TODO: Add check for VALIDATION_ERROR_00660
2351 // TODO: Add check for VALIDATION_ERROR_00661
2352 // TODO: Add check for VALIDATION_ERROR_00662
2353 // TODO: Add check for VALIDATION_ERROR_00670
2354 // TODO: Add check for VALIDATION_ERROR_00671
2355 // TODO: Add check for VALIDATION_ERROR_00672
2356 // TODO: Add check for VALIDATION_ERROR_00673
2357 // TODO: Add check for VALIDATION_ERROR_00674
2358 // TODO: Add check for VALIDATION_ERROR_00675
2359 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2360 // TODO: Add check for VALIDATION_ERROR_00663
Chris Forbes04b61da2016-11-03 09:53:59 +13002361 skip |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002362
Dustin Gravesc900f572016-05-16 11:07:59 -06002363 if (pCreateInfo != nullptr) {
2364 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2365 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2366 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2367 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002368 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 -06002369 __LINE__, VALIDATION_ERROR_00665, LayerName,
2370 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2371 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2372 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002373 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002374
Dustin Gravesc900f572016-05-16 11:07:59 -06002375 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2376 // queueFamilyIndexCount uint32_t values
2377 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002378 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 -06002379 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002380 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2381 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002382 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2383 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002384 }
2385
2386 // Ensure that the queue family indices were specified at device creation
Chris Forbes04b61da2016-11-03 09:53:59 +13002387 skip |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesc900f572016-05-16 11:07:59 -06002388 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2389 }
2390 }
2391
Chris Forbes04b61da2016-11-03 09:53:59 +13002392 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002393 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2394
Dustin Gravesc900f572016-05-16 11:07:59 -06002395 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002396 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002397
2398 return result;
2399}
2400
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002401VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002402 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002403 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002404 assert(my_data != NULL);
2405
Chris Forbes04b61da2016-11-03 09:53:59 +13002406 skip |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002407
Chris Forbes04b61da2016-11-03 09:53:59 +13002408 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002409 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002410 }
2411}
2412
Chia-I Wu01ca2372016-05-13 14:37:49 +08002413VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2414 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002415 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002416 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002417 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002418 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002419
Chris Forbes04b61da2016-11-03 09:53:59 +13002420 skip |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002421
Chris Forbes04b61da2016-11-03 09:53:59 +13002422 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002423 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2424
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002425 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002426 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002427
2428 return result;
2429}
2430
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002431VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002432 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002433 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002434 assert(my_data != NULL);
2435
Chris Forbes04b61da2016-11-03 09:53:59 +13002436 skip |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002437
Chris Forbes04b61da2016-11-03 09:53:59 +13002438 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002439 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002440 }
2441}
2442
Chia-I Wu01ca2372016-05-13 14:37:49 +08002443VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2444 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002445 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002446 bool skip = false;
Dustin Gravesf8032f22016-05-11 18:31:44 -06002447 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002448 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002449 debug_report_data *report_data = device_data->report_data;
2450
Chris Forbes04b61da2016-11-03 09:53:59 +13002451 skip |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002452
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002453 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002454 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002455 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002456 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2457 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002458 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002459 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2460 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2461 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2462 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002463
Dustin Gravesc900f572016-05-16 11:07:59 -06002464 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2465 // queueFamilyIndexCount uint32_t values
2466 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002467 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 -06002468 __LINE__, REQUIRED_PARAMETER, LayerName,
2469 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2470 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2471 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2472 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002473
Chris Forbes04b61da2016-11-03 09:53:59 +13002474 skip |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesf8032f22016-05-11 18:31:44 -06002475 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2476 }
2477
2478 // width, height, and depth members of extent must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002479 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2480 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002481 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
Chris Forbes04b61da2016-11-03 09:53:59 +13002482 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002483
2484 // mipLevels must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002485 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002486
2487 // arrayLayers must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002488 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002489
2490 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2491 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002492 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002493 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002494 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002495 }
2496
2497 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2498 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2499 // extent.height must be equal
2500 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2501 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002502 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002503 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2504 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2505 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002506 }
2507
2508 if (pCreateInfo->extent.depth != 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002509 skip |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002510 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002511 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2512 }
2513 }
2514
2515 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2516 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2517 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002518 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002519 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2520 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2521 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002522 }
2523
2524 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2525 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2526 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2527 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002528 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002529 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2530 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2531 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002532 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002533 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002534
Chris Forbes04b61da2016-11-03 09:53:59 +13002535 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002536 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2537
Dustin Gravesf8032f22016-05-11 18:31:44 -06002538 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002539 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002540
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002541 return result;
2542}
2543
Chia-I Wu01ca2372016-05-13 14:37:49 +08002544VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002545 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002546 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002547 assert(my_data != NULL);
2548
Chris Forbes04b61da2016-11-03 09:53:59 +13002549 skip |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002550
Chris Forbes04b61da2016-11-03 09:53:59 +13002551 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002552 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002553 }
2554}
2555
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002556bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002557 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002558 if (pSubresource != nullptr) {
2559 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2560 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002561 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 -06002562 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002563 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2564 return false;
2565 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002566 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002567
2568 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002569}
2570
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002571VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2572 VkSubresourceLayout *pLayout) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002573 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002574 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002575 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002576
Chris Forbes04b61da2016-11-03 09:53:59 +13002577 skip |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002578
Chris Forbes04b61da2016-11-03 09:53:59 +13002579 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002580 PreGetImageSubresourceLayout(device, pSubresource);
2581
2582 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002583 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002584}
2585
Chia-I Wu01ca2372016-05-13 14:37:49 +08002586VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2587 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002588 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002589 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002590 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002591 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002592 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002593
Chris Forbes04b61da2016-11-03 09:53:59 +13002594 skip |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002595
Dustin Graves0b70a632016-04-27 17:44:56 -06002596 if (pCreateInfo != nullptr) {
2597 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002598 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2599 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002600 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002601 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2602 "pCreateInfo->subresourceRange.layerCount must be 1",
2603 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2604 }
2605 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002606 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2607 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2608 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002609 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002610 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2611 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2612 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2613 }
2614 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002615 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2616 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002617 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002618 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2619 "pCreateInfo->subresourceRange.layerCount must be 6");
2620 }
2621 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002622 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2623 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002624 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002625 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2626 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2627 }
2628 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2629 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002630 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002631 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2632 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2633 }
2634
Dustin Graves2a80dc62016-07-12 13:57:02 -06002635 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2636 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002637 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002638 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2639 "pCreateInfo->subresourceRange.layerCount must be 1");
2640 }
2641 }
2642 }
2643
Chris Forbes04b61da2016-11-03 09:53:59 +13002644 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002645 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2646
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002647 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002648 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002649
2650 return result;
2651}
2652
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002653VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002654 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002655 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002656 assert(my_data != NULL);
2657
Chris Forbes04b61da2016-11-03 09:53:59 +13002658 skip |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002659
Chris Forbes04b61da2016-11-03 09:53:59 +13002660 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002661 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002662 }
2663}
2664
Chia-I Wu01ca2372016-05-13 14:37:49 +08002665VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002666 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002667 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002668 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002669 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002670 assert(my_data != NULL);
2671
Chris Forbes04b61da2016-11-03 09:53:59 +13002672 skip |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002673
Chris Forbes04b61da2016-11-03 09:53:59 +13002674 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002675 result =
2676 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002677
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002678 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002679 }
2680
Michael Lentine03d8e572015-09-15 14:59:14 -05002681 return result;
2682}
2683
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002684VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2685 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002686 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002687 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002688 assert(my_data != NULL);
2689
Chris Forbes04b61da2016-11-03 09:53:59 +13002690 skip |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002691
Chris Forbes04b61da2016-11-03 09:53:59 +13002692 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002693 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002694 }
2695}
2696
Chia-I Wu01ca2372016-05-13 14:37:49 +08002697VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002698 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002699 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002700 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002701 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002702 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002703
Chris Forbes04b61da2016-11-03 09:53:59 +13002704 skip |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002705
Chris Forbes04b61da2016-11-03 09:53:59 +13002706 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002707 result =
2708 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002709
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002710 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002711 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002712
2713 return result;
2714}
2715
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002716VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2717 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002718 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002719 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002720 assert(my_data != NULL);
2721
Chris Forbes04b61da2016-11-03 09:53:59 +13002722 skip |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002723
Chris Forbes04b61da2016-11-03 09:53:59 +13002724 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002725 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002726 }
2727}
2728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002729VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2730 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002731 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002732 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002733 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002734 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002735
Chris Forbes04b61da2016-11-03 09:53:59 +13002736 skip |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002737
Chris Forbes04b61da2016-11-03 09:53:59 +13002738 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002739 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2740
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002741 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002742 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002743
2744 return result;
2745}
2746
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002747VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2748 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002749 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002750 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002751 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002752 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002753
Chris Forbes04b61da2016-11-03 09:53:59 +13002754 skip |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002755
Chris Forbes04b61da2016-11-03 09:53:59 +13002756 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002757 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2758
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002759 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002760 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002761
2762 return result;
2763}
2764
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002765bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002766 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2767
2768 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002769 if (pCreateInfos != nullptr) {
2770 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2771 if (pCreateInfos->basePipelineIndex != -1) {
2772 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002773 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 -06002774 VALIDATION_ERROR_00526, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002775 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2776 "pCreateInfos->flags "
Mike Weiblen9858d962016-10-31 23:59:10 -06002777 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1. %s",
2778 validation_error_map[VALIDATION_ERROR_00526]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002779 return false;
2780 }
2781 }
2782
2783 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2784 if (pCreateInfos->basePipelineIndex != -1) {
2785 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002786 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 -06002787 VALIDATION_ERROR_00528, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002788 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2789 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
Mike Weiblen9858d962016-10-31 23:59:10 -06002790 "VK_NULL_HANDLE. %s",
2791 validation_error_map[VALIDATION_ERROR_00528]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002792 return false;
2793 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002794 }
2795 }
2796
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002797 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002798 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002799 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 -06002800 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002801 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2802 "unrecognized enumerator");
2803 return false;
2804 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002805
2806 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2807 (data->physical_device_features.fillModeNonSolid == false)) {
2808 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002809 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 -06002810 DEVICE_FEATURE, LayerName,
2811 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2812 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2813 return false;
2814 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002815 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002816
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002817 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002818 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002819 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2820 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002821 pCreateInfos[i].pStages[j].pName);
2822 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002823 }
2824
2825 return true;
2826}
2827
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002828VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2829 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2830 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002831 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002832 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002833 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2834 assert(device_data != nullptr);
2835 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002836
Chris Forbes04b61da2016-11-03 09:53:59 +13002837 skip |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
Dustin Gravesc900f572016-05-16 11:07:59 -06002838 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002839
Dustin Gravesc900f572016-05-16 11:07:59 -06002840 if (pCreateInfos != nullptr) {
2841 for (uint32_t i = 0; i < createInfoCount; ++i) {
2842 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2843 if (pCreateInfos[i].pTessellationState == nullptr) {
2844 if (pCreateInfos[i].pStages != nullptr) {
2845 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2846 // pTessellationState must not be NULL
2847 bool has_control = false;
2848 bool has_eval = false;
2849
2850 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2851 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2852 has_control = true;
2853 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2854 has_eval = true;
2855 }
2856 }
2857
2858 if (has_control && has_eval) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002859 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 -06002860 __LINE__, VALIDATION_ERROR_00536, LayerName,
2861 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2862 "control shader stage and a tessellation evaluation shader stage, "
2863 "pCreateInfos[%d].pTessellationState must not be NULL. %s",
2864 i, i, validation_error_map[VALIDATION_ERROR_00536]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002865 }
2866 }
Dustin Graves629259b2016-05-30 16:14:27 -06002867 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002868 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002869 report_data, "vkCreateGraphicsPipelines",
2870 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2871 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002872
Chris Forbes04b61da2016-11-03 09:53:59 +13002873 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002874 report_data, "vkCreateGraphicsPipelines",
2875 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2876 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002877
2878 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002879 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 -06002880 __LINE__, VALIDATION_ERROR_00538, LayerName,
2881 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2882 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO. %s",
2883 i, validation_error_map[VALIDATION_ERROR_00538]);
Dustin Graves629259b2016-05-30 16:14:27 -06002884 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002885 }
2886
2887 if (pCreateInfos[i].pViewportState == nullptr) {
2888 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2889 // valid VkPipelineViewportStateCreateInfo structure
2890 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2891 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002892 skip |= log_msg(
Dustin Gravesc900f572016-05-16 11:07:59 -06002893 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002894 VALIDATION_ERROR_02113, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002895 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
Mike Weiblen9858d962016-10-31 23:59:10 -06002896 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure. "
2897 "%s",
2898 i, i, validation_error_map[VALIDATION_ERROR_02113]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002899 }
2900 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002901 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002902 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2903 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2904 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002905
Chris Forbes04b61da2016-11-03 09:53:59 +13002906 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002907 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2908 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002909 pCreateInfos[i].pViewportState->flags);
2910
Dustin Gravesc900f572016-05-16 11:07:59 -06002911 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002912 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 -06002913 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2914 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2915 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2916 i);
2917 }
2918
2919 if (pCreateInfos[i].pDynamicState != nullptr) {
2920 bool has_dynamic_viewport = false;
2921 bool has_dynamic_scissor = false;
2922
2923 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2924 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2925 has_dynamic_viewport = true;
2926 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2927 has_dynamic_scissor = true;
2928 }
2929 }
2930
2931 // viewportCount must be greater than 0
2932 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2933 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002934 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 -06002935 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002936 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2937 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002938 "must be greater than 0",
2939 i, i);
2940 }
2941
2942 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2943 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2944 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002945 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002946 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 -06002947 __LINE__, VALIDATION_ERROR_02110, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002948 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002949 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL. %s",
2950 i, i, validation_error_map[VALIDATION_ERROR_02110]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002951 }
2952
2953 // scissorCount must be greater than 0
2954 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2955 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002956 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 -06002957 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002958 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2959 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002960 "must be greater than 0",
2961 i, i);
2962 }
2963
2964 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2965 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2966 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002967 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002968 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 -06002969 __LINE__, VALIDATION_ERROR_02111, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002970 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002971 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL. %s",
2972 i, i, validation_error_map[VALIDATION_ERROR_02111]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002973 }
2974 }
2975 }
2976
2977 if (pCreateInfos[i].pMultisampleState == nullptr) {
2978 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2979 // a valid VkPipelineMultisampleStateCreateInfo structure
2980 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2981 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
Mike Weiblen9858d962016-10-31 23:59:10 -06002982 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2983 __LINE__, VALIDATION_ERROR_02114, LayerName,
2984 "vkCreateGraphicsPipelines: if "
2985 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2986 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL. %s",
2987 i, i, validation_error_map[VALIDATION_ERROR_02114]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002988 }
Dustin Graves629259b2016-05-30 16:14:27 -06002989 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002990 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002991 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2992 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002993 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002994
Chris Forbes04b61da2016-11-03 09:53:59 +13002995 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002996 report_data, "vkCreateGraphicsPipelines",
2997 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
2998 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002999
Chris Forbes04b61da2016-11-03 09:53:59 +13003000 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003001 report_data, "vkCreateGraphicsPipelines",
3002 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
3003 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003004
Chris Forbes04b61da2016-11-03 09:53:59 +13003005 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003006 report_data, "vkCreateGraphicsPipelines",
3007 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3008 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3009 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3010 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003011
Chris Forbes04b61da2016-11-03 09:53:59 +13003012 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003013 report_data, "vkCreateGraphicsPipelines",
3014 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3015 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003016
Chris Forbes04b61da2016-11-03 09:53:59 +13003017 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003018 report_data, "vkCreateGraphicsPipelines",
3019 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3020 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003021
3022 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003023 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 -06003024 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3025 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3026 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3027 i);
3028 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003029 }
3030
3031 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003032 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003033 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003034 report_data, "vkCreateGraphicsPipelines",
3035 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3036 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003037
Chris Forbes04b61da2016-11-03 09:53:59 +13003038 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003039 report_data, "vkCreateGraphicsPipelines",
3040 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3041 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003042
Chris Forbes04b61da2016-11-03 09:53:59 +13003043 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003044 report_data, "vkCreateGraphicsPipelines",
3045 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3046 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003047
Chris Forbes04b61da2016-11-03 09:53:59 +13003048 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003049 report_data, "vkCreateGraphicsPipelines",
3050 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3051 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003052
Chris Forbes04b61da2016-11-03 09:53:59 +13003053 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003054 report_data, "vkCreateGraphicsPipelines",
3055 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3056 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3057 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003058
Chris Forbes04b61da2016-11-03 09:53:59 +13003059 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003060 report_data, "vkCreateGraphicsPipelines",
3061 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3062 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003063
Chris Forbes04b61da2016-11-03 09:53:59 +13003064 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003065 report_data, "vkCreateGraphicsPipelines",
3066 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3067 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003068
Chris Forbes04b61da2016-11-03 09:53:59 +13003069 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003070 report_data, "vkCreateGraphicsPipelines",
3071 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3072 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3073 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003074
Chris Forbes04b61da2016-11-03 09:53:59 +13003075 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003076 report_data, "vkCreateGraphicsPipelines",
3077 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3078 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3079 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003080
Chris Forbes04b61da2016-11-03 09:53:59 +13003081 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003082 report_data, "vkCreateGraphicsPipelines",
3083 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3084 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3085 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003086
Chris Forbes04b61da2016-11-03 09:53:59 +13003087 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003088 report_data, "vkCreateGraphicsPipelines",
3089 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3090 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3091 pCreateInfos[i].pDepthStencilState->front.compareOp);
3092
Chris Forbes04b61da2016-11-03 09:53:59 +13003093 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003094 report_data, "vkCreateGraphicsPipelines",
3095 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003096 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3097
Chris Forbes04b61da2016-11-03 09:53:59 +13003098 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003099 report_data, "vkCreateGraphicsPipelines",
3100 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003101 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3102
Chris Forbes04b61da2016-11-03 09:53:59 +13003103 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003104 report_data, "vkCreateGraphicsPipelines",
3105 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3106 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3107 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003108
Chris Forbes04b61da2016-11-03 09:53:59 +13003109 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003110 report_data, "vkCreateGraphicsPipelines",
3111 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3112 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3113 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003114
3115 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003116 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 -06003117 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3118 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3119 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3120 i);
3121 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003122 }
3123
3124 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3125 if (pCreateInfos[i].pColorBlendState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003126 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003127 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3128 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3129 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003130
Chris Forbes04b61da2016-11-03 09:53:59 +13003131 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003132 report_data, "vkCreateGraphicsPipelines",
3133 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3134 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003135
Chris Forbes04b61da2016-11-03 09:53:59 +13003136 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003137 report_data, "vkCreateGraphicsPipelines",
3138 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3139 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003140
Chris Forbes04b61da2016-11-03 09:53:59 +13003141 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003142 report_data, "vkCreateGraphicsPipelines",
3143 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3144 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3145 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003146
3147 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3148 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3149 ++attachmentIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003150 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003151 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3152 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3153 ParameterName::IndexVector{i, attachmentIndex}),
3154 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003155
Chris Forbes04b61da2016-11-03 09:53:59 +13003156 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003157 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003158 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3159 ParameterName::IndexVector{i, attachmentIndex}),
3160 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003161 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3162
Chris Forbes04b61da2016-11-03 09:53:59 +13003163 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003164 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003165 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3166 ParameterName::IndexVector{i, attachmentIndex}),
3167 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003168 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3169
Chris Forbes04b61da2016-11-03 09:53:59 +13003170 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003171 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3172 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3173 ParameterName::IndexVector{i, attachmentIndex}),
3174 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3175 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003176
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].srcAlphaBlendFactor",
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].srcAlphaBlendFactor);
3183
Chris Forbes04b61da2016-11-03 09:53:59 +13003184 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003185 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003186 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3187 ParameterName::IndexVector{i, attachmentIndex}),
3188 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003189 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3190
Chris Forbes04b61da2016-11-03 09:53:59 +13003191 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003192 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3193 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3194 ParameterName::IndexVector{i, attachmentIndex}),
3195 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3196 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003197
Chris Forbes04b61da2016-11-03 09:53:59 +13003198 skip |=
Dustin Graves629259b2016-05-30 16:14:27 -06003199 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003200 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3201 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003202 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3203 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3204 }
3205 }
3206
Dustin Gravesc900f572016-05-16 11:07:59 -06003207 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003208 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 -06003209 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3210 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3211 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3212 i);
3213 }
3214
3215 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3216 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003217 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003218 report_data, "vkCreateGraphicsPipelines",
3219 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003220 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3221 }
3222 }
3223 }
3224 }
3225
Chris Forbes04b61da2016-11-03 09:53:59 +13003226 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003227 PreCreateGraphicsPipelines(device, pCreateInfos);
3228
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003229 result = get_dispatch_table(pc_device_table_map, device)
3230 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003231
Dustin Gravesc900f572016-05-16 11:07:59 -06003232 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003233 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003234
3235 return result;
3236}
3237
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003238bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003239 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3240
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003241 if (pCreateInfos != nullptr) {
3242 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003243 uint32_t i = 0;
3244 validate_string(data->report_data, "vkCreateComputePipelines",
3245 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003246 }
3247
3248 return true;
3249}
3250
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003251VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3252 const VkComputePipelineCreateInfo *pCreateInfos,
3253 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003254 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003255 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003256 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003257 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003258
Chris Forbes04b61da2016-11-03 09:53:59 +13003259 skip |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003260 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003261
Chris Forbes04b61da2016-11-03 09:53:59 +13003262 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003263 PreCreateComputePipelines(device, pCreateInfos);
3264
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003265 result = get_dispatch_table(pc_device_table_map, device)
3266 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003267
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003268 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003269 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003270
3271 return result;
3272}
3273
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003274VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003275 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003276 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003277 assert(my_data != NULL);
3278
Chris Forbes04b61da2016-11-03 09:53:59 +13003279 skip |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003280
Chris Forbes04b61da2016-11-03 09:53:59 +13003281 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003282 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003283 }
3284}
3285
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003286VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3287 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003288 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003289 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003290 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003291 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003292
Chris Forbes04b61da2016-11-03 09:53:59 +13003293 skip |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003294
Chris Forbes04b61da2016-11-03 09:53:59 +13003295 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003296 result =
3297 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003298
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003299 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003300 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003301
3302 return result;
3303}
3304
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003305VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3306 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003307 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003308 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003309 assert(my_data != NULL);
3310
Chris Forbes04b61da2016-11-03 09:53:59 +13003311 skip |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003312
Chris Forbes04b61da2016-11-03 09:53:59 +13003313 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003314 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003315 }
3316}
3317
Chia-I Wu01ca2372016-05-13 14:37:49 +08003318VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3319 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003320 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003321 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003322 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3323 assert(device_data != NULL);
3324 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003325
Chris Forbes04b61da2016-11-03 09:53:59 +13003326 skip |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003327
Dustin Gravesc900f572016-05-16 11:07:59 -06003328 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3329 if (pCreateInfo != nullptr) {
3330 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3331 if (pCreateInfo->compareEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003332 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003333 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3334 }
3335
3336 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3337 // valid VkBorderColor value
3338 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3339 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3340 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003341 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
Dustin Gravesc900f572016-05-16 11:07:59 -06003342 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3343 }
3344 }
3345
Chris Forbes04b61da2016-11-03 09:53:59 +13003346 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003347 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3348
Dustin Gravesc900f572016-05-16 11:07:59 -06003349 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003350 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003351
3352 return result;
3353}
3354
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003355VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003356 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003357 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003358 assert(my_data != NULL);
3359
Chris Forbes04b61da2016-11-03 09:53:59 +13003360 skip |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003361
Chris Forbes04b61da2016-11-03 09:53:59 +13003362 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003363 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003364 }
3365}
3366
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003367VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3368 const VkAllocationCallbacks *pAllocator,
3369 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003370 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003371 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003372 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3373 assert(device_data != nullptr);
3374 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003375
Chris Forbes04b61da2016-11-03 09:53:59 +13003376 skip |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003377
Dustin Gravesc900f572016-05-16 11:07:59 -06003378 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3379 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3380 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3381 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3382 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3383 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3384 // valid VkSampler handles
3385 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3386 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3387 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3388 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3389 ++descriptor_index) {
3390 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003391 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003392 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3393 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3394 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3395 " specified as VK_NULL_HANDLE",
3396 i, descriptor_index);
3397 }
3398 }
3399 }
3400
3401 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3402 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3403 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003404 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003405 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3406 UNRECOGNIZED_VALUE, LayerName,
3407 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3408 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3409 i, i);
3410 }
3411 }
3412 }
3413 }
3414
Chris Forbes04b61da2016-11-03 09:53:59 +13003415 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003416 result =
3417 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003418
Dustin Gravesc900f572016-05-16 11:07:59 -06003419 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003420 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003421
3422 return result;
3423}
3424
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003425VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3426 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003427 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003428 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003429 assert(my_data != NULL);
3430
Chris Forbes04b61da2016-11-03 09:53:59 +13003431 skip |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003432
Chris Forbes04b61da2016-11-03 09:53:59 +13003433 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003434 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003435 }
3436}
3437
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003438VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3439 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003440 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003441 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003442 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003443 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003444
Chris Forbes04b61da2016-11-03 09:53:59 +13003445 skip |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003446
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003447 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3448
Chris Forbes04b61da2016-11-03 09:53:59 +13003449 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003450 result =
3451 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003452
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003453 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003454 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003455
3456 return result;
3457}
3458
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003459VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3460 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003461 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003462 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003463 assert(my_data != NULL);
3464
Chris Forbes04b61da2016-11-03 09:53:59 +13003465 skip |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003466
Chris Forbes04b61da2016-11-03 09:53:59 +13003467 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003468 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003469 }
3470}
3471
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003472VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3473 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003474 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003475 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003476 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3477 assert(my_data != NULL);
3478
Chris Forbes04b61da2016-11-03 09:53:59 +13003479 skip |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003480
Chris Forbes04b61da2016-11-03 09:53:59 +13003481 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003482 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3483
3484 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3485 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003486
3487 return result;
3488}
3489
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003490VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3491 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003492 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003493 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003494 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003495 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003496
Chris Forbes04b61da2016-11-03 09:53:59 +13003497 skip |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003498
Chris Forbes04b61da2016-11-03 09:53:59 +13003499 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003500 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3501
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003502 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003503 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003504
3505 return result;
3506}
3507
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003508VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003509 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003510 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003511 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003512 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3513 assert(device_data != nullptr);
3514 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003515
Chris Forbes04b61da2016-11-03 09:53:59 +13003516 skip |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003517
Dustin Gravesc900f572016-05-16 11:07:59 -06003518 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3519 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3520 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003521 skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003522 pDescriptorSets, true, true);
3523
Chris Forbes04b61da2016-11-03 09:53:59 +13003524 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003525 result = get_dispatch_table(pc_device_table_map, device)
3526 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003527
Dustin Gravesc900f572016-05-16 11:07:59 -06003528 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003529 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003530
3531 return result;
3532}
3533
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003534VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3535 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3536 const VkCopyDescriptorSet *pDescriptorCopies) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003537 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003538 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3539 assert(device_data != NULL);
3540 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003541
Chris Forbes04b61da2016-11-03 09:53:59 +13003542 skip |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
Dustin Gravesc900f572016-05-16 11:07:59 -06003543 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003544
Dustin Gravesc900f572016-05-16 11:07:59 -06003545 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3546 if (pDescriptorWrites != NULL) {
3547 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3548 // descriptorCount must be greater than 0
3549 if (pDescriptorWrites[i].descriptorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003550 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003551 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3552 REQUIRED_PARAMETER, LayerName,
3553 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3554 }
3555
3556 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3557 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3558 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3559 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3560 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3561 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3562 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3563 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3564 if (pDescriptorWrites[i].pImageInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003565 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 -06003566 __LINE__, REQUIRED_PARAMETER, LayerName,
3567 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3568 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3569 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3570 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3571 i, i);
3572 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3573 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3574 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3575 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3576 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3577 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003578 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003579 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3580 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003581 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
Chris Forbes04b61da2016-11-03 09:53:59 +13003582 skip |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003583 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3584 ParameterName::IndexVector{i, descriptor_index}),
3585 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003586 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3587 }
3588 }
3589 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3590 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3591 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3592 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3593 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3594 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3595 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3596 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003597 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 -06003598 __LINE__, REQUIRED_PARAMETER, LayerName,
3599 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3600 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3601 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3602 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3603 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003604 } else {
3605 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003606 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003607 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3608 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003609 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3610 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003611 }
3612 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3613 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3614 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3615 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3616 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003617 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 -06003618 __LINE__, REQUIRED_PARAMETER, LayerName,
3619 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3620 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3621 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3622 i, i);
3623 } else {
3624 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3625 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003626 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003627 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3628 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003629 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3630 }
3631 }
3632 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003633
3634 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3635 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3636 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3637 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3638 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3639 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003640 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003641 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003642 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003643 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3644 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3645 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3646 }
3647 }
3648 }
3649 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3650 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3651 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3652 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3653 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3654 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003655 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003656 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003657 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003658 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3659 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3660 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3661 }
3662 }
3663 }
3664 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003665 }
3666 }
3667
Chris Forbes04b61da2016-11-03 09:53:59 +13003668 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003669 get_dispatch_table(pc_device_table_map, device)
3670 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003671 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003672}
3673
Chia-I Wu01ca2372016-05-13 14:37:49 +08003674VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003675 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003676 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003677 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003678 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003679 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003680
Chris Forbes04b61da2016-11-03 09:53:59 +13003681 skip |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003682
Chris Forbes04b61da2016-11-03 09:53:59 +13003683 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003684 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3685
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003686 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003687 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003688
3689 return result;
3690}
3691
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003692VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003693 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003694 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003695 assert(my_data != NULL);
3696
Chris Forbes04b61da2016-11-03 09:53:59 +13003697 skip |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003698
Chris Forbes04b61da2016-11-03 09:53:59 +13003699 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003700 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003701 }
3702}
3703
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003704bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003705 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003706 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3707
3708 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3709 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003710 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 -06003711 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003712 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3713 }
3714 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003715 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003716}
3717
Chia-I Wu01ca2372016-05-13 14:37:49 +08003718VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003719 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003720 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003721 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003722 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003723 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003724
Chris Forbes04b61da2016-11-03 09:53:59 +13003725 skip |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3726 skip |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003727
Chris Forbes04b61da2016-11-03 09:53:59 +13003728 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003729 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3730
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003731 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003732 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003733
3734 return result;
3735}
3736
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003737VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003738 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003739 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003740 assert(my_data != NULL);
3741
Chris Forbes04b61da2016-11-03 09:53:59 +13003742 skip |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003743
Chris Forbes04b61da2016-11-03 09:53:59 +13003744 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003745 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003746 }
3747}
3748
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003749VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003750 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003751 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003752 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003753
Chris Forbes04b61da2016-11-03 09:53:59 +13003754 skip |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003755
Chris Forbes04b61da2016-11-03 09:53:59 +13003756 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003757 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003758 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003759}
3760
Chia-I Wu01ca2372016-05-13 14:37:49 +08003761VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003762 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003763 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003764 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003765 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003766 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003767
Chris Forbes04b61da2016-11-03 09:53:59 +13003768 skip |=
Dustin Gravesde628532016-04-21 16:30:17 -06003769 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003770
Chris Forbes04b61da2016-11-03 09:53:59 +13003771 skip |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003772
Chris Forbes04b61da2016-11-03 09:53:59 +13003773 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003774 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3775
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003776 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003777 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003778
3779 return result;
3780}
3781
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003782VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003783 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003784 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003785 assert(my_data != NULL);
3786
Chris Forbes04b61da2016-11-03 09:53:59 +13003787 skip |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003788
Chris Forbes04b61da2016-11-03 09:53:59 +13003789 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003790 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003791 }
3792}
3793
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003794VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003795 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003796 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003797 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3798 assert(my_data != NULL);
3799
Chris Forbes04b61da2016-11-03 09:53:59 +13003800 skip |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003801
Chris Forbes04b61da2016-11-03 09:53:59 +13003802 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003803 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3804
3805 validate_result(my_data->report_data, "vkResetCommandPool", result);
3806 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003807
3808 return result;
3809}
3810
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003811VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3812 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003813 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003814 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003815 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003816 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003817
Chris Forbes04b61da2016-11-03 09:53:59 +13003818 skip |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003819
Chris Forbes04b61da2016-11-03 09:53:59 +13003820 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003821 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3822
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003823 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003824 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003825
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003826 return result;
3827}
3828
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003829VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003830 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003831 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003832 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3833 assert(device_data != nullptr);
3834 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003835
Chris Forbes04b61da2016-11-03 09:53:59 +13003836 skip |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003837
Dustin Gravesc900f572016-05-16 11:07:59 -06003838 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3839 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3840 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003841 skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003842 pCommandBuffers, true, true);
3843
Chris Forbes04b61da2016-11-03 09:53:59 +13003844 if (!skip) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003845 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003846 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003847 }
3848}
3849
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003850bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003851 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003852 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3853 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3854
3855 if (pInfo != NULL) {
3856 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003857 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003858 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 -06003859 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003860 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3861 "inheritedQueries.");
3862 }
3863
3864 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3865 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003866 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003867 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 -06003868 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003869 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3870 "valid combination of VkQueryControlFlagBits.",
3871 pInfo->queryFlags);
3872 }
3873 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003874 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003875}
3876
3877VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003878 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003879 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003880 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3881 assert(device_data != nullptr);
3882 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003883
Chris Forbes04b61da2016-11-03 09:53:59 +13003884 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003885
Dustin Gravesc900f572016-05-16 11:07:59 -06003886 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3887 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13003888 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Dustin Gravesc900f572016-05-16 11:07:59 -06003889 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3890 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3891
3892 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003893 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003894 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003895
Chris Forbes04b61da2016-11-03 09:53:59 +13003896 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Dustin Graves629259b2016-05-30 16:14:27 -06003897 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3898
Dustin Gravesc900f572016-05-16 11:07:59 -06003899 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003900 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06003901 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3902
3903 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003904 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Dustin Gravesc900f572016-05-16 11:07:59 -06003905 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3906 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3907 }
3908
Chris Forbes04b61da2016-11-03 09:53:59 +13003909 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003910
Chris Forbes04b61da2016-11-03 09:53:59 +13003911 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003912 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3913
Dustin Gravesc900f572016-05-16 11:07:59 -06003914 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003915 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003916
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003917 return result;
3918}
3919
Chia-I Wu01ca2372016-05-13 14:37:49 +08003920VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003921 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3922 assert(my_data != NULL);
3923
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003924 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003925
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003926 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003927
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003928 return result;
3929}
3930
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003931VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003932 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003933 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3934 assert(my_data != NULL);
3935
Chris Forbes04b61da2016-11-03 09:53:59 +13003936 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003937
Chris Forbes04b61da2016-11-03 09:53:59 +13003938 if (!skip) {
Dustin Graves16d18972016-05-09 17:36:57 -06003939 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3940
3941 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3942 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003943
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003944 return result;
3945}
3946
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003947VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3948 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003949 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003950 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3951 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003952
Chris Forbes04b61da2016-11-03 09:53:59 +13003953 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003954
Chris Forbes04b61da2016-11-03 09:53:59 +13003955 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003956 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3957 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003958}
3959
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003960bool preCmdSetViewport(layer_data *my_data, uint32_t viewport_count, const VkViewport *viewports) {
3961 debug_report_data *report_data = my_data->report_data;
3962
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003963 bool skip =
3964 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003965
3966 if (viewport_count > 0 && viewports != nullptr) {
3967 const VkPhysicalDeviceLimits &limits = my_data->device_limits;
3968 for (uint32_t viewportIndex = 0; viewportIndex < viewport_count; ++viewportIndex) {
3969 const VkViewport &viewport = viewports[viewportIndex];
3970
3971 if (viewport.width <= 0 || viewport.width > limits.maxViewportDimensions[0]) {
3972 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3973 VALIDATION_ERROR_01448, LayerName,
3974 "vkCmdSetViewport %d: width (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3975 viewport.width, limits.maxViewportDimensions[0], validation_error_map[VALIDATION_ERROR_01448]);
3976 }
3977
3978 bool invalid_height = (viewport.height <= 0 || viewport.height > limits.maxViewportDimensions[1]);
3979 if (my_data->amd_negative_viewport_height_enabled && (viewport.height < 0)) {
3980 // VALIDATION_ERROR_01790
3981 invalid_height = false;
3982 }
3983 if (invalid_height) {
3984 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3985 VALIDATION_ERROR_01449, LayerName,
3986 "vkCmdSetViewport %d: height (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3987 viewport.height, limits.maxViewportDimensions[1], validation_error_map[VALIDATION_ERROR_01449]);
3988 }
3989
3990 if (viewport.x < limits.viewportBoundsRange[0] || viewport.x > limits.viewportBoundsRange[1]) {
3991 skip |=
3992 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3993 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: x (%f) exceeds permitted bounds (%f,%f). %s",
3994 viewportIndex, viewport.x, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3995 validation_error_map[VALIDATION_ERROR_01450]);
3996 }
3997
3998 if (viewport.y < limits.viewportBoundsRange[0] || viewport.y > limits.viewportBoundsRange[1]) {
3999 skip |=
4000 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4001 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: y (%f) exceeds permitted bounds (%f,%f). %s",
4002 viewportIndex, viewport.y, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
4003 validation_error_map[VALIDATION_ERROR_01450]);
4004 }
4005
4006 if (viewport.x + viewport.width > limits.viewportBoundsRange[1]) {
4007 skip |=
4008 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4009 VALIDATION_ERROR_01451, LayerName,
4010 "vkCmdSetViewport %d: x (%f) + width (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.x,
4011 viewport.width, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01451]);
4012 }
4013
4014 if (viewport.y + viewport.height > limits.viewportBoundsRange[1]) {
4015 skip |=
4016 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4017 VALIDATION_ERROR_01452, LayerName,
4018 "vkCmdSetViewport %d: y (%f) + height (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.y,
4019 viewport.height, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01452]);
4020 }
4021 }
4022 }
4023
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004024 return skip;
4025}
4026
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004027VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4028 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004029 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004030 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004031 assert(my_data != NULL);
4032
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004033 skip |= preCmdSetViewport(my_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004034
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004035 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004036 get_dispatch_table(pc_device_table_map, commandBuffer)
4037 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004038 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004039}
4040
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004041VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
4042 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004043 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004044 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004045 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004046 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07004047
Chris Forbes04b61da2016-11-03 09:53:59 +13004048 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004049
Mike Weiblena4742dc2016-10-31 11:05:56 -06004050 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4051 const VkRect2D &pScissor = pScissors[scissorIndex];
4052
4053 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004054 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 -06004055 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4056 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
4057 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004058 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 -06004059 VALIDATION_ERROR_01490, LayerName,
4060 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4061 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
4062 }
4063
4064 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004065 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 -06004066 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4067 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4068 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004069 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 -06004070 VALIDATION_ERROR_01491, LayerName,
4071 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4072 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4073 }
4074 }
4075
Chris Forbes04b61da2016-11-03 09:53:59 +13004076 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004077 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4078 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004079}
4080
Chia-I Wu01ca2372016-05-13 14:37:49 +08004081VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004082 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004083}
4084
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004085VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4086 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004087 get_dispatch_table(pc_device_table_map, commandBuffer)
4088 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004089}
4090
Chia-I Wu01ca2372016-05-13 14:37:49 +08004091VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004092 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004093 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004094 assert(my_data != NULL);
4095
Chris Forbes04b61da2016-11-03 09:53:59 +13004096 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004097
Chris Forbes04b61da2016-11-03 09:53:59 +13004098 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004099 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4100 }
Cody Northrop12365112015-08-17 11:10:49 -06004101}
4102
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004103VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004104 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004105}
4106
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004107VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4108 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004109 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004110 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4111 assert(my_data != NULL);
4112
Chris Forbes04b61da2016-11-03 09:53:59 +13004113 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004114
Chris Forbes04b61da2016-11-03 09:53:59 +13004115 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004116 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4117 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004118}
4119
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004120VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004121 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004122 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4123 assert(my_data != NULL);
4124
Chris Forbes04b61da2016-11-03 09:53:59 +13004125 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004126
Chris Forbes04b61da2016-11-03 09:53:59 +13004127 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004128 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4129 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004130}
4131
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004132VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004133 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004134 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4135 assert(my_data != NULL);
4136
Chris Forbes04b61da2016-11-03 09:53:59 +13004137 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004138
Chris Forbes04b61da2016-11-03 09:53:59 +13004139 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004140 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4141 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004142}
4143
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004144VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4145 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4146 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4147 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004148 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004149 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004150 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004151
Chris Forbes04b61da2016-11-03 09:53:59 +13004152 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004153 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4154 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004155
Chris Forbes04b61da2016-11-03 09:53:59 +13004156 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004157 get_dispatch_table(pc_device_table_map, commandBuffer)
4158 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4159 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004160 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004161}
4162
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004163VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4164 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004165 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004166 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4167 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004168
Chris Forbes04b61da2016-11-03 09:53:59 +13004169 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004170
Chris Forbes04b61da2016-11-03 09:53:59 +13004171 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004172 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4173 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004174}
4175
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004176VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4177 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004178 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004179 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004180 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004181
Chris Forbes04b61da2016-11-03 09:53:59 +13004182 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004183
Chris Forbes04b61da2016-11-03 09:53:59 +13004184 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004185 get_dispatch_table(pc_device_table_map, commandBuffer)
4186 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004187 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004188}
4189
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004190bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4191 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004192 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004193 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004194 // 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 -07004195 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004196 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 -06004197 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004198 return false;
4199 }
4200
4201 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004202 // 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 -07004203 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004204 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 -06004205 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004206 return false;
4207 }
4208
4209 return true;
4210}
4211
Chia-I Wu01ca2372016-05-13 14:37:49 +08004212VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4213 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004214 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004215
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004216 get_dispatch_table(pc_device_table_map, commandBuffer)
4217 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004218}
4219
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004220VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4221 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004222 get_dispatch_table(pc_device_table_map, commandBuffer)
4223 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004224}
4225
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004226VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4227 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004228 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004229 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4230 assert(my_data != NULL);
4231
Chris Forbes04b61da2016-11-03 09:53:59 +13004232 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004233
Chris Forbes04b61da2016-11-03 09:53:59 +13004234 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004235 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4236 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004237}
4238
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004239VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4240 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004241 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004242 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4243 assert(my_data != NULL);
4244
Chris Forbes04b61da2016-11-03 09:53:59 +13004245 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004246
Chris Forbes04b61da2016-11-03 09:53:59 +13004247 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004248 get_dispatch_table(pc_device_table_map, commandBuffer)
4249 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4250 }
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) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004254 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004255}
4256
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004257VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004258 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004259 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4260 assert(my_data != NULL);
4261
Chris Forbes04b61da2016-11-03 09:53:59 +13004262 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004263
Chris Forbes04b61da2016-11-03 09:53:59 +13004264 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004265 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4266 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004267}
4268
Chia-I Wu01ca2372016-05-13 14:37:49 +08004269VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4270 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004271 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004272 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004273 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004274
Chris Forbes04b61da2016-11-03 09:53:59 +13004275 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004276
Chris Forbes04b61da2016-11-03 09:53:59 +13004277 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004278 get_dispatch_table(pc_device_table_map, commandBuffer)
4279 ->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,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004290 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4291 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,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004297 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4298 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
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004318 get_dispatch_table(pc_device_table_map, commandBuffer)
4319 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004320 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004321}
4322
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004323bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004324 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004325 if (pRegions != nullptr) {
4326 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4327 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004328 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 -06004329 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004330 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4331 return false;
4332 }
4333 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4334 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004335 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 -06004336 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004337 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4338 return false;
4339 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004340 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004341
4342 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004343}
4344
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004345VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4346 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4347 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004348 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004349 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004350 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004351
Chris Forbes04b61da2016-11-03 09:53:59 +13004352 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004353 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004354
Chris Forbes04b61da2016-11-03 09:53:59 +13004355 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004356 PreCmdBlitImage(commandBuffer, pRegions);
4357
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004358 get_dispatch_table(pc_device_table_map, commandBuffer)
4359 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004360 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004361}
4362
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004363bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004364 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004365 if (pRegions != nullptr) {
4366 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4367 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004368 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 -06004369 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004370 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4371 "enumerator");
4372 return false;
4373 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004374 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004375
4376 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004377}
4378
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004379VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4380 VkImageLayout dstImageLayout, uint32_t regionCount,
4381 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004382 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004383 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004384 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004385
Chris Forbes04b61da2016-11-03 09:53:59 +13004386 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004387 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004388
Chris Forbes04b61da2016-11-03 09:53:59 +13004389 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004390 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4391
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004392 get_dispatch_table(pc_device_table_map, commandBuffer)
4393 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004394 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004395}
4396
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004397bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004398 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004399 if (pRegions != nullptr) {
4400 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4401 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004402 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 -06004403 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004404 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4405 "enumerator");
4406 return false;
4407 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004408 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004409
4410 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004411}
4412
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004413VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4414 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004415 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004416 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004417 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004418
Chris Forbes04b61da2016-11-03 09:53:59 +13004419 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004420 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004421
Chris Forbes04b61da2016-11-03 09:53:59 +13004422 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004423 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4424
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004425 get_dispatch_table(pc_device_table_map, commandBuffer)
4426 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004427 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004428}
4429
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004430VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4431 VkDeviceSize dataSize, const uint32_t *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004432 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004433 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004434 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004435
Chris Forbes04b61da2016-11-03 09:53:59 +13004436 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004437
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004438 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004439 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004440 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4441 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004442 }
4443
4444 if ((dataSize <= 0) || (dataSize > 65536)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004445 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004446 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4447 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004448 dataSize);
4449 } else if (dataSize & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004450 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004451 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4452 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004453 }
4454
Chris Forbes04b61da2016-11-03 09:53:59 +13004455 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004456 get_dispatch_table(pc_device_table_map, commandBuffer)
4457 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004458 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004459}
4460
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004461VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4462 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004463 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004464 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4465 assert(my_data != NULL);
4466
Chris Forbes04b61da2016-11-03 09:53:59 +13004467 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004468
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004469 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004470 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004471 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4472 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004473 }
4474
4475 if (size != VK_WHOLE_SIZE) {
4476 if (size <= 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004477 skip |= log_msg(
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004478 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004479 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004480 } else if (size & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004481 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004482 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004483 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4484 }
4485 }
4486
Chris Forbes04b61da2016-11-03 09:53:59 +13004487 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004488 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4489 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004490}
4491
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004492VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4493 const VkClearColorValue *pColor, uint32_t rangeCount,
4494 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004495 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004496 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004497 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004498
Chris Forbes04b61da2016-11-03 09:53:59 +13004499 skip |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004500
Chris Forbes04b61da2016-11-03 09:53:59 +13004501 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004502 get_dispatch_table(pc_device_table_map, commandBuffer)
4503 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004504 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004505}
4506
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004507VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4508 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4509 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004510 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004511 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004512 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004513
Chris Forbes04b61da2016-11-03 09:53:59 +13004514 skip |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004515 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004516
Chris Forbes04b61da2016-11-03 09:53:59 +13004517 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004518 get_dispatch_table(pc_device_table_map, commandBuffer)
4519 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004520 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004521}
4522
Chia-I Wu01ca2372016-05-13 14:37:49 +08004523VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4524 const VkClearAttachment *pAttachments, uint32_t rectCount,
4525 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004526 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004527 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004528 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004529
Chris Forbes04b61da2016-11-03 09:53:59 +13004530 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004531
Chris Forbes04b61da2016-11-03 09:53:59 +13004532 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004533 get_dispatch_table(pc_device_table_map, commandBuffer)
4534 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004535 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004536}
4537
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004538bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004539 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004540 if (pRegions != nullptr) {
4541 if ((pRegions->srcSubresource.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->srcSubresource.aspectMask, is an unrecognized enumerator");
4547 return false;
4548 }
4549 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4550 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4551 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004552 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 -06004553 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004554 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4555 return false;
4556 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004557 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004558
4559 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004560}
4561
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004562VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4563 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4564 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004565 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004566 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004567 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004568
Chris Forbes04b61da2016-11-03 09:53:59 +13004569 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004570 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004571
Chris Forbes04b61da2016-11-03 09:53:59 +13004572 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004573 PreCmdResolveImage(commandBuffer, pRegions);
4574
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004575 get_dispatch_table(pc_device_table_map, commandBuffer)
4576 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004577 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004578}
4579
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004580VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004581 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004582 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4583 assert(my_data != NULL);
4584
Chris Forbes04b61da2016-11-03 09:53:59 +13004585 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004586
Chris Forbes04b61da2016-11-03 09:53:59 +13004587 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004588 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4589 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004590}
4591
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004592VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004593 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004594 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4595 assert(my_data != NULL);
4596
Chris Forbes04b61da2016-11-03 09:53:59 +13004597 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004598
Chris Forbes04b61da2016-11-03 09:53:59 +13004599 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004600 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4601 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004602}
4603
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004604VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4605 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4606 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4607 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4608 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004609 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004610 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004611 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004612
Chris Forbes04b61da2016-11-03 09:53:59 +13004613 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004614 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4615 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004616
Chris Forbes04b61da2016-11-03 09:53:59 +13004617 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004618 get_dispatch_table(pc_device_table_map, commandBuffer)
4619 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4620 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004621 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004622}
4623
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004624VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4625 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4626 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4627 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4628 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004629 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004630 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004631 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004632
Chris Forbes04b61da2016-11-03 09:53:59 +13004633 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004634 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4635 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004636
Chris Forbes04b61da2016-11-03 09:53:59 +13004637 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004638 get_dispatch_table(pc_device_table_map, commandBuffer)
4639 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4640 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004641 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004642}
4643
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004644VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4645 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004646 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004647 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4648 assert(my_data != NULL);
4649
Chris Forbes04b61da2016-11-03 09:53:59 +13004650 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004651
Chris Forbes04b61da2016-11-03 09:53:59 +13004652 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004653 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4654 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004655}
4656
Chia-I Wu01ca2372016-05-13 14:37:49 +08004657VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004658 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004659 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4660 assert(my_data != NULL);
4661
Chris Forbes04b61da2016-11-03 09:53:59 +13004662 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004663
Chris Forbes04b61da2016-11-03 09:53:59 +13004664 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004665 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4666 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004667}
4668
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004669VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4670 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004671 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004672 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4673 assert(my_data != NULL);
4674
Chris Forbes04b61da2016-11-03 09:53:59 +13004675 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004676
Chris Forbes04b61da2016-11-03 09:53:59 +13004677 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004678 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4679 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004680}
4681
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004682bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4683 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004684
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004685 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004686
4687 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004688}
4689
Chia-I Wu01ca2372016-05-13 14:37:49 +08004690VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4691 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004692 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004693 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4694 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004695
Chris Forbes04b61da2016-11-03 09:53:59 +13004696 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004697
Chris Forbes04b61da2016-11-03 09:53:59 +13004698 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004699 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4700
4701 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4702 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004703}
4704
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004705VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4706 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4707 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004708 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004709 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4710 assert(my_data != NULL);
4711
Chris Forbes04b61da2016-11-03 09:53:59 +13004712 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004713 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004714
Chris Forbes04b61da2016-11-03 09:53:59 +13004715 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004716 get_dispatch_table(pc_device_table_map, commandBuffer)
4717 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4718 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004719}
4720
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004721VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4722 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004723 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004724 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004725 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004726
Chris Forbes04b61da2016-11-03 09:53:59 +13004727 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004728
Chris Forbes04b61da2016-11-03 09:53:59 +13004729 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004730 get_dispatch_table(pc_device_table_map, commandBuffer)
4731 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004732 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004733}
4734
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004735VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4736 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004737 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004738 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004739 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004740
Chris Forbes04b61da2016-11-03 09:53:59 +13004741 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004742
Chris Forbes04b61da2016-11-03 09:53:59 +13004743 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004744 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004745 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004746}
4747
Chia-I Wu01ca2372016-05-13 14:37:49 +08004748VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004749 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004750 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4751 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004752
Chris Forbes04b61da2016-11-03 09:53:59 +13004753 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004754
Chris Forbes04b61da2016-11-03 09:53:59 +13004755 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004756 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4757 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004758}
4759
Chia-I Wu01ca2372016-05-13 14:37:49 +08004760VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004761 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004762}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004763
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004764VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4765 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004766 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004767 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004768 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004769
Chris Forbes04b61da2016-11-03 09:53:59 +13004770 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004771
Chris Forbes04b61da2016-11-03 09:53:59 +13004772 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004773 get_dispatch_table(pc_device_table_map, commandBuffer)
4774 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004775 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004776}
4777
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004778VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004779 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4780}
4781
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004782VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4783 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004784 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4785}
4786
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004787VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4788 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004789 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4790 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4791
4792 return VK_ERROR_LAYER_NOT_PRESENT;
4793}
4794
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004795VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4796 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004797 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004798 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004799 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004800
4801 assert(physicalDevice);
4802
4803 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4804 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004805}
4806
Chris Forbes448ebcb2016-11-03 09:29:52 +13004807bool require_device_extension(layer_data *my_data, bool layer_data::*flag, char const *function_name, char const *extension_name)
4808{
4809 if (!(my_data->*flag)) {
4810 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4811 __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4812 "%s() called even though the %s extension was not enabled for this VkDevice.",
4813 function_name, extension_name);
4814 }
4815
4816 return false;
4817}
4818
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004819// WSI Extension Functions
4820
4821VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004822 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004823 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004824 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004825 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4826 assert(my_data != NULL);
4827
Chris Forbes04b61da2016-11-03 09:53:59 +13004828 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkCreateSwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004829
Chris Forbes04b61da2016-11-03 09:53:59 +13004830 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004831
Chris Forbes04b61da2016-11-03 09:53:59 +13004832 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004833 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4834
4835 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4836 }
4837
4838 return result;
4839}
4840
4841VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004842 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004843 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004844 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004845 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4846 assert(my_data != NULL);
4847
Chris Forbes04b61da2016-11-03 09:53:59 +13004848 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkGetSwapchainImagesKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004849
Chris Forbes04b61da2016-11-03 09:53:59 +13004850 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004851 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4852
Chris Forbes04b61da2016-11-03 09:53:59 +13004853 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004854 result = get_dispatch_table(pc_device_table_map, device)
4855 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4856
4857 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4858 }
4859
4860 return result;
4861}
4862
4863VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004864 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004865 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004866 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004867 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4868 assert(my_data != NULL);
4869
Chris Forbes04b61da2016-11-03 09:53:59 +13004870 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkAcquireNextImageKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004871
Chris Forbes04b61da2016-11-03 09:53:59 +13004872 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004873 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4874
Chris Forbes04b61da2016-11-03 09:53:59 +13004875 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004876 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004877 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004878
4879 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4880 }
4881
4882 return result;
4883}
4884
4885VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4886 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004887 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004888 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4889 assert(my_data != NULL);
4890
Chris Forbes04b61da2016-11-03 09:53:59 +13004891 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkQueuePresentKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004892
Chris Forbes04b61da2016-11-03 09:53:59 +13004893 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004894
Chris Forbes04b61da2016-11-03 09:53:59 +13004895 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004896 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4897
4898 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4899 }
4900
4901 return result;
4902}
4903
Chris Forbesbe5f5202016-11-02 18:34:25 +13004904VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004905 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13004906 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4907 assert(my_data != NULL);
4908
Chris Forbes04b61da2016-11-03 09:53:59 +13004909 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkDestroySwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004910
4911 /* No generated validation function for this call */
4912
Chris Forbes04b61da2016-11-03 09:53:59 +13004913 if (!skip) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13004914 get_dispatch_table(pc_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
4915 }
4916}
4917
Chris Forbes115f98c2016-11-03 09:51:48 +13004918bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name, char const *extension_name)
4919{
4920 if (!(instance_extension_map[get_dispatch_table(pc_instance_table_map, instance)].*flag)) {
4921 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4922 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
4923 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4924 "%s() called even though the %s extension was not enabled for this VkInstance.",
4925 function_name, extension_name);
4926 }
4927
4928 return false;
4929}
4930
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004931VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4932 VkSurfaceKHR surface, VkBool32 *pSupported) {
4933 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004934 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004935 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4936 assert(my_data != NULL);
4937
Chris Forbes04b61da2016-11-03 09:53:59 +13004938 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004939 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004940
Chris Forbes04b61da2016-11-03 09:53:59 +13004941 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004942 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4943
Chris Forbes04b61da2016-11-03 09:53:59 +13004944 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004945 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4946 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4947
4948 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4949 }
4950
4951 return result;
4952}
4953
4954VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4955 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4956 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004957 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004958 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4959 assert(my_data != NULL);
4960
Chris Forbes04b61da2016-11-03 09:53:59 +13004961 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004962 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004963
Chris Forbes04b61da2016-11-03 09:53:59 +13004964 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004965 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004966
Chris Forbes04b61da2016-11-03 09:53:59 +13004967 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004968 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4969 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4970
4971 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4972 }
4973
4974 return result;
4975}
4976
4977VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4978 uint32_t *pSurfaceFormatCount,
4979 VkSurfaceFormatKHR *pSurfaceFormats) {
4980 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004981 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004982 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4983 assert(my_data != NULL);
4984
Chris Forbes04b61da2016-11-03 09:53:59 +13004985 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004986 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004987
Chris Forbes04b61da2016-11-03 09:53:59 +13004988 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004989 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004990
Chris Forbes04b61da2016-11-03 09:53:59 +13004991 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004992 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4993 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4994
4995 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4996 }
4997
4998 return result;
4999}
5000
5001VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
5002 uint32_t *pPresentModeCount,
5003 VkPresentModeKHR *pPresentModes) {
5004 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005005 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005006 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5007 assert(my_data != NULL);
5008
Chris Forbes04b61da2016-11-03 09:53:59 +13005009 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005010 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13005011
Chris Forbes04b61da2016-11-03 09:53:59 +13005012 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005013 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005014
Chris Forbes04b61da2016-11-03 09:53:59 +13005015 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005016 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5017 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
5018
5019 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
5020 }
5021
5022 return result;
5023}
5024
Chris Forbesbe5f5202016-11-02 18:34:25 +13005025VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005026 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13005027
Chris Forbes04b61da2016-11-03 09:53:59 +13005028 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005029 "vkDestroySurfaceKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005030
Chris Forbes04b61da2016-11-03 09:53:59 +13005031 if (!skip) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005032 get_dispatch_table(pc_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
5033 }
5034}
5035
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005036#ifdef VK_USE_PLATFORM_WIN32_KHR
5037VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
5038 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5039 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5040
5041 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5042 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005043 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005044
Chris Forbes04b61da2016-11-03 09:53:59 +13005045 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005046 "vkCreateWin32SurfaceKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005047
Chris Forbes04b61da2016-11-03 09:53:59 +13005048 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005049
Chris Forbes04b61da2016-11-03 09:53:59 +13005050 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005051 result =
5052 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5053 }
5054
5055 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5056
5057 return result;
5058}
Chris Forbes9a083b92016-11-02 16:58:15 +13005059
5060VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
5061 uint32_t queueFamilyIndex)
5062{
5063 VkBool32 result = false;
5064
5065 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5066 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005067 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005068
Chris Forbes04b61da2016-11-03 09:53:59 +13005069 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005070 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005071
Chris Forbes7281a502016-11-08 08:45:03 +13005072 // TODO: codegen doesn't produce this function?
5073 //skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005074
Chris Forbes04b61da2016-11-03 09:53:59 +13005075 if (!skip) {
Chris Forbes9a083b92016-11-02 16:58:15 +13005076 result = get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceWin32PresentationSupportKHR(
5077 physicalDevice, queueFamilyIndex);
5078 }
5079
5080 return result;
5081}
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005082#endif // VK_USE_PLATFORM_WIN32_KHR
5083
5084#ifdef VK_USE_PLATFORM_XCB_KHR
5085VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5086 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5087 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5088
5089 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5090 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005091 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005092
Chris Forbes04b61da2016-11-03 09:53:59 +13005093 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005094 "vkCreateXcbSurfaceKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005095
Chris Forbes04b61da2016-11-03 09:53:59 +13005096 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005097
Chris Forbes04b61da2016-11-03 09:53:59 +13005098 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005099 result =
5100 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5101 }
5102
5103 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5104
5105 return result;
5106}
5107
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005108VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5109 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5110 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005111 VkBool32 result = false;
5112
5113 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5114 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005115 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005116
Chris Forbes04b61da2016-11-03 09:53:59 +13005117 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005118 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005119
Chris Forbes04b61da2016-11-03 09:53:59 +13005120 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005121 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005122
Chris Forbes04b61da2016-11-03 09:53:59 +13005123 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005124 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5125 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005126 }
5127
5128 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005129}
5130#endif // VK_USE_PLATFORM_XCB_KHR
5131
5132#ifdef VK_USE_PLATFORM_XLIB_KHR
5133VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005134 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005135 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5136
5137 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5138 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005139 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005140
Chris Forbes04b61da2016-11-03 09:53:59 +13005141 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005142 "vkCreateXlibSurfaceKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005143
Chris Forbes04b61da2016-11-03 09:53:59 +13005144 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005145
Chris Forbes04b61da2016-11-03 09:53:59 +13005146 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005147 result =
5148 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5149 }
5150
5151 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5152
5153 return result;
5154}
5155
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005156VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5157 uint32_t queueFamilyIndex, Display *dpy,
5158 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005159 VkBool32 result = false;
5160
5161 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5162 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005163 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005164
Chris Forbes04b61da2016-11-03 09:53:59 +13005165 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005166 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005167
Chris Forbes04b61da2016-11-03 09:53:59 +13005168 skip |= parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005169
Chris Forbes04b61da2016-11-03 09:53:59 +13005170 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005171 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5172 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005173 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005174 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005175}
5176#endif // VK_USE_PLATFORM_XLIB_KHR
5177
5178#ifdef VK_USE_PLATFORM_MIR_KHR
5179VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005180 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005181 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5182
5183 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5184 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005185 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005186
Chris Forbes04b61da2016-11-03 09:53:59 +13005187 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005188 "vkCreateMirSurfaceKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005189
Chris Forbes04b61da2016-11-03 09:53:59 +13005190 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005191
Chris Forbes04b61da2016-11-03 09:53:59 +13005192 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005193 result =
5194 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5195 }
5196
5197 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5198
5199 return result;
5200}
5201
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005202VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5203 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005204 VkBool32 result = false;
5205
5206 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5207 assert(my_data != NULL);
5208
Chris Forbes04b61da2016-11-03 09:53:59 +13005209 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005210
Chris Forbes04b61da2016-11-03 09:53:59 +13005211 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005212 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5213
Chris Forbes04b61da2016-11-03 09:53:59 +13005214 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005215
Chris Forbes04b61da2016-11-03 09:53:59 +13005216 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005217 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5218 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005219 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005220 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005221}
5222#endif // VK_USE_PLATFORM_MIR_KHR
5223
5224#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5225VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005226 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005227 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5228
5229 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5230 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005231 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005232
Chris Forbes04b61da2016-11-03 09:53:59 +13005233 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005234 "vkCreateWaylandSurfaceKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5235
Chris Forbes04b61da2016-11-03 09:53:59 +13005236 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005237
Chris Forbes04b61da2016-11-03 09:53:59 +13005238 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005239 result = get_dispatch_table(pc_instance_table_map, instance)
5240 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005241 }
5242
5243 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5244
5245 return result;
5246}
5247
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005248VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5249 uint32_t queueFamilyIndex,
5250 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005251 VkBool32 result = false;
5252
5253 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5254 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(physicalDevice, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005258 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5259
Chris Forbes04b61da2016-11-03 09:53:59 +13005260 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005261 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005262
Chris Forbes04b61da2016-11-03 09:53:59 +13005263 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005264 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5265 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005266 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005267
5268 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005269}
5270#endif // VK_USE_PLATFORM_WAYLAND_KHR
5271
5272#ifdef VK_USE_PLATFORM_ANDROID_KHR
5273VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005274 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005275 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5276
5277 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5278 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005279 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005280
Chris Forbes04b61da2016-11-03 09:53:59 +13005281 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005282 "vkCreateAndroidSurfaceKHR", VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005283
Chris Forbes04b61da2016-11-03 09:53:59 +13005284 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005285
Chris Forbes04b61da2016-11-03 09:53:59 +13005286 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005287 result = get_dispatch_table(pc_instance_table_map, instance)
5288 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005289 }
5290
5291 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5292
5293 return result;
5294}
5295#endif // VK_USE_PLATFORM_ANDROID_KHR
5296
Mark Youngead9b932016-09-08 12:28:38 -06005297VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5298 const VkSwapchainCreateInfoKHR *pCreateInfos,
5299 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5300 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005301 bool skip = false;
Mark Youngead9b932016-09-08 12:28:38 -06005302 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5303 assert(my_data != NULL);
5304
Chris Forbes04b61da2016-11-03 09:53:59 +13005305 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 +13005306
Chris Forbes04b61da2016-11-03 09:53:59 +13005307 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Youngead9b932016-09-08 12:28:38 -06005308 pSwapchains);
5309
Chris Forbes04b61da2016-11-03 09:53:59 +13005310 if (!skip) {
Mark Youngead9b932016-09-08 12:28:38 -06005311 result = get_dispatch_table(pc_device_table_map, device)
5312 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5313
5314 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5315 }
5316
5317 return result;
5318}
5319
Chris Forbes667a5212016-11-03 10:18:35 +13005320VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5321 VkDisplayPropertiesKHR *pProperties) {
5322 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5323 bool skip = false;
5324 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5325 assert(my_data != NULL);
5326
5327 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5328 "vkGetPhysicalDeviceDisplayPropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5329
5330 // No parameter validation function for this call?
5331
5332 if (!skip) {
5333 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5334 ->GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
5335
5336 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPropertiesKHR", result);
5337 }
5338
5339 return result;
5340}
5341
5342VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5343 VkDisplayPlanePropertiesKHR *pProperties) {
5344 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5345 bool skip = false;
5346 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5347 assert(my_data != NULL);
5348
5349 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5350 "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5351
5352 // No parameter validation function for this call?
5353
5354 if (!skip) {
5355 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5356 ->GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
5357
5358 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", result);
5359 }
5360
5361 return result;
5362}
5363
5364VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
5365 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
5366 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5367 bool skip = false;
5368 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5369 assert(my_data != NULL);
5370
5371 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5372 "vkGetDisplayPlaneSupportedDisplaysKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5373
5374 // No parameter validation function for this call?
5375
5376 if (!skip) {
5377 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5378 ->GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
5379
5380 validate_result(my_data->report_data, "vkGetDisplayPlaneSupportedDisplaysKHR", result);
5381 }
5382
5383 return result;
5384}
5385
5386VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5387 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
5388 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5389 bool skip = false;
5390 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5391 assert(my_data != NULL);
5392
5393 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5394 "vkGetDisplayModePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5395
5396 // No parameter validation function for this call?
5397
5398 if (!skip) {
5399 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5400 ->GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
5401
5402 validate_result(my_data->report_data, "vkGetDisplayModePropertiesKHR", result);
5403 }
5404
5405 return result;
5406}
5407
5408VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5409 const VkDisplayModeCreateInfoKHR *pCreateInfo,
5410 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
5411 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5412 bool skip = false;
5413 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5414 assert(my_data != NULL);
5415
5416 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5417 "vkCreateDisplayModeKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5418
5419 // No parameter validation function for this call?
5420
5421 if (!skip) {
5422 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5423 ->CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
5424
5425 validate_result(my_data->report_data, "vkCreateDisplayModeKHR", result);
5426 }
5427
5428 return result;
5429}
5430
5431VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
5432 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
5433 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5434 bool skip = false;
5435 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5436 assert(my_data != NULL);
5437
5438 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5439 "vkGetDisplayPlaneCapabilitiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5440
5441 // No parameter validation function for this call?
5442
5443 if (!skip) {
5444 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5445 ->GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
5446
5447 validate_result(my_data->report_data, "vkGetDisplayPlaneCapabilitiesKHR", result);
5448 }
5449
5450 return result;
5451}
5452
5453VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
5454 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5455 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5456 bool skip = false;
5457 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5458 assert(my_data != NULL);
5459
5460 skip |= require_instance_extension(instance, &instance_extension_enables::display_enabled,
5461 "vkCreateDisplayPlaneSurfaceKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5462
5463 // No parameter validation function for this call?
5464
5465 if (!skip) {
5466 result = get_dispatch_table(pc_instance_table_map, instance)
5467 ->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5468
5469 validate_result(my_data->report_data, "vkCreateDisplayPlaneSurfaceKHR", result);
5470 }
5471
5472 return result;
5473}
5474
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005475// VK_EXT_debug_marker Extension
5476VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5477 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005478 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005479 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5480 assert(my_data != NULL);
5481
Chris Forbes04b61da2016-11-03 09:53:59 +13005482 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005483
Chris Forbes04b61da2016-11-03 09:53:59 +13005484 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005485 result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5486
5487 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5488 }
5489
5490 return result;
5491}
5492
5493VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5494 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005495 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005496 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5497 assert(my_data != NULL);
5498
Chris Forbes04b61da2016-11-03 09:53:59 +13005499 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005500
Chris Forbes04b61da2016-11-03 09:53:59 +13005501 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005502 VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5503
5504 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5505 }
5506
5507 return result;
5508}
5509
5510VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005511 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005512 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5513 assert(my_data != NULL);
5514
Chris Forbes04b61da2016-11-03 09:53:59 +13005515 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005516
Chris Forbes04b61da2016-11-03 09:53:59 +13005517 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005518 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5519 }
5520}
5521
5522VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005523 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005524 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5525 assert(my_data != NULL);
5526
Chris Forbes04b61da2016-11-03 09:53:59 +13005527 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005528
Chris Forbes04b61da2016-11-03 09:53:59 +13005529 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005530 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5531 }
5532}
5533
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005534// VK_NV_external_memory_capabilities Extension
5535VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5536 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5537 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5538 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5539
5540 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005541 bool skip = false;
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005542 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5543 assert(my_data != NULL);
5544
Chris Forbes04b61da2016-11-03 09:53:59 +13005545 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005546 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5547
Chris Forbes04b61da2016-11-03 09:53:59 +13005548 if (!skip) {
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005549 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5550 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
5551 externalHandleType, pExternalImageFormatProperties);
5552
5553 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5554 }
5555
5556 return result;
5557}
5558
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005559#ifdef VK_USE_PLATFORM_WIN32_KHR
5560// VK_NV_external_memory_win32 Extension
5561VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5562 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5563
5564 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005565 bool skip = false;
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005566 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5567 assert(my_data != NULL);
5568
Chris Forbes04b61da2016-11-03 09:53:59 +13005569 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005570
Chris Forbes04b61da2016-11-03 09:53:59 +13005571 if (!skip) {
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005572 result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5573 }
5574
5575 return result;
5576}
5577#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005578
5579
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005580
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005581static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005582
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005583static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005584
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005585static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005586
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005587static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005588
Chia-I Wu01ca2372016-05-13 14:37:49 +08005589VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005590 assert(device);
5591
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005592 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5593
Dustin Graves080069b2016-04-05 13:48:15 -06005594 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005595 return NULL;
5596 }
5597
Chia-I Wuf9b01382016-05-16 07:37:41 +08005598 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5599 if (proc)
5600 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005601
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005602 proc = InterceptWsiEnabledCommand(funcName, device);
5603 if (proc)
5604 return proc;
5605
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005606 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005607 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005608 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005609}
5610
Chia-I Wu01ca2372016-05-13 14:37:49 +08005611VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005612 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005613 if (!proc)
5614 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005615
5616 if (!proc)
5617 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005618
Chia-I Wu617f2a42016-05-16 07:41:17 +08005619 if (proc)
5620 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005621
Chia-I Wu617f2a42016-05-16 07:41:17 +08005622 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005623
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005624 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005625
Chia-I Wu617f2a42016-05-16 07:41:17 +08005626 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005627 if (!proc)
5628 proc = InterceptWsiEnabledCommand(funcName, instance);
5629
Chia-I Wu617f2a42016-05-16 07:41:17 +08005630 if (proc)
5631 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005632
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005633 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005634 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005635 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005636}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005637
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005638static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005639 static const struct {
5640 const char *name;
5641 PFN_vkVoidFunction proc;
5642 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005643 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5644 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5645 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5646 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5647 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5648 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5649 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5650 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5651 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5652 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5653 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5654 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5655 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5656 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5657 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5658 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5659 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005660 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005661 };
5662
5663 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5664 if (!strcmp(core_instance_commands[i].name, name))
5665 return core_instance_commands[i].proc;
5666 }
5667
5668 return nullptr;
5669}
5670
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005671static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005672 static const struct {
5673 const char *name;
5674 PFN_vkVoidFunction proc;
5675 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005676 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5677 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5678 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5679 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5680 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5681 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5682 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5683 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5684 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5685 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5686 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5687 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5688 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5689 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5690 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5691 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5692 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5693 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5694 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5695 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5696 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5697 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5698 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5699 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5700 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5701 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5702 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5703 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5704 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5705 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5706 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5707 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5708 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5709 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5710 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5711 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5712 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5713 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5714 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5715 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5716 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5717 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5718 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5719 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5720 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5721 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5722 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5723 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5724 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5725 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5726 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5727 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5728 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5729 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5730 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5731 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5732 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5733 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5734 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5735 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5736 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5737 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5738 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5739 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5740 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5741 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5742 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5743 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5744 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5745 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5746 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5747 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5748 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5749 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5750 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5751 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5752 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5753 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5754 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5755 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5756 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5757 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5758 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5759 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5760 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5761 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5762 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5763 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5764 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5765 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5766 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5767 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5768 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5769 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5770 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5771 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5772 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5773 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5774 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5775 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5776 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5777 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5778 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5779 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5780 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5781 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5782 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5783 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5784 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5785 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5786 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5787 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5788 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5789 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5790 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5791 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5792 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005793 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5794 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5795 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5796 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005797#ifdef VK_USE_PLATFORM_WIN32_KHR
5798 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5799#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005800};
5801
Chia-I Wuf9b01382016-05-16 07:37:41 +08005802
5803 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5804 if (!strcmp(core_device_commands[i].name, name))
5805 return core_device_commands[i].proc;
5806 }
5807
5808 return nullptr;
5809}
5810
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005811static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005812 static const struct {
5813 const char *name;
5814 PFN_vkVoidFunction proc;
5815 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005816 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5817 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5818 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5819 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005820 {"vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR)},
Chris Forbes64c3c652016-11-03 10:15:31 +13005821 {"vkCreateSharedSwapchainsKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005822 };
5823
5824 if (device) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005825 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5826 if (!strcmp(wsi_device_commands[i].name, name))
5827 return wsi_device_commands[i].proc;
Mark Youngead9b932016-09-08 12:28:38 -06005828 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005829 }
5830
5831 return nullptr;
5832}
5833
5834static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5835 static const struct {
5836 const char *name;
5837 PFN_vkVoidFunction proc;
5838 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005839 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5840 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5841 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5842 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5843 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5844 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005845 {"vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR)},
Chris Forbes667a5212016-11-03 10:18:35 +13005846 {"vkGetPhysicalDeviceDisplayPropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR)},
5847 {"vkGetPhysicalDeviceDisplayPlanePropertiesKHR",
5848 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR)},
5849 {"vkGetDisplayPlaneSupportedDisplaysKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR)},
5850 {"vkGetDisplayModePropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR)},
5851 {"vkCreateDisplayModeKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR)},
5852 {"vkGetDisplayPlaneCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR)},
5853 {"vkCreateDisplayPlaneSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR)},
Chris Forbesb858dc82016-11-03 11:28:19 +13005854#ifdef VK_USE_PLATFORM_WIN32_KHR
5855 {"vkCreateWin32SurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR)},
5856 {"vkGetPhysicalDeviceWin32PresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR)},
5857#endif
5858#ifdef VK_USE_PLATFORM_XCB_KHR
5859 {"vkCreateXcbSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR)},
5860 {"vkGetPhysicalDeviceXcbPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR)},
5861#endif
5862#ifdef VK_USE_PLATFORM_XLIB_KHR
5863 {"vkCreateXlibSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR)},
5864 {"vkGetPhysicalDeviceXlibPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR)},
5865#endif
5866#ifdef VK_USE_PLATFORM_MIR_KHR
5867 {"vkCreateMirSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR)},
5868 {"vkGetPhysicalDeviceMirPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR)},
5869#endif
5870#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5871 {"vkCreateWaylandSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR)},
5872 {"vkGetPhysicalDeviceWaylandPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR)},
5873#endif
5874#ifdef VK_USE_PLATFORM_ANDROID_KHR
5875 {"vkCreateAndroidSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR)},
5876#endif
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005877 };
5878
Chris Forbes8a13e272016-11-02 17:43:34 +13005879 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5880 if (!strcmp(wsi_instance_commands[i].name, name))
5881 return wsi_instance_commands[i].proc;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005882 }
5883
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005884 return nullptr;
5885}
5886
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005887} // namespace parameter_validation
5888
5889// vk_layer_logging.h expects these to be defined
5890
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005891VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5892 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5893 const VkAllocationCallbacks *pAllocator,
5894 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005895 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005896}
5897
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005898VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5899 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005900 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005901}
5902
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005903VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5904 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5905 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005906 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005907}
5908
5909// loader-layer interface v0
5910
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005911VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5912 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005913 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005914}
5915
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005916VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5917 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005918 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005919}
5920
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005921VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5922 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005923 // the layer command handles VK_NULL_HANDLE just fine internally
5924 assert(physicalDevice == VK_NULL_HANDLE);
5925 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005926}
5927
5928VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5929 const char *pLayerName, uint32_t *pCount,
5930 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005931 // the layer command handles VK_NULL_HANDLE just fine internally
5932 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005933 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005934}
5935
5936VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005937 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005938}
5939
5940VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005941 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005942}