blob: 443d3bf5cdb0a57a50f1c452a97ef29d26b530ae [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__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002774 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002775 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2776 "pCreateInfos->flags "
2777 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2778 return false;
2779 }
2780 }
2781
2782 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2783 if (pCreateInfos->basePipelineIndex != -1) {
2784 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002785 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 -06002786 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002787 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2788 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2789 "VK_NULL_HANDLE");
2790 return false;
2791 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002792 }
2793 }
2794
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002795 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002796 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002797 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 -06002798 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002799 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2800 "unrecognized enumerator");
2801 return false;
2802 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002803
2804 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2805 (data->physical_device_features.fillModeNonSolid == false)) {
2806 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002807 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 -06002808 DEVICE_FEATURE, LayerName,
2809 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2810 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2811 return false;
2812 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002813 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002814
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002815 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002816 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002817 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2818 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002819 pCreateInfos[i].pStages[j].pName);
2820 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002821 }
2822
2823 return true;
2824}
2825
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002826VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2827 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2828 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002829 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002830 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002831 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2832 assert(device_data != nullptr);
2833 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002834
Chris Forbes04b61da2016-11-03 09:53:59 +13002835 skip |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
Dustin Gravesc900f572016-05-16 11:07:59 -06002836 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002837
Dustin Gravesc900f572016-05-16 11:07:59 -06002838 if (pCreateInfos != nullptr) {
2839 for (uint32_t i = 0; i < createInfoCount; ++i) {
2840 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2841 if (pCreateInfos[i].pTessellationState == nullptr) {
2842 if (pCreateInfos[i].pStages != nullptr) {
2843 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2844 // pTessellationState must not be NULL
2845 bool has_control = false;
2846 bool has_eval = false;
2847
2848 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2849 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2850 has_control = true;
2851 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2852 has_eval = true;
2853 }
2854 }
2855
2856 if (has_control && has_eval) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002857 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 -06002858 __LINE__, REQUIRED_PARAMETER, LayerName,
2859 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2860 "control shader stage and a tessellation evaluation shader stage, "
2861 "pCreateInfos[%d].pTessellationState must not be NULL",
2862 i, i);
2863 }
2864 }
Dustin Graves629259b2016-05-30 16:14:27 -06002865 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002866 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002867 report_data, "vkCreateGraphicsPipelines",
2868 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2869 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002870
Chris Forbes04b61da2016-11-03 09:53:59 +13002871 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002872 report_data, "vkCreateGraphicsPipelines",
2873 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2874 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002875
2876 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002877 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 -06002878 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2879 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2880 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2881 i);
2882 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002883 }
2884
2885 if (pCreateInfos[i].pViewportState == nullptr) {
2886 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2887 // valid VkPipelineViewportStateCreateInfo structure
2888 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2889 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002890 skip |= log_msg(
Dustin Gravesc900f572016-05-16 11:07:59 -06002891 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2892 REQUIRED_PARAMETER, LayerName,
2893 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2894 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2895 i, i);
2896 }
2897 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002898 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002899 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2900 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2901 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002902
Chris Forbes04b61da2016-11-03 09:53:59 +13002903 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002904 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2905 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002906 pCreateInfos[i].pViewportState->flags);
2907
Dustin Gravesc900f572016-05-16 11:07:59 -06002908 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002909 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 -06002910 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2911 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2912 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2913 i);
2914 }
2915
2916 if (pCreateInfos[i].pDynamicState != nullptr) {
2917 bool has_dynamic_viewport = false;
2918 bool has_dynamic_scissor = false;
2919
2920 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2921 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2922 has_dynamic_viewport = true;
2923 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2924 has_dynamic_scissor = true;
2925 }
2926 }
2927
2928 // viewportCount must be greater than 0
2929 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2930 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002931 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 -06002932 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002933 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2934 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002935 "must be greater than 0",
2936 i, i);
2937 }
2938
2939 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2940 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2941 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002942 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002943 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2944 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002945 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002946 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2947 i, i);
2948 }
2949
2950 // scissorCount must be greater than 0
2951 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2952 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002953 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 -06002954 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002955 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2956 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002957 "must be greater than 0",
2958 i, i);
2959 }
2960
2961 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2962 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2963 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002964 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002965 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2966 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002967 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002968 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2969 i, i);
2970 }
2971 }
2972 }
2973
2974 if (pCreateInfos[i].pMultisampleState == nullptr) {
2975 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2976 // a valid VkPipelineMultisampleStateCreateInfo structure
2977 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2978 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002979 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002980 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2981 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2982 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2983 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2984 i, i);
2985 }
Dustin Graves629259b2016-05-30 16:14:27 -06002986 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002987 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002988 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2989 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002990 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002991
Chris Forbes04b61da2016-11-03 09:53:59 +13002992 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002993 report_data, "vkCreateGraphicsPipelines",
2994 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
2995 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002996
Chris Forbes04b61da2016-11-03 09:53:59 +13002997 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002998 report_data, "vkCreateGraphicsPipelines",
2999 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
3000 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003001
Chris Forbes04b61da2016-11-03 09:53:59 +13003002 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003003 report_data, "vkCreateGraphicsPipelines",
3004 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3005 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3006 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3007 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003008
Chris Forbes04b61da2016-11-03 09:53:59 +13003009 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003010 report_data, "vkCreateGraphicsPipelines",
3011 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3012 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003013
Chris Forbes04b61da2016-11-03 09:53:59 +13003014 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003015 report_data, "vkCreateGraphicsPipelines",
3016 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3017 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003018
3019 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003020 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 -06003021 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3022 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3023 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3024 i);
3025 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003026 }
3027
3028 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003029 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003030 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003031 report_data, "vkCreateGraphicsPipelines",
3032 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3033 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003034
Chris Forbes04b61da2016-11-03 09:53:59 +13003035 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003036 report_data, "vkCreateGraphicsPipelines",
3037 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3038 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003039
Chris Forbes04b61da2016-11-03 09:53:59 +13003040 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003041 report_data, "vkCreateGraphicsPipelines",
3042 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3043 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003044
Chris Forbes04b61da2016-11-03 09:53:59 +13003045 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003046 report_data, "vkCreateGraphicsPipelines",
3047 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3048 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003049
Chris Forbes04b61da2016-11-03 09:53:59 +13003050 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003051 report_data, "vkCreateGraphicsPipelines",
3052 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3053 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3054 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003055
Chris Forbes04b61da2016-11-03 09:53:59 +13003056 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003057 report_data, "vkCreateGraphicsPipelines",
3058 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3059 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003060
Chris Forbes04b61da2016-11-03 09:53:59 +13003061 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003062 report_data, "vkCreateGraphicsPipelines",
3063 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3064 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003065
Chris Forbes04b61da2016-11-03 09:53:59 +13003066 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003067 report_data, "vkCreateGraphicsPipelines",
3068 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3069 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3070 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003071
Chris Forbes04b61da2016-11-03 09:53:59 +13003072 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003073 report_data, "vkCreateGraphicsPipelines",
3074 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3075 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3076 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003077
Chris Forbes04b61da2016-11-03 09:53:59 +13003078 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003079 report_data, "vkCreateGraphicsPipelines",
3080 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3081 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3082 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003083
Chris Forbes04b61da2016-11-03 09:53:59 +13003084 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003085 report_data, "vkCreateGraphicsPipelines",
3086 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3087 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3088 pCreateInfos[i].pDepthStencilState->front.compareOp);
3089
Chris Forbes04b61da2016-11-03 09:53:59 +13003090 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003091 report_data, "vkCreateGraphicsPipelines",
3092 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003093 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3094
Chris Forbes04b61da2016-11-03 09:53:59 +13003095 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003096 report_data, "vkCreateGraphicsPipelines",
3097 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003098 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3099
Chris Forbes04b61da2016-11-03 09:53:59 +13003100 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003101 report_data, "vkCreateGraphicsPipelines",
3102 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3103 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3104 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003105
Chris Forbes04b61da2016-11-03 09:53:59 +13003106 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003107 report_data, "vkCreateGraphicsPipelines",
3108 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3109 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3110 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003111
3112 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003113 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 -06003114 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3115 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3116 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3117 i);
3118 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003119 }
3120
3121 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3122 if (pCreateInfos[i].pColorBlendState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003123 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003124 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3125 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3126 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003127
Chris Forbes04b61da2016-11-03 09:53:59 +13003128 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003129 report_data, "vkCreateGraphicsPipelines",
3130 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3131 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003132
Chris Forbes04b61da2016-11-03 09:53:59 +13003133 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003134 report_data, "vkCreateGraphicsPipelines",
3135 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3136 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003137
Chris Forbes04b61da2016-11-03 09:53:59 +13003138 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003139 report_data, "vkCreateGraphicsPipelines",
3140 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3141 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3142 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003143
3144 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3145 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3146 ++attachmentIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003147 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003148 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3149 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3150 ParameterName::IndexVector{i, attachmentIndex}),
3151 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003152
Chris Forbes04b61da2016-11-03 09:53:59 +13003153 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003154 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003155 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3156 ParameterName::IndexVector{i, attachmentIndex}),
3157 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003158 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3159
Chris Forbes04b61da2016-11-03 09:53:59 +13003160 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003161 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003162 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3163 ParameterName::IndexVector{i, attachmentIndex}),
3164 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003165 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3166
Chris Forbes04b61da2016-11-03 09:53:59 +13003167 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003168 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3169 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3170 ParameterName::IndexVector{i, attachmentIndex}),
3171 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3172 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003173
Chris Forbes04b61da2016-11-03 09:53:59 +13003174 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003175 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003176 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3177 ParameterName::IndexVector{i, attachmentIndex}),
3178 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003179 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3180
Chris Forbes04b61da2016-11-03 09:53:59 +13003181 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003182 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003183 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3184 ParameterName::IndexVector{i, attachmentIndex}),
3185 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003186 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3187
Chris Forbes04b61da2016-11-03 09:53:59 +13003188 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003189 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3190 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3191 ParameterName::IndexVector{i, attachmentIndex}),
3192 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3193 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003194
Chris Forbes04b61da2016-11-03 09:53:59 +13003195 skip |=
Dustin Graves629259b2016-05-30 16:14:27 -06003196 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003197 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3198 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003199 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3200 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3201 }
3202 }
3203
Dustin Gravesc900f572016-05-16 11:07:59 -06003204 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003205 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 -06003206 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3207 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3208 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3209 i);
3210 }
3211
3212 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3213 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003214 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003215 report_data, "vkCreateGraphicsPipelines",
3216 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003217 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3218 }
3219 }
3220 }
3221 }
3222
Chris Forbes04b61da2016-11-03 09:53:59 +13003223 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003224 PreCreateGraphicsPipelines(device, pCreateInfos);
3225
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003226 result = get_dispatch_table(pc_device_table_map, device)
3227 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003228
Dustin Gravesc900f572016-05-16 11:07:59 -06003229 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003230 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003231
3232 return result;
3233}
3234
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003235bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003236 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3237
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003238 if (pCreateInfos != nullptr) {
3239 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003240 uint32_t i = 0;
3241 validate_string(data->report_data, "vkCreateComputePipelines",
3242 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003243 }
3244
3245 return true;
3246}
3247
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003248VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3249 const VkComputePipelineCreateInfo *pCreateInfos,
3250 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003251 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003252 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003253 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003254 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003255
Chris Forbes04b61da2016-11-03 09:53:59 +13003256 skip |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003257 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003258
Chris Forbes04b61da2016-11-03 09:53:59 +13003259 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003260 PreCreateComputePipelines(device, pCreateInfos);
3261
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003262 result = get_dispatch_table(pc_device_table_map, device)
3263 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003264
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003265 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003266 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003267
3268 return result;
3269}
3270
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003271VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003272 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003273 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003274 assert(my_data != NULL);
3275
Chris Forbes04b61da2016-11-03 09:53:59 +13003276 skip |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003277
Chris Forbes04b61da2016-11-03 09:53:59 +13003278 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003279 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003280 }
3281}
3282
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003283VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3284 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003285 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003286 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003287 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003288 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003289
Chris Forbes04b61da2016-11-03 09:53:59 +13003290 skip |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003291
Chris Forbes04b61da2016-11-03 09:53:59 +13003292 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003293 result =
3294 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003295
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003296 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003297 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003298
3299 return result;
3300}
3301
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003302VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3303 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003304 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003305 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003306 assert(my_data != NULL);
3307
Chris Forbes04b61da2016-11-03 09:53:59 +13003308 skip |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003309
Chris Forbes04b61da2016-11-03 09:53:59 +13003310 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003311 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003312 }
3313}
3314
Chia-I Wu01ca2372016-05-13 14:37:49 +08003315VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3316 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003317 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003318 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003319 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3320 assert(device_data != NULL);
3321 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003322
Chris Forbes04b61da2016-11-03 09:53:59 +13003323 skip |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003324
Dustin Gravesc900f572016-05-16 11:07:59 -06003325 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3326 if (pCreateInfo != nullptr) {
3327 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3328 if (pCreateInfo->compareEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003329 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003330 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3331 }
3332
3333 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3334 // valid VkBorderColor value
3335 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3336 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3337 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003338 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
Dustin Gravesc900f572016-05-16 11:07:59 -06003339 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3340 }
3341 }
3342
Chris Forbes04b61da2016-11-03 09:53:59 +13003343 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003344 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3345
Dustin Gravesc900f572016-05-16 11:07:59 -06003346 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003347 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003348
3349 return result;
3350}
3351
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003352VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003353 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003354 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003355 assert(my_data != NULL);
3356
Chris Forbes04b61da2016-11-03 09:53:59 +13003357 skip |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003358
Chris Forbes04b61da2016-11-03 09:53:59 +13003359 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003360 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003361 }
3362}
3363
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003364VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3365 const VkAllocationCallbacks *pAllocator,
3366 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003367 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003368 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003369 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3370 assert(device_data != nullptr);
3371 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003372
Chris Forbes04b61da2016-11-03 09:53:59 +13003373 skip |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003374
Dustin Gravesc900f572016-05-16 11:07:59 -06003375 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3376 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3377 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3378 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3379 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3380 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3381 // valid VkSampler handles
3382 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3383 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3384 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3385 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3386 ++descriptor_index) {
3387 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003388 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003389 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3390 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3391 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3392 " specified as VK_NULL_HANDLE",
3393 i, descriptor_index);
3394 }
3395 }
3396 }
3397
3398 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3399 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3400 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003401 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003402 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3403 UNRECOGNIZED_VALUE, LayerName,
3404 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3405 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3406 i, i);
3407 }
3408 }
3409 }
3410 }
3411
Chris Forbes04b61da2016-11-03 09:53:59 +13003412 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003413 result =
3414 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003415
Dustin Gravesc900f572016-05-16 11:07:59 -06003416 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003417 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003418
3419 return result;
3420}
3421
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003422VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3423 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003424 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003425 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003426 assert(my_data != NULL);
3427
Chris Forbes04b61da2016-11-03 09:53:59 +13003428 skip |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003429
Chris Forbes04b61da2016-11-03 09:53:59 +13003430 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003431 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003432 }
3433}
3434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003435VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3436 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003437 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003438 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003439 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003440 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003441
Chris Forbes04b61da2016-11-03 09:53:59 +13003442 skip |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003443
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003444 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3445
Chris Forbes04b61da2016-11-03 09:53:59 +13003446 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003447 result =
3448 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003449
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003450 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003451 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003452
3453 return result;
3454}
3455
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003456VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3457 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003458 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003459 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003460 assert(my_data != NULL);
3461
Chris Forbes04b61da2016-11-03 09:53:59 +13003462 skip |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003463
Chris Forbes04b61da2016-11-03 09:53:59 +13003464 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003465 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003466 }
3467}
3468
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003469VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3470 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003471 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003472 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003473 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3474 assert(my_data != NULL);
3475
Chris Forbes04b61da2016-11-03 09:53:59 +13003476 skip |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003477
Chris Forbes04b61da2016-11-03 09:53:59 +13003478 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003479 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3480
3481 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3482 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003483
3484 return result;
3485}
3486
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003487VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3488 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003489 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003490 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003491 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003492 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003493
Chris Forbes04b61da2016-11-03 09:53:59 +13003494 skip |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003495
Chris Forbes04b61da2016-11-03 09:53:59 +13003496 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003497 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3498
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003499 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003500 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003501
3502 return result;
3503}
3504
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003505VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003506 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003507 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003508 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003509 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3510 assert(device_data != nullptr);
3511 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003512
Chris Forbes04b61da2016-11-03 09:53:59 +13003513 skip |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003514
Dustin Gravesc900f572016-05-16 11:07:59 -06003515 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3516 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3517 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003518 skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003519 pDescriptorSets, true, true);
3520
Chris Forbes04b61da2016-11-03 09:53:59 +13003521 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003522 result = get_dispatch_table(pc_device_table_map, device)
3523 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003524
Dustin Gravesc900f572016-05-16 11:07:59 -06003525 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003526 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003527
3528 return result;
3529}
3530
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003531VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3532 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3533 const VkCopyDescriptorSet *pDescriptorCopies) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003534 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003535 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3536 assert(device_data != NULL);
3537 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003538
Chris Forbes04b61da2016-11-03 09:53:59 +13003539 skip |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
Dustin Gravesc900f572016-05-16 11:07:59 -06003540 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003541
Dustin Gravesc900f572016-05-16 11:07:59 -06003542 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3543 if (pDescriptorWrites != NULL) {
3544 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3545 // descriptorCount must be greater than 0
3546 if (pDescriptorWrites[i].descriptorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003547 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003548 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3549 REQUIRED_PARAMETER, LayerName,
3550 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3551 }
3552
3553 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3554 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3555 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3556 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3557 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3558 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3559 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3560 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3561 if (pDescriptorWrites[i].pImageInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003562 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 -06003563 __LINE__, REQUIRED_PARAMETER, LayerName,
3564 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3565 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3566 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3567 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3568 i, i);
3569 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3570 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3571 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3572 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3573 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3574 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003575 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003576 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3577 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003578 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
Chris Forbes04b61da2016-11-03 09:53:59 +13003579 skip |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003580 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3581 ParameterName::IndexVector{i, descriptor_index}),
3582 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003583 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3584 }
3585 }
3586 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3587 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3588 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3589 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3590 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3591 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3592 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3593 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003594 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003595 __LINE__, REQUIRED_PARAMETER, LayerName,
3596 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3597 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3598 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3599 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3600 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003601 } else {
3602 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003603 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003604 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3605 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003606 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3607 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003608 }
3609 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3610 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3611 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3612 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3613 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003614 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 -06003615 __LINE__, REQUIRED_PARAMETER, LayerName,
3616 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3617 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3618 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3619 i, i);
3620 } else {
3621 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3622 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003623 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003624 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3625 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003626 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3627 }
3628 }
3629 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003630
3631 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3632 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3633 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3634 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3635 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3636 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003637 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003638 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003639 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003640 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3641 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3642 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3643 }
3644 }
3645 }
3646 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3647 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3648 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3649 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3650 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3651 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003652 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003653 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003654 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003655 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3656 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3657 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3658 }
3659 }
3660 }
3661 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003662 }
3663 }
3664
Chris Forbes04b61da2016-11-03 09:53:59 +13003665 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003666 get_dispatch_table(pc_device_table_map, device)
3667 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003668 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003669}
3670
Chia-I Wu01ca2372016-05-13 14:37:49 +08003671VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003672 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003673 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003674 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003675 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003676 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003677
Chris Forbes04b61da2016-11-03 09:53:59 +13003678 skip |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003679
Chris Forbes04b61da2016-11-03 09:53:59 +13003680 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003681 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3682
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003683 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003684 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003685
3686 return result;
3687}
3688
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003689VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003690 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003691 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003692 assert(my_data != NULL);
3693
Chris Forbes04b61da2016-11-03 09:53:59 +13003694 skip |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003695
Chris Forbes04b61da2016-11-03 09:53:59 +13003696 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003697 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003698 }
3699}
3700
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003701bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003702 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003703 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3704
3705 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3706 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003707 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 -06003708 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003709 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3710 }
3711 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003712 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003713}
3714
Chia-I Wu01ca2372016-05-13 14:37:49 +08003715VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003716 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003717 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003718 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003719 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003720 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003721
Chris Forbes04b61da2016-11-03 09:53:59 +13003722 skip |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3723 skip |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003724
Chris Forbes04b61da2016-11-03 09:53:59 +13003725 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003726 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3727
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003728 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003729 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003730
3731 return result;
3732}
3733
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003734VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003735 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003736 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003737 assert(my_data != NULL);
3738
Chris Forbes04b61da2016-11-03 09:53:59 +13003739 skip |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003740
Chris Forbes04b61da2016-11-03 09:53:59 +13003741 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003742 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003743 }
3744}
3745
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003746VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003747 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003748 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003749 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003750
Chris Forbes04b61da2016-11-03 09:53:59 +13003751 skip |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003752
Chris Forbes04b61da2016-11-03 09:53:59 +13003753 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003754 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003755 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003756}
3757
Chia-I Wu01ca2372016-05-13 14:37:49 +08003758VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003759 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003760 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003761 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003762 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003763 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003764
Chris Forbes04b61da2016-11-03 09:53:59 +13003765 skip |=
Dustin Gravesde628532016-04-21 16:30:17 -06003766 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003767
Chris Forbes04b61da2016-11-03 09:53:59 +13003768 skip |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003769
Chris Forbes04b61da2016-11-03 09:53:59 +13003770 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003771 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3772
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003773 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003774 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003775
3776 return result;
3777}
3778
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003779VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003780 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003781 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003782 assert(my_data != NULL);
3783
Chris Forbes04b61da2016-11-03 09:53:59 +13003784 skip |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003785
Chris Forbes04b61da2016-11-03 09:53:59 +13003786 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003787 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003788 }
3789}
3790
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003791VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003792 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003793 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003794 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3795 assert(my_data != NULL);
3796
Chris Forbes04b61da2016-11-03 09:53:59 +13003797 skip |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003798
Chris Forbes04b61da2016-11-03 09:53:59 +13003799 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003800 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3801
3802 validate_result(my_data->report_data, "vkResetCommandPool", result);
3803 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003804
3805 return result;
3806}
3807
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003808VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3809 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003810 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003811 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003812 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003813 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003814
Chris Forbes04b61da2016-11-03 09:53:59 +13003815 skip |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003816
Chris Forbes04b61da2016-11-03 09:53:59 +13003817 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003818 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3819
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003820 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003821 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003822
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003823 return result;
3824}
3825
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003826VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003827 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003828 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003829 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3830 assert(device_data != nullptr);
3831 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003832
Chris Forbes04b61da2016-11-03 09:53:59 +13003833 skip |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003834
Dustin Gravesc900f572016-05-16 11:07:59 -06003835 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3836 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3837 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003838 skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003839 pCommandBuffers, true, true);
3840
Chris Forbes04b61da2016-11-03 09:53:59 +13003841 if (!skip) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003842 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003843 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003844 }
3845}
3846
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003847bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003848 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003849 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3850 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3851
3852 if (pInfo != NULL) {
3853 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003854 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003855 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003856 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003857 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3858 "inheritedQueries.");
3859 }
3860
3861 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3862 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003863 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003864 log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003865 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003866 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3867 "valid combination of VkQueryControlFlagBits.",
3868 pInfo->queryFlags);
3869 }
3870 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003871 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003872}
3873
3874VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003875 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003876 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003877 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3878 assert(device_data != nullptr);
3879 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003880
Chris Forbes04b61da2016-11-03 09:53:59 +13003881 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003882
Dustin Gravesc900f572016-05-16 11:07:59 -06003883 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3884 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13003885 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Dustin Gravesc900f572016-05-16 11:07:59 -06003886 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3887 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3888
3889 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003890 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003891 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003892
Chris Forbes04b61da2016-11-03 09:53:59 +13003893 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Dustin Graves629259b2016-05-30 16:14:27 -06003894 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3895
Dustin Gravesc900f572016-05-16 11:07:59 -06003896 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003897 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06003898 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3899
3900 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003901 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Dustin Gravesc900f572016-05-16 11:07:59 -06003902 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3903 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3904 }
3905
Chris Forbes04b61da2016-11-03 09:53:59 +13003906 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003907
Chris Forbes04b61da2016-11-03 09:53:59 +13003908 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003909 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3910
Dustin Gravesc900f572016-05-16 11:07:59 -06003911 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003912 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003913
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003914 return result;
3915}
3916
Chia-I Wu01ca2372016-05-13 14:37:49 +08003917VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003918 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3919 assert(my_data != NULL);
3920
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003921 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003922
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003923 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003924
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003925 return result;
3926}
3927
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003928VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003929 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003930 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3931 assert(my_data != NULL);
3932
Chris Forbes04b61da2016-11-03 09:53:59 +13003933 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003934
Chris Forbes04b61da2016-11-03 09:53:59 +13003935 if (!skip) {
Dustin Graves16d18972016-05-09 17:36:57 -06003936 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3937
3938 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3939 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003940
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003941 return result;
3942}
3943
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003944VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3945 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003946 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003947 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3948 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003949
Chris Forbes04b61da2016-11-03 09:53:59 +13003950 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003951
Chris Forbes04b61da2016-11-03 09:53:59 +13003952 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003953 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3954 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003955}
3956
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003957bool preCmdSetViewport(layer_data *my_data, uint32_t viewport_count, const VkViewport *viewports) {
3958 debug_report_data *report_data = my_data->report_data;
3959
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003960 bool skip =
3961 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003962
3963 if (viewport_count > 0 && viewports != nullptr) {
3964 const VkPhysicalDeviceLimits &limits = my_data->device_limits;
3965 for (uint32_t viewportIndex = 0; viewportIndex < viewport_count; ++viewportIndex) {
3966 const VkViewport &viewport = viewports[viewportIndex];
3967
3968 if (viewport.width <= 0 || viewport.width > limits.maxViewportDimensions[0]) {
3969 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3970 VALIDATION_ERROR_01448, LayerName,
3971 "vkCmdSetViewport %d: width (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3972 viewport.width, limits.maxViewportDimensions[0], validation_error_map[VALIDATION_ERROR_01448]);
3973 }
3974
3975 bool invalid_height = (viewport.height <= 0 || viewport.height > limits.maxViewportDimensions[1]);
3976 if (my_data->amd_negative_viewport_height_enabled && (viewport.height < 0)) {
3977 // VALIDATION_ERROR_01790
3978 invalid_height = false;
3979 }
3980 if (invalid_height) {
3981 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3982 VALIDATION_ERROR_01449, LayerName,
3983 "vkCmdSetViewport %d: height (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3984 viewport.height, limits.maxViewportDimensions[1], validation_error_map[VALIDATION_ERROR_01449]);
3985 }
3986
3987 if (viewport.x < limits.viewportBoundsRange[0] || viewport.x > limits.viewportBoundsRange[1]) {
3988 skip |=
3989 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3990 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: x (%f) exceeds permitted bounds (%f,%f). %s",
3991 viewportIndex, viewport.x, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3992 validation_error_map[VALIDATION_ERROR_01450]);
3993 }
3994
3995 if (viewport.y < limits.viewportBoundsRange[0] || viewport.y > limits.viewportBoundsRange[1]) {
3996 skip |=
3997 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3998 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: y (%f) exceeds permitted bounds (%f,%f). %s",
3999 viewportIndex, viewport.y, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
4000 validation_error_map[VALIDATION_ERROR_01450]);
4001 }
4002
4003 if (viewport.x + viewport.width > limits.viewportBoundsRange[1]) {
4004 skip |=
4005 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4006 VALIDATION_ERROR_01451, LayerName,
4007 "vkCmdSetViewport %d: x (%f) + width (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.x,
4008 viewport.width, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01451]);
4009 }
4010
4011 if (viewport.y + viewport.height > limits.viewportBoundsRange[1]) {
4012 skip |=
4013 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4014 VALIDATION_ERROR_01452, LayerName,
4015 "vkCmdSetViewport %d: y (%f) + height (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.y,
4016 viewport.height, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01452]);
4017 }
4018 }
4019 }
4020
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004021 return skip;
4022}
4023
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004024VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4025 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004026 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004027 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004028 assert(my_data != NULL);
4029
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004030 skip |= preCmdSetViewport(my_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004031
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004032 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004033 get_dispatch_table(pc_device_table_map, commandBuffer)
4034 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004035 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004036}
4037
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004038VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
4039 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004040 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004041 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004042 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004043 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07004044
Chris Forbes04b61da2016-11-03 09:53:59 +13004045 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004046
Mike Weiblena4742dc2016-10-31 11:05:56 -06004047 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4048 const VkRect2D &pScissor = pScissors[scissorIndex];
4049
4050 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004051 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 -06004052 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4053 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
4054 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004055 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004056 VALIDATION_ERROR_01490, LayerName,
4057 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4058 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
4059 }
4060
4061 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004062 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 -06004063 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4064 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4065 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004066 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004067 VALIDATION_ERROR_01491, LayerName,
4068 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4069 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4070 }
4071 }
4072
Chris Forbes04b61da2016-11-03 09:53:59 +13004073 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004074 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4075 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004076}
4077
Chia-I Wu01ca2372016-05-13 14:37:49 +08004078VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004079 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004080}
4081
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004082VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4083 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004084 get_dispatch_table(pc_device_table_map, commandBuffer)
4085 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004086}
4087
Chia-I Wu01ca2372016-05-13 14:37:49 +08004088VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004089 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004090 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004091 assert(my_data != NULL);
4092
Chris Forbes04b61da2016-11-03 09:53:59 +13004093 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004094
Chris Forbes04b61da2016-11-03 09:53:59 +13004095 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004096 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4097 }
Cody Northrop12365112015-08-17 11:10:49 -06004098}
4099
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004100VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004101 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004102}
4103
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004104VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4105 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004106 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004107 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4108 assert(my_data != NULL);
4109
Chris Forbes04b61da2016-11-03 09:53:59 +13004110 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004111
Chris Forbes04b61da2016-11-03 09:53:59 +13004112 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004113 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4114 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004115}
4116
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004117VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004118 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004119 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4120 assert(my_data != NULL);
4121
Chris Forbes04b61da2016-11-03 09:53:59 +13004122 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004123
Chris Forbes04b61da2016-11-03 09:53:59 +13004124 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004125 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4126 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004127}
4128
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004129VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004130 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004131 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4132 assert(my_data != NULL);
4133
Chris Forbes04b61da2016-11-03 09:53:59 +13004134 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004135
Chris Forbes04b61da2016-11-03 09:53:59 +13004136 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004137 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4138 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004139}
4140
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004141VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4142 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4143 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4144 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004145 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004146 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004147 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004148
Chris Forbes04b61da2016-11-03 09:53:59 +13004149 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004150 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4151 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004152
Chris Forbes04b61da2016-11-03 09:53:59 +13004153 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004154 get_dispatch_table(pc_device_table_map, commandBuffer)
4155 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4156 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004157 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004158}
4159
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004160VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4161 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004162 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004163 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4164 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004165
Chris Forbes04b61da2016-11-03 09:53:59 +13004166 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004167
Chris Forbes04b61da2016-11-03 09:53:59 +13004168 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004169 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4170 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004171}
4172
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004173VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4174 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004175 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004176 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004177 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004178
Chris Forbes04b61da2016-11-03 09:53:59 +13004179 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004180
Chris Forbes04b61da2016-11-03 09:53:59 +13004181 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004182 get_dispatch_table(pc_device_table_map, commandBuffer)
4183 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004184 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004185}
4186
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004187bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4188 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004189 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004190 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004191 // 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 -07004192 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004193 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 -06004194 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004195 return false;
4196 }
4197
4198 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004199 // 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 -07004200 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004201 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 -06004202 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004203 return false;
4204 }
4205
4206 return true;
4207}
4208
Chia-I Wu01ca2372016-05-13 14:37:49 +08004209VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4210 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004211 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004212
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004213 get_dispatch_table(pc_device_table_map, commandBuffer)
4214 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004215}
4216
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004217VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4218 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004219 get_dispatch_table(pc_device_table_map, commandBuffer)
4220 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004221}
4222
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004223VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4224 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004225 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004226 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4227 assert(my_data != NULL);
4228
Chris Forbes04b61da2016-11-03 09:53:59 +13004229 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004230
Chris Forbes04b61da2016-11-03 09:53:59 +13004231 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004232 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4233 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004234}
4235
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004236VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4237 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004238 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004239 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4240 assert(my_data != NULL);
4241
Chris Forbes04b61da2016-11-03 09:53:59 +13004242 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004243
Chris Forbes04b61da2016-11-03 09:53:59 +13004244 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004245 get_dispatch_table(pc_device_table_map, commandBuffer)
4246 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4247 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004248}
4249
Chia-I Wu01ca2372016-05-13 14:37:49 +08004250VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004251 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004252}
4253
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004254VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004255 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004256 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4257 assert(my_data != NULL);
4258
Chris Forbes04b61da2016-11-03 09:53:59 +13004259 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004260
Chris Forbes04b61da2016-11-03 09:53:59 +13004261 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004262 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4263 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004264}
4265
Chia-I Wu01ca2372016-05-13 14:37:49 +08004266VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4267 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004268 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004269 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004270 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004271
Chris Forbes04b61da2016-11-03 09:53:59 +13004272 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004273
Chris Forbes04b61da2016-11-03 09:53:59 +13004274 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004275 get_dispatch_table(pc_device_table_map, commandBuffer)
4276 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004277 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004278}
4279
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004280bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004281 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004282 if (pRegions != nullptr) {
4283 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4284 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004285 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 -06004286 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004287 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4288 return false;
4289 }
4290 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4291 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004292 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 -06004293 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004294 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4295 return false;
4296 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004297 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004298
4299 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004300}
4301
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004302VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4303 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4304 const VkImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004305 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004306 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004307 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004308
Chris Forbes04b61da2016-11-03 09:53:59 +13004309 skip |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004310 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004311
Chris Forbes04b61da2016-11-03 09:53:59 +13004312 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004313 PreCmdCopyImage(commandBuffer, pRegions);
4314
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004315 get_dispatch_table(pc_device_table_map, commandBuffer)
4316 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004317 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004318}
4319
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004320bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004321 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004322 if (pRegions != nullptr) {
4323 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4324 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004325 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 -06004326 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004327 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4328 return false;
4329 }
4330 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4331 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004332 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 -06004333 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004334 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4335 return false;
4336 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004337 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004338
4339 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004340}
4341
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004342VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4343 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4344 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004345 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004346 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004347 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004348
Chris Forbes04b61da2016-11-03 09:53:59 +13004349 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004350 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004351
Chris Forbes04b61da2016-11-03 09:53:59 +13004352 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004353 PreCmdBlitImage(commandBuffer, pRegions);
4354
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004355 get_dispatch_table(pc_device_table_map, commandBuffer)
4356 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004357 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004358}
4359
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004360bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004361 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004362 if (pRegions != nullptr) {
4363 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4364 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004365 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 -06004366 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004367 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4368 "enumerator");
4369 return false;
4370 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004371 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004372
4373 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004374}
4375
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004376VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4377 VkImageLayout dstImageLayout, uint32_t regionCount,
4378 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004379 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004380 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004381 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004382
Chris Forbes04b61da2016-11-03 09:53:59 +13004383 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004384 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004385
Chris Forbes04b61da2016-11-03 09:53:59 +13004386 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004387 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4388
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004389 get_dispatch_table(pc_device_table_map, commandBuffer)
4390 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004391 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004392}
4393
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004394bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004395 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004396 if (pRegions != nullptr) {
4397 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4398 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004399 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004400 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004401 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4402 "enumerator");
4403 return false;
4404 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004405 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004406
4407 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004408}
4409
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004410VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4411 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004412 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004413 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004414 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004415
Chris Forbes04b61da2016-11-03 09:53:59 +13004416 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004417 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004418
Chris Forbes04b61da2016-11-03 09:53:59 +13004419 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004420 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4421
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004422 get_dispatch_table(pc_device_table_map, commandBuffer)
4423 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004424 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004425}
4426
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004427VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4428 VkDeviceSize dataSize, const uint32_t *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004429 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004430 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004431 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004432
Chris Forbes04b61da2016-11-03 09:53:59 +13004433 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004434
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004435 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004436 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004437 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4438 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004439 }
4440
4441 if ((dataSize <= 0) || (dataSize > 65536)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004442 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004443 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4444 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004445 dataSize);
4446 } else if (dataSize & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004447 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004448 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4449 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004450 }
4451
Chris Forbes04b61da2016-11-03 09:53:59 +13004452 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004453 get_dispatch_table(pc_device_table_map, commandBuffer)
4454 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004455 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004456}
4457
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004458VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4459 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004460 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004461 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4462 assert(my_data != NULL);
4463
Chris Forbes04b61da2016-11-03 09:53:59 +13004464 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004465
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004466 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004467 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004468 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4469 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004470 }
4471
4472 if (size != VK_WHOLE_SIZE) {
4473 if (size <= 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004474 skip |= log_msg(
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004475 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004476 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004477 } else if (size & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004478 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004479 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004480 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4481 }
4482 }
4483
Chris Forbes04b61da2016-11-03 09:53:59 +13004484 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004485 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4486 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004487}
4488
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004489VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4490 const VkClearColorValue *pColor, uint32_t rangeCount,
4491 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004492 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004493 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004494 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004495
Chris Forbes04b61da2016-11-03 09:53:59 +13004496 skip |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004497
Chris Forbes04b61da2016-11-03 09:53:59 +13004498 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004499 get_dispatch_table(pc_device_table_map, commandBuffer)
4500 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004501 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004502}
4503
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004504VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4505 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4506 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004507 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004508 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004509 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004510
Chris Forbes04b61da2016-11-03 09:53:59 +13004511 skip |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004512 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004513
Chris Forbes04b61da2016-11-03 09:53:59 +13004514 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004515 get_dispatch_table(pc_device_table_map, commandBuffer)
4516 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004517 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004518}
4519
Chia-I Wu01ca2372016-05-13 14:37:49 +08004520VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4521 const VkClearAttachment *pAttachments, uint32_t rectCount,
4522 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004523 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004524 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004525 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004526
Chris Forbes04b61da2016-11-03 09:53:59 +13004527 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004528
Chris Forbes04b61da2016-11-03 09:53:59 +13004529 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004530 get_dispatch_table(pc_device_table_map, commandBuffer)
4531 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004532 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004533}
4534
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004535bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004536 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004537 if (pRegions != nullptr) {
4538 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4539 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4540 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004541 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 -06004542 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004543 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4544 return false;
4545 }
4546 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4547 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4548 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004549 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 -06004550 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004551 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4552 return false;
4553 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004554 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004555
4556 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004557}
4558
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004559VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4560 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4561 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004562 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004563 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004564 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004565
Chris Forbes04b61da2016-11-03 09:53:59 +13004566 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004567 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004568
Chris Forbes04b61da2016-11-03 09:53:59 +13004569 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004570 PreCmdResolveImage(commandBuffer, pRegions);
4571
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004572 get_dispatch_table(pc_device_table_map, commandBuffer)
4573 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004574 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004575}
4576
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004577VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004578 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004579 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4580 assert(my_data != NULL);
4581
Chris Forbes04b61da2016-11-03 09:53:59 +13004582 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004583
Chris Forbes04b61da2016-11-03 09:53:59 +13004584 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004585 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4586 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004587}
4588
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004589VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004590 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004591 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4592 assert(my_data != NULL);
4593
Chris Forbes04b61da2016-11-03 09:53:59 +13004594 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004595
Chris Forbes04b61da2016-11-03 09:53:59 +13004596 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004597 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4598 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004599}
4600
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004601VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4602 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4603 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4604 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4605 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004606 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004607 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004608 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004609
Chris Forbes04b61da2016-11-03 09:53:59 +13004610 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004611 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4612 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004613
Chris Forbes04b61da2016-11-03 09:53:59 +13004614 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004615 get_dispatch_table(pc_device_table_map, commandBuffer)
4616 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4617 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004618 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004619}
4620
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004621VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4622 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4623 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4624 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4625 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004626 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004627 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004628 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004629
Chris Forbes04b61da2016-11-03 09:53:59 +13004630 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004631 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4632 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004633
Chris Forbes04b61da2016-11-03 09:53:59 +13004634 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004635 get_dispatch_table(pc_device_table_map, commandBuffer)
4636 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4637 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004638 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004639}
4640
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004641VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4642 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004643 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004644 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4645 assert(my_data != NULL);
4646
Chris Forbes04b61da2016-11-03 09:53:59 +13004647 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004648
Chris Forbes04b61da2016-11-03 09:53:59 +13004649 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004650 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4651 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004652}
4653
Chia-I Wu01ca2372016-05-13 14:37:49 +08004654VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004655 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004656 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4657 assert(my_data != NULL);
4658
Chris Forbes04b61da2016-11-03 09:53:59 +13004659 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004660
Chris Forbes04b61da2016-11-03 09:53:59 +13004661 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004662 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4663 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004664}
4665
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004666VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4667 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004668 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004669 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4670 assert(my_data != NULL);
4671
Chris Forbes04b61da2016-11-03 09:53:59 +13004672 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004673
Chris Forbes04b61da2016-11-03 09:53:59 +13004674 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004675 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4676 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004677}
4678
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004679bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4680 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004681
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004682 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004683
4684 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004685}
4686
Chia-I Wu01ca2372016-05-13 14:37:49 +08004687VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4688 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004689 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004690 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4691 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004692
Chris Forbes04b61da2016-11-03 09:53:59 +13004693 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004694
Chris Forbes04b61da2016-11-03 09:53:59 +13004695 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004696 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4697
4698 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4699 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004700}
4701
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004702VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4703 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4704 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004705 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004706 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4707 assert(my_data != NULL);
4708
Chris Forbes04b61da2016-11-03 09:53:59 +13004709 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004710 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004711
Chris Forbes04b61da2016-11-03 09:53:59 +13004712 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004713 get_dispatch_table(pc_device_table_map, commandBuffer)
4714 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4715 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004716}
4717
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004718VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4719 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004720 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004721 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004722 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004723
Chris Forbes04b61da2016-11-03 09:53:59 +13004724 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004725
Chris Forbes04b61da2016-11-03 09:53:59 +13004726 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004727 get_dispatch_table(pc_device_table_map, commandBuffer)
4728 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004729 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004730}
4731
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004732VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4733 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004734 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004735 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004736 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004737
Chris Forbes04b61da2016-11-03 09:53:59 +13004738 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004739
Chris Forbes04b61da2016-11-03 09:53:59 +13004740 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004741 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004742 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004743}
4744
Chia-I Wu01ca2372016-05-13 14:37:49 +08004745VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004746 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004747 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4748 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004749
Chris Forbes04b61da2016-11-03 09:53:59 +13004750 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004751
Chris Forbes04b61da2016-11-03 09:53:59 +13004752 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004753 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4754 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004755}
4756
Chia-I Wu01ca2372016-05-13 14:37:49 +08004757VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004758 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004759}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004760
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004761VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4762 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004763 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004764 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004765 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004766
Chris Forbes04b61da2016-11-03 09:53:59 +13004767 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004768
Chris Forbes04b61da2016-11-03 09:53:59 +13004769 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004770 get_dispatch_table(pc_device_table_map, commandBuffer)
4771 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004772 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004773}
4774
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004775VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004776 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4777}
4778
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004779VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4780 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004781 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4782}
4783
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004784VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4785 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004786 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4787 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4788
4789 return VK_ERROR_LAYER_NOT_PRESENT;
4790}
4791
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004792VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4793 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004794 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004795 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004796 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004797
4798 assert(physicalDevice);
4799
4800 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4801 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004802}
4803
Chris Forbes448ebcb2016-11-03 09:29:52 +13004804bool require_device_extension(layer_data *my_data, bool layer_data::*flag, char const *function_name, char const *extension_name)
4805{
4806 if (!(my_data->*flag)) {
4807 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4808 __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4809 "%s() called even though the %s extension was not enabled for this VkDevice.",
4810 function_name, extension_name);
4811 }
4812
4813 return false;
4814}
4815
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004816// WSI Extension Functions
4817
4818VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004819 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004820 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004821 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004822 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4823 assert(my_data != NULL);
4824
Chris Forbes04b61da2016-11-03 09:53:59 +13004825 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkCreateSwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004826
Chris Forbes04b61da2016-11-03 09:53:59 +13004827 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004828
Chris Forbes04b61da2016-11-03 09:53:59 +13004829 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004830 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4831
4832 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4833 }
4834
4835 return result;
4836}
4837
4838VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004839 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004840 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004841 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004842 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4843 assert(my_data != NULL);
4844
Chris Forbes04b61da2016-11-03 09:53:59 +13004845 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkGetSwapchainImagesKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004846
Chris Forbes04b61da2016-11-03 09:53:59 +13004847 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004848 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4849
Chris Forbes04b61da2016-11-03 09:53:59 +13004850 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004851 result = get_dispatch_table(pc_device_table_map, device)
4852 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4853
4854 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4855 }
4856
4857 return result;
4858}
4859
4860VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004861 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004862 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004863 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004864 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4865 assert(my_data != NULL);
4866
Chris Forbes04b61da2016-11-03 09:53:59 +13004867 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkAcquireNextImageKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004868
Chris Forbes04b61da2016-11-03 09:53:59 +13004869 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004870 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4871
Chris Forbes04b61da2016-11-03 09:53:59 +13004872 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004873 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004874 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004875
4876 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4877 }
4878
4879 return result;
4880}
4881
4882VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4883 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004884 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004885 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4886 assert(my_data != NULL);
4887
Chris Forbes04b61da2016-11-03 09:53:59 +13004888 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkQueuePresentKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004889
Chris Forbes04b61da2016-11-03 09:53:59 +13004890 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004891
Chris Forbes04b61da2016-11-03 09:53:59 +13004892 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004893 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4894
4895 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4896 }
4897
4898 return result;
4899}
4900
Chris Forbesbe5f5202016-11-02 18:34:25 +13004901VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004902 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13004903 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4904 assert(my_data != NULL);
4905
Chris Forbes04b61da2016-11-03 09:53:59 +13004906 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkDestroySwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004907
4908 /* No generated validation function for this call */
4909
Chris Forbes04b61da2016-11-03 09:53:59 +13004910 if (!skip) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13004911 get_dispatch_table(pc_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
4912 }
4913}
4914
Chris Forbes115f98c2016-11-03 09:51:48 +13004915bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name, char const *extension_name)
4916{
4917 if (!(instance_extension_map[get_dispatch_table(pc_instance_table_map, instance)].*flag)) {
4918 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4919 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
4920 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4921 "%s() called even though the %s extension was not enabled for this VkInstance.",
4922 function_name, extension_name);
4923 }
4924
4925 return false;
4926}
4927
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004928VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4929 VkSurfaceKHR surface, VkBool32 *pSupported) {
4930 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004931 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004932 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4933 assert(my_data != NULL);
4934
Chris Forbes04b61da2016-11-03 09:53:59 +13004935 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004936 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004937
Chris Forbes04b61da2016-11-03 09:53:59 +13004938 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004939 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4940
Chris Forbes04b61da2016-11-03 09:53:59 +13004941 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004942 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4943 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4944
4945 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4946 }
4947
4948 return result;
4949}
4950
4951VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4952 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4953 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004954 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004955 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4956 assert(my_data != NULL);
4957
Chris Forbes04b61da2016-11-03 09:53:59 +13004958 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004959 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004960
Chris Forbes04b61da2016-11-03 09:53:59 +13004961 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004962 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004963
Chris Forbes04b61da2016-11-03 09:53:59 +13004964 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004965 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4966 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4967
4968 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4969 }
4970
4971 return result;
4972}
4973
4974VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4975 uint32_t *pSurfaceFormatCount,
4976 VkSurfaceFormatKHR *pSurfaceFormats) {
4977 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004978 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004979 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4980 assert(my_data != NULL);
4981
Chris Forbes04b61da2016-11-03 09:53:59 +13004982 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004983 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004984
Chris Forbes04b61da2016-11-03 09:53:59 +13004985 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004986 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004987
Chris Forbes04b61da2016-11-03 09:53:59 +13004988 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004989 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4990 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4991
4992 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4993 }
4994
4995 return result;
4996}
4997
4998VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4999 uint32_t *pPresentModeCount,
5000 VkPresentModeKHR *pPresentModes) {
5001 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005002 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005003 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5004 assert(my_data != NULL);
5005
Chris Forbes04b61da2016-11-03 09:53:59 +13005006 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005007 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13005008
Chris Forbes04b61da2016-11-03 09:53:59 +13005009 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005010 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005011
Chris Forbes04b61da2016-11-03 09:53:59 +13005012 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005013 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5014 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
5015
5016 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
5017 }
5018
5019 return result;
5020}
5021
Chris Forbesbe5f5202016-11-02 18:34:25 +13005022VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005023 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13005024
Chris Forbes04b61da2016-11-03 09:53:59 +13005025 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005026 "vkDestroySurfaceKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005027
Chris Forbes04b61da2016-11-03 09:53:59 +13005028 if (!skip) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005029 get_dispatch_table(pc_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
5030 }
5031}
5032
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005033#ifdef VK_USE_PLATFORM_WIN32_KHR
5034VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
5035 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5036 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5037
5038 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5039 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005040 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005041
Chris Forbes04b61da2016-11-03 09:53:59 +13005042 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005043 "vkCreateWin32SurfaceKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005044
Chris Forbes04b61da2016-11-03 09:53:59 +13005045 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005046
Chris Forbes04b61da2016-11-03 09:53:59 +13005047 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005048 result =
5049 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5050 }
5051
5052 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5053
5054 return result;
5055}
Chris Forbes9a083b92016-11-02 16:58:15 +13005056
5057VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
5058 uint32_t queueFamilyIndex)
5059{
5060 VkBool32 result = false;
5061
5062 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5063 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005064 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005065
Chris Forbes04b61da2016-11-03 09:53:59 +13005066 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005067 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005068
Chris Forbes7281a502016-11-08 08:45:03 +13005069 // TODO: codegen doesn't produce this function?
5070 //skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005071
Chris Forbes04b61da2016-11-03 09:53:59 +13005072 if (!skip) {
Chris Forbes9a083b92016-11-02 16:58:15 +13005073 result = get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceWin32PresentationSupportKHR(
5074 physicalDevice, queueFamilyIndex);
5075 }
5076
5077 return result;
5078}
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005079#endif // VK_USE_PLATFORM_WIN32_KHR
5080
5081#ifdef VK_USE_PLATFORM_XCB_KHR
5082VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5083 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5084 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5085
5086 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5087 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005088 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005089
Chris Forbes04b61da2016-11-03 09:53:59 +13005090 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005091 "vkCreateXcbSurfaceKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005092
Chris Forbes04b61da2016-11-03 09:53:59 +13005093 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005094
Chris Forbes04b61da2016-11-03 09:53:59 +13005095 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005096 result =
5097 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5098 }
5099
5100 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5101
5102 return result;
5103}
5104
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005105VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5106 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5107 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005108 VkBool32 result = false;
5109
5110 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5111 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005112 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005113
Chris Forbes04b61da2016-11-03 09:53:59 +13005114 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005115 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005116
Chris Forbes04b61da2016-11-03 09:53:59 +13005117 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005118 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005119
Chris Forbes04b61da2016-11-03 09:53:59 +13005120 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005121 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5122 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005123 }
5124
5125 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005126}
5127#endif // VK_USE_PLATFORM_XCB_KHR
5128
5129#ifdef VK_USE_PLATFORM_XLIB_KHR
5130VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005131 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005132 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5133
5134 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5135 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005136 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005137
Chris Forbes04b61da2016-11-03 09:53:59 +13005138 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005139 "vkCreateXlibSurfaceKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005140
Chris Forbes04b61da2016-11-03 09:53:59 +13005141 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005142
Chris Forbes04b61da2016-11-03 09:53:59 +13005143 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005144 result =
5145 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5146 }
5147
5148 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5149
5150 return result;
5151}
5152
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005153VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5154 uint32_t queueFamilyIndex, Display *dpy,
5155 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005156 VkBool32 result = false;
5157
5158 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5159 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005160 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005161
Chris Forbes04b61da2016-11-03 09:53:59 +13005162 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005163 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005164
Chris Forbes04b61da2016-11-03 09:53:59 +13005165 skip |= parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005166
Chris Forbes04b61da2016-11-03 09:53:59 +13005167 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005168 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5169 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005170 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005171 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005172}
5173#endif // VK_USE_PLATFORM_XLIB_KHR
5174
5175#ifdef VK_USE_PLATFORM_MIR_KHR
5176VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005177 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005178 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5179
5180 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5181 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005182 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005183
Chris Forbes04b61da2016-11-03 09:53:59 +13005184 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005185 "vkCreateMirSurfaceKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005186
Chris Forbes04b61da2016-11-03 09:53:59 +13005187 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005188
Chris Forbes04b61da2016-11-03 09:53:59 +13005189 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005190 result =
5191 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5192 }
5193
5194 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5195
5196 return result;
5197}
5198
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005199VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5200 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005201 VkBool32 result = false;
5202
5203 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5204 assert(my_data != NULL);
5205
Chris Forbes04b61da2016-11-03 09:53:59 +13005206 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005207
Chris Forbes04b61da2016-11-03 09:53:59 +13005208 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005209 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5210
Chris Forbes04b61da2016-11-03 09:53:59 +13005211 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005212
Chris Forbes04b61da2016-11-03 09:53:59 +13005213 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005214 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5215 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005216 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005217 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005218}
5219#endif // VK_USE_PLATFORM_MIR_KHR
5220
5221#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5222VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005223 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005224 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5225
5226 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5227 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005228 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005229
Chris Forbes04b61da2016-11-03 09:53:59 +13005230 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005231 "vkCreateWaylandSurfaceKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5232
Chris Forbes04b61da2016-11-03 09:53:59 +13005233 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005234
Chris Forbes04b61da2016-11-03 09:53:59 +13005235 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005236 result = get_dispatch_table(pc_instance_table_map, instance)
5237 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005238 }
5239
5240 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5241
5242 return result;
5243}
5244
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005245VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5246 uint32_t queueFamilyIndex,
5247 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005248 VkBool32 result = false;
5249
5250 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5251 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005252 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005253
Chris Forbes04b61da2016-11-03 09:53:59 +13005254 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005255 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5256
Chris Forbes04b61da2016-11-03 09:53:59 +13005257 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005258 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005259
Chris Forbes04b61da2016-11-03 09:53:59 +13005260 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005261 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5262 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005263 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005264
5265 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005266}
5267#endif // VK_USE_PLATFORM_WAYLAND_KHR
5268
5269#ifdef VK_USE_PLATFORM_ANDROID_KHR
5270VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005271 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005272 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5273
5274 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5275 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005276 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005277
Chris Forbes04b61da2016-11-03 09:53:59 +13005278 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005279 "vkCreateAndroidSurfaceKHR", VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005280
Chris Forbes04b61da2016-11-03 09:53:59 +13005281 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005282
Chris Forbes04b61da2016-11-03 09:53:59 +13005283 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005284 result = get_dispatch_table(pc_instance_table_map, instance)
5285 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005286 }
5287
5288 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5289
5290 return result;
5291}
5292#endif // VK_USE_PLATFORM_ANDROID_KHR
5293
Mark Youngead9b932016-09-08 12:28:38 -06005294VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5295 const VkSwapchainCreateInfoKHR *pCreateInfos,
5296 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5297 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005298 bool skip = false;
Mark Youngead9b932016-09-08 12:28:38 -06005299 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5300 assert(my_data != NULL);
5301
Chris Forbes04b61da2016-11-03 09:53:59 +13005302 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 +13005303
Chris Forbes04b61da2016-11-03 09:53:59 +13005304 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Youngead9b932016-09-08 12:28:38 -06005305 pSwapchains);
5306
Chris Forbes04b61da2016-11-03 09:53:59 +13005307 if (!skip) {
Mark Youngead9b932016-09-08 12:28:38 -06005308 result = get_dispatch_table(pc_device_table_map, device)
5309 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5310
5311 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5312 }
5313
5314 return result;
5315}
5316
Chris Forbes667a5212016-11-03 10:18:35 +13005317VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5318 VkDisplayPropertiesKHR *pProperties) {
5319 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5320 bool skip = false;
5321 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5322 assert(my_data != NULL);
5323
5324 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5325 "vkGetPhysicalDeviceDisplayPropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5326
5327 // No parameter validation function for this call?
5328
5329 if (!skip) {
5330 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5331 ->GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
5332
5333 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPropertiesKHR", result);
5334 }
5335
5336 return result;
5337}
5338
5339VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5340 VkDisplayPlanePropertiesKHR *pProperties) {
5341 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5342 bool skip = false;
5343 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5344 assert(my_data != NULL);
5345
5346 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5347 "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5348
5349 // No parameter validation function for this call?
5350
5351 if (!skip) {
5352 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5353 ->GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
5354
5355 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", result);
5356 }
5357
5358 return result;
5359}
5360
5361VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
5362 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
5363 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5364 bool skip = false;
5365 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5366 assert(my_data != NULL);
5367
5368 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5369 "vkGetDisplayPlaneSupportedDisplaysKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5370
5371 // No parameter validation function for this call?
5372
5373 if (!skip) {
5374 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5375 ->GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
5376
5377 validate_result(my_data->report_data, "vkGetDisplayPlaneSupportedDisplaysKHR", result);
5378 }
5379
5380 return result;
5381}
5382
5383VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5384 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
5385 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5386 bool skip = false;
5387 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5388 assert(my_data != NULL);
5389
5390 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5391 "vkGetDisplayModePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5392
5393 // No parameter validation function for this call?
5394
5395 if (!skip) {
5396 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5397 ->GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
5398
5399 validate_result(my_data->report_data, "vkGetDisplayModePropertiesKHR", result);
5400 }
5401
5402 return result;
5403}
5404
5405VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5406 const VkDisplayModeCreateInfoKHR *pCreateInfo,
5407 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
5408 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5409 bool skip = false;
5410 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5411 assert(my_data != NULL);
5412
5413 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5414 "vkCreateDisplayModeKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5415
5416 // No parameter validation function for this call?
5417
5418 if (!skip) {
5419 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5420 ->CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
5421
5422 validate_result(my_data->report_data, "vkCreateDisplayModeKHR", result);
5423 }
5424
5425 return result;
5426}
5427
5428VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
5429 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
5430 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5431 bool skip = false;
5432 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5433 assert(my_data != NULL);
5434
5435 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5436 "vkGetDisplayPlaneCapabilitiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5437
5438 // No parameter validation function for this call?
5439
5440 if (!skip) {
5441 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5442 ->GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
5443
5444 validate_result(my_data->report_data, "vkGetDisplayPlaneCapabilitiesKHR", result);
5445 }
5446
5447 return result;
5448}
5449
5450VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
5451 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5452 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5453 bool skip = false;
5454 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5455 assert(my_data != NULL);
5456
5457 skip |= require_instance_extension(instance, &instance_extension_enables::display_enabled,
5458 "vkCreateDisplayPlaneSurfaceKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5459
5460 // No parameter validation function for this call?
5461
5462 if (!skip) {
5463 result = get_dispatch_table(pc_instance_table_map, instance)
5464 ->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5465
5466 validate_result(my_data->report_data, "vkCreateDisplayPlaneSurfaceKHR", result);
5467 }
5468
5469 return result;
5470}
5471
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005472// VK_EXT_debug_marker Extension
5473VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5474 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005475 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005476 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5477 assert(my_data != NULL);
5478
Chris Forbes04b61da2016-11-03 09:53:59 +13005479 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005480
Chris Forbes04b61da2016-11-03 09:53:59 +13005481 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005482 result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5483
5484 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5485 }
5486
5487 return result;
5488}
5489
5490VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5491 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005492 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005493 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5494 assert(my_data != NULL);
5495
Chris Forbes04b61da2016-11-03 09:53:59 +13005496 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005497
Chris Forbes04b61da2016-11-03 09:53:59 +13005498 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005499 VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5500
5501 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5502 }
5503
5504 return result;
5505}
5506
5507VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005508 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005509 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5510 assert(my_data != NULL);
5511
Chris Forbes04b61da2016-11-03 09:53:59 +13005512 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005513
Chris Forbes04b61da2016-11-03 09:53:59 +13005514 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005515 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5516 }
5517}
5518
5519VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005520 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005521 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5522 assert(my_data != NULL);
5523
Chris Forbes04b61da2016-11-03 09:53:59 +13005524 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005525
Chris Forbes04b61da2016-11-03 09:53:59 +13005526 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005527 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5528 }
5529}
5530
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005531// VK_NV_external_memory_capabilities Extension
5532VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5533 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5534 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5535 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5536
5537 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005538 bool skip = false;
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005539 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5540 assert(my_data != NULL);
5541
Chris Forbes04b61da2016-11-03 09:53:59 +13005542 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005543 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5544
Chris Forbes04b61da2016-11-03 09:53:59 +13005545 if (!skip) {
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005546 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5547 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
5548 externalHandleType, pExternalImageFormatProperties);
5549
5550 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5551 }
5552
5553 return result;
5554}
5555
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005556#ifdef VK_USE_PLATFORM_WIN32_KHR
5557// VK_NV_external_memory_win32 Extension
5558VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5559 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5560
5561 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005562 bool skip = false;
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005563 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5564 assert(my_data != NULL);
5565
Chris Forbes04b61da2016-11-03 09:53:59 +13005566 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005567
Chris Forbes04b61da2016-11-03 09:53:59 +13005568 if (!skip) {
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005569 result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5570 }
5571
5572 return result;
5573}
5574#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005575
5576
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005577
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005578static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005579
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005580static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005581
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005582static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005583
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005584static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005585
Chia-I Wu01ca2372016-05-13 14:37:49 +08005586VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005587 assert(device);
5588
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005589 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5590
Dustin Graves080069b2016-04-05 13:48:15 -06005591 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005592 return NULL;
5593 }
5594
Chia-I Wuf9b01382016-05-16 07:37:41 +08005595 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5596 if (proc)
5597 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005598
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005599 proc = InterceptWsiEnabledCommand(funcName, device);
5600 if (proc)
5601 return proc;
5602
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005603 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005604 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005605 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005606}
5607
Chia-I Wu01ca2372016-05-13 14:37:49 +08005608VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005609 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005610 if (!proc)
5611 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005612
5613 if (!proc)
5614 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005615
Chia-I Wu617f2a42016-05-16 07:41:17 +08005616 if (proc)
5617 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005618
Chia-I Wu617f2a42016-05-16 07:41:17 +08005619 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005620
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005621 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005622
Chia-I Wu617f2a42016-05-16 07:41:17 +08005623 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005624 if (!proc)
5625 proc = InterceptWsiEnabledCommand(funcName, instance);
5626
Chia-I Wu617f2a42016-05-16 07:41:17 +08005627 if (proc)
5628 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005629
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005630 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005631 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005632 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005633}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005634
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005635static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005636 static const struct {
5637 const char *name;
5638 PFN_vkVoidFunction proc;
5639 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005640 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5641 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5642 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5643 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5644 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5645 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5646 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5647 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5648 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5649 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5650 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5651 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5652 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5653 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5654 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5655 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5656 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005657 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005658 };
5659
5660 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5661 if (!strcmp(core_instance_commands[i].name, name))
5662 return core_instance_commands[i].proc;
5663 }
5664
5665 return nullptr;
5666}
5667
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005668static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005669 static const struct {
5670 const char *name;
5671 PFN_vkVoidFunction proc;
5672 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005673 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5674 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5675 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5676 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5677 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5678 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5679 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5680 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5681 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5682 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5683 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5684 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5685 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5686 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5687 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5688 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5689 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5690 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5691 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5692 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5693 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5694 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5695 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5696 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5697 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5698 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5699 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5700 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5701 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5702 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5703 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5704 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5705 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5706 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5707 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5708 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5709 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5710 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5711 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5712 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5713 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5714 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5715 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5716 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5717 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5718 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5719 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5720 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5721 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5722 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5723 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5724 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5725 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5726 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5727 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5728 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5729 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5730 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5731 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5732 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5733 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5734 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5735 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5736 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5737 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5738 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5739 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5740 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5741 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5742 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5743 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5744 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5745 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5746 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5747 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5748 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5749 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5750 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5751 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5752 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5753 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5754 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5755 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5756 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5757 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5758 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5759 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5760 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5761 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5762 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5763 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5764 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5765 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5766 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5767 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5768 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5769 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5770 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5771 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5772 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5773 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5774 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5775 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5776 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5777 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5778 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5779 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5780 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5781 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5782 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5783 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5784 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5785 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5786 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5787 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5788 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5789 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005790 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5791 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5792 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5793 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005794#ifdef VK_USE_PLATFORM_WIN32_KHR
5795 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5796#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005797};
5798
Chia-I Wuf9b01382016-05-16 07:37:41 +08005799
5800 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5801 if (!strcmp(core_device_commands[i].name, name))
5802 return core_device_commands[i].proc;
5803 }
5804
5805 return nullptr;
5806}
5807
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005808static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005809 static const struct {
5810 const char *name;
5811 PFN_vkVoidFunction proc;
5812 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005813 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5814 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5815 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5816 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005817 {"vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR)},
Chris Forbes64c3c652016-11-03 10:15:31 +13005818 {"vkCreateSharedSwapchainsKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005819 };
5820
5821 if (device) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005822 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5823 if (!strcmp(wsi_device_commands[i].name, name))
5824 return wsi_device_commands[i].proc;
Mark Youngead9b932016-09-08 12:28:38 -06005825 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005826 }
5827
5828 return nullptr;
5829}
5830
5831static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5832 static const struct {
5833 const char *name;
5834 PFN_vkVoidFunction proc;
5835 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005836 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5837 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5838 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5839 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5840 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5841 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005842 {"vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR)},
Chris Forbes667a5212016-11-03 10:18:35 +13005843 {"vkGetPhysicalDeviceDisplayPropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR)},
5844 {"vkGetPhysicalDeviceDisplayPlanePropertiesKHR",
5845 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR)},
5846 {"vkGetDisplayPlaneSupportedDisplaysKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR)},
5847 {"vkGetDisplayModePropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR)},
5848 {"vkCreateDisplayModeKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR)},
5849 {"vkGetDisplayPlaneCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR)},
5850 {"vkCreateDisplayPlaneSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR)},
Chris Forbesb858dc82016-11-03 11:28:19 +13005851#ifdef VK_USE_PLATFORM_WIN32_KHR
5852 {"vkCreateWin32SurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR)},
5853 {"vkGetPhysicalDeviceWin32PresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR)},
5854#endif
5855#ifdef VK_USE_PLATFORM_XCB_KHR
5856 {"vkCreateXcbSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR)},
5857 {"vkGetPhysicalDeviceXcbPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR)},
5858#endif
5859#ifdef VK_USE_PLATFORM_XLIB_KHR
5860 {"vkCreateXlibSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR)},
5861 {"vkGetPhysicalDeviceXlibPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR)},
5862#endif
5863#ifdef VK_USE_PLATFORM_MIR_KHR
5864 {"vkCreateMirSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR)},
5865 {"vkGetPhysicalDeviceMirPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR)},
5866#endif
5867#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5868 {"vkCreateWaylandSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR)},
5869 {"vkGetPhysicalDeviceWaylandPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR)},
5870#endif
5871#ifdef VK_USE_PLATFORM_ANDROID_KHR
5872 {"vkCreateAndroidSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR)},
5873#endif
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005874 };
5875
Chris Forbes8a13e272016-11-02 17:43:34 +13005876 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5877 if (!strcmp(wsi_instance_commands[i].name, name))
5878 return wsi_instance_commands[i].proc;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005879 }
5880
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005881 return nullptr;
5882}
5883
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005884} // namespace parameter_validation
5885
5886// vk_layer_logging.h expects these to be defined
5887
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005888VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5889 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5890 const VkAllocationCallbacks *pAllocator,
5891 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005892 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005893}
5894
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005895VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5896 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005897 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005898}
5899
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005900VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5901 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5902 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005903 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005904}
5905
5906// loader-layer interface v0
5907
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005908VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5909 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005910 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005911}
5912
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005913VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5914 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005915 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005916}
5917
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005918VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5919 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005920 // the layer command handles VK_NULL_HANDLE just fine internally
5921 assert(physicalDevice == VK_NULL_HANDLE);
5922 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005923}
5924
5925VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5926 const char *pLayerName, uint32_t *pCount,
5927 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005928 // the layer command handles VK_NULL_HANDLE just fine internally
5929 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005930 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005931}
5932
5933VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005934 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005935}
5936
5937VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005938 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005939}