blob: 0440b689c1b44857177fbf04feaca64cdfbc11ad [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;
Cody Northrop55443ef2015-09-28 15:09:32 -060078};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050079
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060080static std::unordered_map<void *, struct instance_extension_enables> instance_extension_map;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070081static std::unordered_map<void *, layer_data *> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060082static device_table_map pc_device_table_map;
83static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060084
Mark Lobodzinski739391a2016-03-17 15:08:18 -060085static void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060086
Mark Lobodzinski739391a2016-03-17 15:08:18 -060087 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -060088}
89
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060090VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
91 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
92 const VkAllocationCallbacks *pAllocator,
93 VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070094 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -070095 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -060096
Jon Ashburn5484e0c2016-03-08 17:48:44 -070097 if (result == VK_SUCCESS) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070098 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -060099 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600100 }
101
102 return result;
103}
104
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600105VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800106 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700107 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700108 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600109
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700110 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700111 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600112}
113
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600114VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
115 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
116 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700117 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
118 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700119}
120
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700121static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600122
Chia-I Wu3384db82016-05-16 07:30:58 +0800123static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600124 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800125};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700126
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700127static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600128 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700129 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
130 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
131 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
132 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
133 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 -0700134 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700135 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600136 return false;
137 }
138
139 return true;
140}
141
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700142static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
143 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600144 return "unrecognized enumerator";
145 }
146
147 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700148 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600149 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
150 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700151 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600152 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
153 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700154 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600155 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
156 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700157 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600158 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
159 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700160 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600161 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
162 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700163 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600164 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
165 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700166 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600167 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
168 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700169 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600170 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
171 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700172 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600173 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700175 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600176 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700178 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800179 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600180 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700181 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800182 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600183 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700184 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700185 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
186 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600187
188 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700189 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600190 enumeratorString += string;
191
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700192 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600193 enumeratorString += '|';
194 }
195 }
196
197 return enumeratorString;
198}
199
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700200static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
201 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
202 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
203 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
204 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
205 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600206 return false;
207 }
208
209 return true;
210}
211
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700212static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
213 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600214 return "unrecognized enumerator";
215 }
216
217 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700218 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600219 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
220 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700221 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600222 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600223 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700224 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600225 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
226 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700227 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600228 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
229 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700230 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600231 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
232 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700233 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800234 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600235 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700236 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600237 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
238 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700239 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800240 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600241 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600242
243 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700244 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600245 enumeratorString += string;
246
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700247 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600248 enumeratorString += '|';
249 }
250 }
251
252 return enumeratorString;
253}
254
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700255static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
256 VkQueueFlagBits allFlags =
257 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
258 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600259 return false;
260 }
261
262 return true;
263}
264
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700265static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
266 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600267 return "unrecognized enumerator";
268 }
269
270 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700271 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800272 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600273 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700274 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600275 strings.push_back("VK_QUEUE_COMPUTE_BIT");
276 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700277 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800278 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600279 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700280 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600281 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
282 }
283
284 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700285 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600286 enumeratorString += string;
287
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700288 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600289 enumeratorString += '|';
290 }
291 }
292
293 return enumeratorString;
294}
295
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700296static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
297 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
298 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
299 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
300 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600301 return false;
302 }
303
304 return true;
305}
306
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700307static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
308 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600309 return "unrecognized enumerator";
310 }
311
312 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700313 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600314 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
315 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700316 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800317 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600318 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700319 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600320 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
321 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700322 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800323 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600324 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700325 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800326 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600327 }
328
329 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700330 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600331 enumeratorString += string;
332
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700333 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600334 enumeratorString += '|';
335 }
336 }
337
338 return enumeratorString;
339}
340
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700341static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700342 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700343 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600344 return false;
345 }
346
347 return true;
348}
349
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700350static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
351 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600352 return "unrecognized enumerator";
353 }
354
355 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700356 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800357 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600358 }
359
360 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700361 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600362 enumeratorString += string;
363
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700364 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600365 enumeratorString += '|';
366 }
367 }
368
369 return enumeratorString;
370}
371
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700372static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
373 VkSparseImageFormatFlagBits allFlags =
374 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
375 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
376 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600377 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600378 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600379
380 return true;
381}
382
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700383static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
384 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600385 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600386 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600387
388 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700389 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800390 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600391 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700392 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800393 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600394 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700395 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800396 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600397 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600398
399 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700400 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600401 enumeratorString += string;
402
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700403 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600404 enumeratorString += '|';
405 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600406 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600407
408 return enumeratorString;
409}
410
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700411static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700412 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700413 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600414 return false;
415 }
416
417 return true;
418}
419
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700420static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
421 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600422 return "unrecognized enumerator";
423 }
424
425 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700426 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600427 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
428 }
429
430 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700431 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600432 enumeratorString += string;
433
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700434 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600435 enumeratorString += '|';
436 }
437 }
438
439 return enumeratorString;
440}
441
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700442static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
443 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
444 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
445 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
446 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
447 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600448 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
449 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
450 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700451 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600452 return false;
453 }
454
455 return true;
456}
457
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700458static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
459 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600460 return "unrecognized enumerator";
461 }
462
463 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700464 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700465 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600466 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700467 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700468 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600469 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700470 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700471 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600472 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700473 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700474 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600475 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700476 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700477 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600478 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700479 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700480 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600481 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700482 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700483 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600484 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700485 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700486 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600487 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700488 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700489 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600490 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700491 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700492 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600493 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700494 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700495 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600496 }
497
498 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700499 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600500 enumeratorString += string;
501
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700502 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600503 enumeratorString += '|';
504 }
505 }
506
507 return enumeratorString;
508}
509
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700510static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
511 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
512 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
513 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600514 return false;
515 }
516
517 return true;
518}
519
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700520static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
521 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600522 return "unrecognized enumerator";
523 }
524
525 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700526 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600527 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
528 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700529 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600530 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
531 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700532 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600533 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
534 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700535 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600536 strings.push_back("VK_QUERY_RESULT_64_BIT");
537 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600538
539 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700540 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600541 enumeratorString += string;
542
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700543 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600544 enumeratorString += '|';
545 }
546 }
547
548 return enumeratorString;
549}
550
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700551static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
552 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
553 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
554 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
555 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
556 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600557 return false;
558 }
559
560 return true;
561}
562
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700563static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
564 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600565 return "unrecognized enumerator";
566 }
567
568 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700569 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600570 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
571 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700572 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600573 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
574 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700575 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600576 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
577 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700578 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600579 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
580 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700581 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600582 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
583 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700584 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800585 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600586 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700587 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600588 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
589 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700590 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800591 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600592 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700593 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600594 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
595 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600596
597 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700598 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600599 enumeratorString += string;
600
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700601 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600602 enumeratorString += '|';
603 }
604 }
605
606 return enumeratorString;
607}
608
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700609static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
610 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
611 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
612 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600613 return false;
614 }
615
616 return true;
617}
618
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700619static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
620 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600621 return "unrecognized enumerator";
622 }
623
624 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700625 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600626 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
627 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700628 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600629 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
630 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700631 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600632 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600633 }
634
635 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700636 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600637 enumeratorString += string;
638
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700639 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600640 enumeratorString += '|';
641 }
642 }
643
644 return enumeratorString;
645}
646
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700647static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
648 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
649 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
650 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
651 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600652 return false;
653 }
654
655 return true;
656}
657
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700658static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
659 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600660 return "unrecognized enumerator";
661 }
662
663 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700664 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600665 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
666 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700667 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600668 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
669 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700670 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600671 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
672 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700673 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600674 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
675 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700676 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600677 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600678 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600679
680 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700681 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600682 enumeratorString += string;
683
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700684 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600685 enumeratorString += '|';
686 }
687 }
688
689 return enumeratorString;
690}
691
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700692static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
693 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
694 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
695 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600696 return false;
697 }
698
699 return true;
700}
701
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700702static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
703 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600704 return "unrecognized enumerator";
705 }
706
707 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700708 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800709 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600710 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700711 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800712 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600713 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700714 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800715 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600716 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700717 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800718 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600719 }
720
721 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700722 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600723 enumeratorString += string;
724
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700725 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600726 enumeratorString += '|';
727 }
728 }
729
730 return enumeratorString;
731}
732
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700733static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
734 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
735 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
736 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600737 return false;
738 }
739
740 return true;
741}
742
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700743static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
744 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600745 return "unrecognized enumerator";
746 }
747
748 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700749 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600750 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
751 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700752 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600753 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
754 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700755 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600756 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600757 }
758
759 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700760 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600761 enumeratorString += string;
762
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700763 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600764 enumeratorString += '|';
765 }
766 }
767
768 return enumeratorString;
769}
770
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700771static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
772 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
773 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
774 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
775 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600776 return false;
777 }
778
779 return true;
780}
781
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700782static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
783 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600784 return "unrecognized enumerator";
785 }
786
787 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700788 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600789 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600790 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700791 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600792 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600793 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700794 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600795 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
796 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700797 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600798 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
799 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700800 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600801 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600802 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700803 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600804 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600805 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700806 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600807 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600808 }
809
810 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700811 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600812 enumeratorString += string;
813
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700814 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600815 enumeratorString += '|';
816 }
817 }
818
819 return enumeratorString;
820}
821
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700822static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800823 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700824 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
825 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
826 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
827 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
828 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
829 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 -0700830 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700831 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600832 return false;
833 }
834
835 return true;
836}
837
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700838static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
839 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600840 return "unrecognized enumerator";
841 }
842
843 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700844 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800845 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
846 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700847 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800848 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600849 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700850 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600851 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600852 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700853 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600854 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600855 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700856 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600857 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600858 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700859 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700860 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600861 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700862 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600863 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600864 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700865 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600866 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600867 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700868 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600869 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600870 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700871 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600872 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600873 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700874 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600875 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
876 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700877 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600878 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
879 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700880 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700881 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600882 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700883 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600884 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
885 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700886 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600887 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
888 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700889 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600890 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
891 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700892 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600893 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600894 }
895
896 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700897 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600898 enumeratorString += string;
899
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700900 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600901 enumeratorString += '|';
902 }
903 }
904
905 return enumeratorString;
906}
907
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700908static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800909 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700910 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
911 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
912 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
913 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
914 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 +0800915
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700916 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600917 return false;
918 }
919
920 return true;
921}
922
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700923static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
924 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600925 return "unrecognized enumerator";
926 }
927
928 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700929 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800930 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600931 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700932 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800933 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600934 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700935 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800936 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600937 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700938 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800939 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600940 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700941 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800942 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600943 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700944 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800945 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600946 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700947 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800948 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600949 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700950 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800951 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600952 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700953 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800954 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600955 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700956 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800957 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600958 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700959 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800960 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600961 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700962 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800963 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600964 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700965 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800966 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600967 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700968 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800969 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600970 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700971 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800972 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600973 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700974 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800975 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600976 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700977 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800978 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600979 }
980
981 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700982 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600983 enumeratorString += string;
984
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700985 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600986 enumeratorString += '|';
987 }
988 }
989
990 return enumeratorString;
991}
992
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700993static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
994 VkCommandPoolCreateFlagBits allFlags =
995 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
996 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600997 return false;
998 }
999
1000 return true;
1001}
1002
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001003static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1004 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001005 return "unrecognized enumerator";
1006 }
1007
1008 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001009 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001010 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001011 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001012 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001013 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001014 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001015
1016 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001017 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001018 enumeratorString += string;
1019
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001020 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001021 enumeratorString += '|';
1022 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001023 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001024
1025 return enumeratorString;
1026}
1027
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001028static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001029 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001030 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001031 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001032 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001033
1034 return true;
1035}
1036
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001037static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1038 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001039 return "unrecognized enumerator";
1040 }
1041
1042 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001043 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001044 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001045 }
1046
1047 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001048 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001049 enumeratorString += string;
1050
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001051 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001052 enumeratorString += '|';
1053 }
1054 }
1055
1056 return enumeratorString;
1057}
1058
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001059static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1060 VkCommandBufferUsageFlags allFlags =
1061 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1062 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1063 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001064 return false;
1065 }
1066
1067 return true;
1068}
1069
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001070static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1071 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001072 return "unrecognized enumerator";
1073 }
1074
1075 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001076 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001077 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001078 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001079 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001080 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001081 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001082 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001083 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001084 }
1085
1086 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001087 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001088 enumeratorString += string;
1089
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001090 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001091 enumeratorString += '|';
1092 }
1093 }
1094
1095 return enumeratorString;
1096}
1097
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001098static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001099 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001100 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001101 return false;
1102 }
1103
1104 return true;
1105}
1106
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001107static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1108 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001109 return "unrecognized enumerator";
1110 }
1111
1112 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001113 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001114 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001115 }
1116
1117 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001118 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001119 enumeratorString += string;
1120
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001121 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001122 enumeratorString += '|';
1123 }
1124 }
1125
1126 return enumeratorString;
1127}
1128
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001129static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1130 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1131 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1132 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001133 return false;
1134 }
1135
1136 return true;
1137}
1138
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001139static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1140 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001141 return "unrecognized enumerator";
1142 }
1143
1144 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001145 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001146 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1147 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001148 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001149 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1150 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001151 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001152 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1153 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001154 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001155 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1156 }
1157
1158 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001159 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001160 enumeratorString += string;
1161
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001162 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001163 enumeratorString += '|';
1164 }
1165 }
1166
1167 return enumeratorString;
1168}
1169
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001170static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001171 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001172 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001173 return false;
1174 }
1175
1176 return true;
1177}
1178
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001179static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1180 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001181 return "unrecognized enumerator";
1182 }
1183
1184 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001185 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001186 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001187 }
1188
1189 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001190 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001191 enumeratorString += string;
1192
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001193 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001194 enumeratorString += '|';
1195 }
1196 }
1197
1198 return enumeratorString;
1199}
1200
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001201static const int MaxParamCheckerStringLength = 256;
1202
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001203static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001204 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001205 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001206 assert(validateString != nullptr);
1207
Chris Forbes04b61da2016-11-03 09:53:59 +13001208 bool skip = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001209
1210 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1211
1212 if (result == VK_STRING_ERROR_NONE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001213 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001214 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001215
Chris Forbes04b61da2016-11-03 09:53:59 +13001216 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 -06001217 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1218 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001219 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001220 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001221 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1222 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001223 }
Chris Forbes04b61da2016-11-03 09:53:59 +13001224 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001225}
1226
Dustin Gravesde628532016-04-21 16:30:17 -06001227static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1228 uint32_t index) {
1229 assert(device_data != nullptr);
1230 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001231 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001232
1233 if (index == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001234 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001235 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001236 } else {
1237 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1238 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001239 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001240 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1241 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001242 function_name, parameter_name, index);
1243 return false;
1244 }
1245 }
1246
Chris Forbes04b61da2016-11-03 09:53:59 +13001247 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001248}
1249
1250static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1251 const uint32_t count, const uint32_t *indices) {
1252 assert(device_data != nullptr);
1253 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001254 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001255
1256 if (indices != nullptr) {
1257 for (uint32_t i = 0; i < count; i++) {
1258 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001259 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001260 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001261 } else {
1262 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1263 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001264 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001265 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1266 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001267 function_name, parameter_name, i, indices[i]);
1268 return false;
1269 }
1270 }
1271 }
1272 }
1273
Chris Forbes04b61da2016-11-03 09:53:59 +13001274 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001275}
1276
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001277static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance);
1278
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001279VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1280 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001281 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001282
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001283 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001284 assert(chain_info != nullptr);
1285 assert(chain_info->u.pLayerInfo != nullptr);
1286
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001287 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1288 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001289 if (fpCreateInstance == NULL) {
1290 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001291 }
1292
Dustin Graves842621d2016-03-03 14:17:08 -07001293 // Advance the link info for the next element on the chain
1294 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1295
1296 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001297
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001298 if (result == VK_SUCCESS) {
1299 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1300 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001301
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001302 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001303
Chia-I Wua570b7c2016-05-16 07:48:14 +08001304 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001305 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1306 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001307
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001308 // Look for one or more debug report create info structures
1309 // and setup a callback(s) for each one found.
1310 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1311 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1312 if (my_instance_data->num_tmp_callbacks > 0) {
1313 // Setup the temporary callback(s) here to catch early issues:
1314 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1315 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1316 // Failure of setting up one or more of the callback.
1317 // Therefore, clean up and don't use those callbacks:
1318 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1319 my_instance_data->num_tmp_callbacks = 0;
1320 }
1321 }
1322 }
1323
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001324 init_parameter_validation(my_instance_data, pAllocator);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001325 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001326
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001327 // Ordinarily we'd check these before calling down the chain, but none of the layer
1328 // support is in place until now, if we survive we can report the issue now.
1329 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001330
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001331 if (pCreateInfo->pApplicationInfo) {
1332 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1333 validate_string(my_instance_data->report_data, "vkCreateInstance",
1334 "pCreateInfo->VkApplicationInfo->pApplicationName",
1335 pCreateInfo->pApplicationInfo->pApplicationName);
1336 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001337
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001338 if (pCreateInfo->pApplicationInfo->pEngineName) {
1339 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1340 pCreateInfo->pApplicationInfo->pEngineName);
1341 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001342 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001343
1344 // Disable the tmp callbacks:
1345 if (my_instance_data->num_tmp_callbacks > 0) {
1346 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1347 my_instance_data->tmp_callbacks);
1348 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001349 }
1350
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001351 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001352}
1353
Chia-I Wu01ca2372016-05-13 14:37:49 +08001354VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001355 // Grab the key before the instance is destroyed.
1356 dispatch_key key = get_dispatch_key(instance);
Chris Forbes04b61da2016-11-03 09:53:59 +13001357 bool skip = false;
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001358 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001359 assert(my_data != NULL);
1360
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001361 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1362 bool callback_setup = false;
1363 if (my_data->num_tmp_callbacks > 0) {
1364 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1365 my_data->tmp_callbacks)) {
1366 callback_setup = true;
1367 }
1368 }
1369
Chris Forbes04b61da2016-11-03 09:53:59 +13001370 skip |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001371
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001372 // Disable and cleanup the temporary callback(s):
1373 if (callback_setup) {
1374 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1375 }
1376 if (my_data->num_tmp_callbacks > 0) {
1377 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1378 my_data->num_tmp_callbacks = 0;
1379 }
1380
Chris Forbes04b61da2016-11-03 09:53:59 +13001381 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001382 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001383 pTable->DestroyInstance(instance, pAllocator);
1384
1385 // Clean up logging callback, if any
1386 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001387 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1388 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001389 my_data->logging_callback.pop_back();
1390 }
1391
Chris Forbes78a56b02016-11-02 16:13:01 +13001392 layer_debug_report_destroy_instance(my_data->report_data);
Dustin Graves27a912a2016-03-07 17:52:14 -07001393 layer_data_map.erase(pTable);
1394
1395 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001396 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001397 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001398}
1399
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001400VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1401 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001402 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001403 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001404 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001405 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001406
Chris Forbes04b61da2016-11-03 09:53:59 +13001407 skip |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001408
Chris Forbes04b61da2016-11-03 09:53:59 +13001409 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001410 result = get_dispatch_table(pc_instance_table_map, instance)
1411 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001412
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001413 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001414 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1415 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1416 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1417 // Save the supported features for each physical device
1418 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1419 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1420 }
1421 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001422 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001423 return result;
1424}
1425
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001426VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001427 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001428 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001429 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001430
Chris Forbes04b61da2016-11-03 09:53:59 +13001431 skip |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001432
Chris Forbes04b61da2016-11-03 09:53:59 +13001433 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001434 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001435 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001436}
1437
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001438VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1439 VkFormatProperties *pFormatProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001440 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001441 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001442 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001443
Chris Forbes04b61da2016-11-03 09:53:59 +13001444 skip |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001445
Chris Forbes04b61da2016-11-03 09:53:59 +13001446 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001447 get_dispatch_table(pc_instance_table_map, physicalDevice)
1448 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001449 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001450}
1451
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001452VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1453 VkImageType type, VkImageTiling tiling,
1454 VkImageUsageFlags usage, VkImageCreateFlags flags,
1455 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001456 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001457 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001458 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001459 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001460
Chris Forbes04b61da2016-11-03 09:53:59 +13001461 skip |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001462 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001463
Chris Forbes04b61da2016-11-03 09:53:59 +13001464 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001465 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1466 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1467 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001468
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001469 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001470 }
Chia-I Wu17241042015-10-31 00:31:16 +08001471
1472 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001473}
1474
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001475VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001476 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001477 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001478 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001479
Chris Forbes04b61da2016-11-03 09:53:59 +13001480 skip |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001481
Chris Forbes04b61da2016-11-03 09:53:59 +13001482 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001483 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001484 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001485}
1486
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001487VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1488 uint32_t *pQueueFamilyPropertyCount,
1489 VkQueueFamilyProperties *pQueueFamilyProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001490 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001491 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001492 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001493
Chris Forbes04b61da2016-11-03 09:53:59 +13001494 skip |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001495 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001496
Chris Forbes04b61da2016-11-03 09:53:59 +13001497 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001498 get_dispatch_table(pc_instance_table_map, physicalDevice)
1499 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001500 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001501}
1502
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001503VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1504 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001505 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001506 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001507 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001508
Chris Forbes04b61da2016-11-03 09:53:59 +13001509 skip |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001510
Chris Forbes04b61da2016-11-03 09:53:59 +13001511 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001512 get_dispatch_table(pc_instance_table_map, physicalDevice)
1513 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001514 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001515}
1516
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001517void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1518 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001519 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001520
Chris Forbes0e0161a2016-11-02 16:21:28 +13001521 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1522
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001523 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1524 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1525 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001526 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001527 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001528 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1529 "structure.",
1530 i);
1531 } else {
1532 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001533 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001534
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001535 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1536 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1537 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1538 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001539 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 -06001540 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001541 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1542 "between 0 and 1. Actual value is %f",
1543 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1544 }
1545 }
1546 }
1547
1548 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1549 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001550 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 -06001551 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001552 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1553 "of queue families.",
1554 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001555 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1556 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1557 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001558 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001559 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001560 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1561 "queues for the given family index.",
1562 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001563 }
Michael Lentine774704f2016-01-27 13:36:46 -06001564 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001565 }
1566}
1567
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001568static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001569 VkLayerInstanceDispatchTable *dispatch_table = get_dispatch_table(pc_instance_table_map, instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001570
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001571 instance_extension_map[dispatch_table] = {};
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001572
1573 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1574 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
Chris Forbesd017eff2016-11-02 17:36:42 +13001575 instance_extension_map[dispatch_table].surface_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001576 }
1577#ifdef VK_USE_PLATFORM_XLIB_KHR
1578 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001579 instance_extension_map[dispatch_table].xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001580 }
1581#endif
1582#ifdef VK_USE_PLATFORM_XCB_KHR
1583 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001584 instance_extension_map[dispatch_table].xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001585 }
1586#endif
1587#ifdef VK_USE_PLATFORM_WAYLAND_KHR
1588 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001589 instance_extension_map[dispatch_table].wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001590 }
1591#endif
1592#ifdef VK_USE_PLATFORM_MIR_KHR
1593 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001594 instance_extension_map[dispatch_table].mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001595 }
1596#endif
1597#ifdef VK_USE_PLATFORM_ANDROID_KHR
1598 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001599 instance_extension_map[dispatch_table].android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001600 }
1601#endif
1602#ifdef VK_USE_PLATFORM_WIN32_KHR
1603 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001604 instance_extension_map[dispatch_table].win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001605 }
1606#endif
Chris Forbes2e47f432016-11-03 10:18:18 +13001607 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
1608 instance_extension_map[dispatch_table].display_enabled = true;
1609 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001610 }
1611}
1612
1613static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1614 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes27e49622016-11-02 17:54:21 +13001615 device_data->swapchain_enabled = false;
1616 device_data->display_swapchain_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001617
1618 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1619 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001620 device_data->swapchain_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001621 }
Mark Youngead9b932016-09-08 12:28:38 -06001622 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001623 device_data->display_swapchain_enabled = true;
Mark Youngead9b932016-09-08 12:28:38 -06001624 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001625 }
1626}
1627
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001628void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001629 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001630
1631 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1632 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1633 my_device_data->queueFamilyIndexMap.insert(
1634 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1635 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001636 }
1637}
1638
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001639VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001640 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001641 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001642 * NOTE: We do not validate physicalDevice or any dispatchable
1643 * object as the first parameter. We couldn't get here if it was wrong!
1644 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001645
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001646 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001647 bool skip = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001648 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001649 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001650
Chris Forbes04b61da2016-11-03 09:53:59 +13001651 skip |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001652
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001653 if (pCreateInfo != NULL) {
1654 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001655 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001656 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001657 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001658 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001659 }
Michael Lentine774704f2016-01-27 13:36:46 -06001660
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001661 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001662 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001663 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001664 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001665 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001666 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001667 }
1668
Chris Forbes04b61da2016-11-03 09:53:59 +13001669 if (!skip) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001670 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001671 assert(chain_info != nullptr);
1672 assert(chain_info->u.pLayerInfo != nullptr);
1673
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001674 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1675 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001676 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001677 if (fpCreateDevice == NULL) {
1678 return VK_ERROR_INITIALIZATION_FAILED;
1679 }
1680
1681 // Advance the link info for the next element on the chain
1682 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1683
1684 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001685
1686 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1687
1688 if (result == VK_SUCCESS) {
1689 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1690 assert(my_device_data != nullptr);
1691
1692 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1693 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1694
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001695 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1696
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001697 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001698 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1699 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001700 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001701 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001702
1703 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1704 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001705
1706 // Query and save physical device limits for this device
1707 VkPhysicalDeviceProperties device_properties = {};
1708 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1709 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001710 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001711
1712 // Save app-enabled features in this device's layer_data structure
1713 if (pCreateInfo->pEnabledFeatures) {
1714 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1715 } else {
1716 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1717 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001718 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001719 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001720
Jeremy Hayes99a96322015-06-26 12:48:09 -06001721 return result;
1722}
1723
Chia-I Wu01ca2372016-05-13 14:37:49 +08001724VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001725 dispatch_key key = get_dispatch_key(device);
Chris Forbes04b61da2016-11-03 09:53:59 +13001726 bool skip = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001727 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1728 assert(my_data != NULL);
1729
Chris Forbes04b61da2016-11-03 09:53:59 +13001730 skip |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001731
Chris Forbes04b61da2016-11-03 09:53:59 +13001732 if (!skip) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001733 layer_debug_report_destroy_device(device);
1734
Jeremy Hayes99a96322015-06-26 12:48:09 -06001735#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001736 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001737#endif
1738
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001739 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001740 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001741 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001742 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001743}
1744
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001745bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001746 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001747 assert(my_device_data != nullptr);
1748
Dustin Gravesde628532016-04-21 16:30:17 -06001749 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001750
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001751 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001752 if (queue_data->second <= queueIndex) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001753 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 -06001754 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001755 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1756 "was created.",
1757 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001758 return false;
1759 }
1760 return true;
1761}
1762
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001763VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001764 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001765 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001766 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001767
Chris Forbes04b61da2016-11-03 09:53:59 +13001768 skip |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001769
Chris Forbes04b61da2016-11-03 09:53:59 +13001770 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001771 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1772
1773 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001774 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001775}
1776
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001777VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001778 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001779 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001780 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001781 assert(my_data != NULL);
1782
Chris Forbes04b61da2016-11-03 09:53:59 +13001783 skip |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001784
Chris Forbes04b61da2016-11-03 09:53:59 +13001785 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001786 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1787
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001788 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001789 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001790
Jeremy Hayes99a96322015-06-26 12:48:09 -06001791 return result;
1792}
1793
Chia-I Wu01ca2372016-05-13 14:37:49 +08001794VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001795 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1796 assert(my_data != NULL);
1797
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001798 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001799
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001800 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001801
1802 return result;
1803}
1804
Chia-I Wu01ca2372016-05-13 14:37:49 +08001805VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001806 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1807 assert(my_data != NULL);
1808
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001809 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001810
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001811 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001812
1813 return result;
1814}
1815
Chia-I Wu01ca2372016-05-13 14:37:49 +08001816VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001817 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001818 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001819 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001820 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001821 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001822
Chris Forbes04b61da2016-11-03 09:53:59 +13001823 skip |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001824
Chris Forbes04b61da2016-11-03 09:53:59 +13001825 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001826 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1827
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001828 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001829 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001830
1831 return result;
1832}
1833
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001834VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001835 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001836 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001837 assert(my_data != NULL);
1838
Chris Forbes04b61da2016-11-03 09:53:59 +13001839 skip |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001840
Chris Forbes04b61da2016-11-03 09:53:59 +13001841 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001842 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001843 }
1844}
1845
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001846VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1847 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001848 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001849 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001850 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001851 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001852
Chris Forbes04b61da2016-11-03 09:53:59 +13001853 skip |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001854
Chris Forbes04b61da2016-11-03 09:53:59 +13001855 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001856 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1857
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001858 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001859 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001860
1861 return result;
1862}
1863
Chia-I Wu01ca2372016-05-13 14:37:49 +08001864VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001865 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001866 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1867 assert(my_data != NULL);
1868
Chris Forbes04b61da2016-11-03 09:53:59 +13001869 skip |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001870
Chris Forbes04b61da2016-11-03 09:53:59 +13001871 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001872 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1873 }
1874}
1875
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001876VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1877 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001878 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001879 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001880 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001881 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001882
Chris Forbes04b61da2016-11-03 09:53:59 +13001883 skip |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001884
Chris Forbes04b61da2016-11-03 09:53:59 +13001885 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001886 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1887
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001888 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001889 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001890
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001891 return result;
1892}
1893
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001894VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1895 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001896 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001897 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001898 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001899 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001900
Chris Forbes04b61da2016-11-03 09:53:59 +13001901 skip |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001902
Chris Forbes04b61da2016-11-03 09:53:59 +13001903 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001904 result =
1905 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001906
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001907 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001908 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001909
Tony Barbourb1250542015-04-16 19:23:13 -06001910 return result;
1911}
1912
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001913VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1914 VkDeviceSize *pCommittedMemoryInBytes) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001915 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001916 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001917 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001918
Chris Forbes04b61da2016-11-03 09:53:59 +13001919 skip |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001920
Chris Forbes04b61da2016-11-03 09:53:59 +13001921 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001922 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001923 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001924}
1925
Chia-I Wu01ca2372016-05-13 14:37:49 +08001926VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1927 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001928 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001929 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001930 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1931 assert(my_data != NULL);
1932
Chris Forbes04b61da2016-11-03 09:53:59 +13001933 skip |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001934
Chris Forbes04b61da2016-11-03 09:53:59 +13001935 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001936 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1937
1938 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1939 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001940
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001941 return result;
1942}
1943
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001944VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001945 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001946 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001947 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1948 assert(my_data != NULL);
1949
Chris Forbes04b61da2016-11-03 09:53:59 +13001950 skip |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001951
Chris Forbes04b61da2016-11-03 09:53:59 +13001952 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001953 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1954
1955 validate_result(my_data->report_data, "vkBindImageMemory", result);
1956 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001957
1958 return result;
1959}
1960
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001961VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1962 VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001963 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001964 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001965 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001966
Chris Forbes04b61da2016-11-03 09:53:59 +13001967 skip |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001968
Chris Forbes04b61da2016-11-03 09:53:59 +13001969 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001970 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001971 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001972}
1973
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001974VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001975 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001976 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001977 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001978
Chris Forbes04b61da2016-11-03 09:53:59 +13001979 skip |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001980
Chris Forbes04b61da2016-11-03 09:53:59 +13001981 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001982 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001983 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001984}
1985
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001986bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1987 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001988 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001989 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001990 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001991 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1992 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001993 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 -06001994 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001995 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1996 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001997 return false;
1998 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001999 }
2000
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002001 return true;
2002}
2003
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002004VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2005 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002006 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002007 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002008 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002009
Chris Forbes04b61da2016-11-03 09:53:59 +13002010 skip |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002011 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002012
Chris Forbes04b61da2016-11-03 09:53:59 +13002013 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002014 get_dispatch_table(pc_device_table_map, device)
2015 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002016
2017 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2018 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002019}
2020
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002021bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2022 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2023 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002024 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002025 if (pProperties != nullptr) {
2026 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2027 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002028 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 -06002029 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002030 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2031 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002032 return false;
2033 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002034 }
2035
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002036 return true;
2037}
2038
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002039VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2040 VkImageType type, VkSampleCountFlagBits samples,
2041 VkImageUsageFlags usage, VkImageTiling tiling,
2042 uint32_t *pPropertyCount,
2043 VkSparseImageFormatProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002044 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002045 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002046 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002047
Chris Forbes04b61da2016-11-03 09:53:59 +13002048 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002049 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002050
Chris Forbes04b61da2016-11-03 09:53:59 +13002051 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002052 get_dispatch_table(pc_instance_table_map, physicalDevice)
2053 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2054 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002055
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002056 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2057 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002058 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002059}
2060
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002061VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2062 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002063 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002064 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002065 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002066 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002067
Chris Forbes04b61da2016-11-03 09:53:59 +13002068 skip |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002069
Chris Forbes04b61da2016-11-03 09:53:59 +13002070 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002071 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2072
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002073 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002074 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002075
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002076 return result;
2077}
2078
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002079VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2080 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002081 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002082 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002083 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002084 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002085
Chris Forbes04b61da2016-11-03 09:53:59 +13002086 skip |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002087
Chris Forbes04b61da2016-11-03 09:53:59 +13002088 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002089 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2090
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002091 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002092 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002093
2094 return result;
2095}
2096
Chia-I Wu01ca2372016-05-13 14:37:49 +08002097VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002098 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002099 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002100 assert(my_data != NULL);
2101
Chris Forbes04b61da2016-11-03 09:53:59 +13002102 skip |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002103
Chris Forbes04b61da2016-11-03 09:53:59 +13002104 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002105 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002106 }
2107}
2108
Chia-I Wu01ca2372016-05-13 14:37:49 +08002109VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002110 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002111 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002112 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002113 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002114
Chris Forbes04b61da2016-11-03 09:53:59 +13002115 skip |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002116
Chris Forbes04b61da2016-11-03 09:53:59 +13002117 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002118 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2119
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002120 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002121 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002122
2123 return result;
2124}
2125
Chia-I Wu01ca2372016-05-13 14:37:49 +08002126VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002127 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002128 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002129 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2130 assert(my_data != NULL);
2131
Chris Forbes04b61da2016-11-03 09:53:59 +13002132 skip |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002133
Chris Forbes04b61da2016-11-03 09:53:59 +13002134 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002135 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2136
2137 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2138 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002139
2140 return result;
2141}
2142
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002143VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2144 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002145 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002146 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002147 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002148 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002149
Chris Forbes04b61da2016-11-03 09:53:59 +13002150 skip |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002151
Chris Forbes04b61da2016-11-03 09:53:59 +13002152 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002153 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2154
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002155 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002156 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002157
2158 return result;
2159}
2160
Chia-I Wu01ca2372016-05-13 14:37:49 +08002161VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002162 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002163 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002164 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002165 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002166 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002167
Chris Forbes04b61da2016-11-03 09:53:59 +13002168 skip |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002169
Chris Forbes04b61da2016-11-03 09:53:59 +13002170 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002171 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2172
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002173 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002174 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002175
2176 return result;
2177}
2178
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002179VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002180 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002181 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002182 assert(my_data != NULL);
2183
Chris Forbes04b61da2016-11-03 09:53:59 +13002184 skip |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002185
Chris Forbes04b61da2016-11-03 09:53:59 +13002186 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002187 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002188 }
2189}
2190
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002191VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2192 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002193 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002194 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002195 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002196 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002197
Chris Forbes04b61da2016-11-03 09:53:59 +13002198 skip |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002199
Chris Forbes04b61da2016-11-03 09:53:59 +13002200 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002201 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2202
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002203 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002204 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002205
2206 return result;
2207}
2208
Chia-I Wu01ca2372016-05-13 14:37:49 +08002209VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002210 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002211 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002212 assert(my_data != NULL);
2213
Chris Forbes04b61da2016-11-03 09:53:59 +13002214 skip |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002215
Chris Forbes04b61da2016-11-03 09:53:59 +13002216 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002217 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002218 }
2219}
2220
Chia-I Wu01ca2372016-05-13 14:37:49 +08002221VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002222 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002223 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002224 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2225 assert(my_data != NULL);
2226
Chris Forbes04b61da2016-11-03 09:53:59 +13002227 skip |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002228
Chris Forbes04b61da2016-11-03 09:53:59 +13002229 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002230 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2231
2232 validate_result(my_data->report_data, "vkGetEventStatus", result);
2233 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002234
2235 return result;
2236}
2237
Chia-I Wu01ca2372016-05-13 14:37:49 +08002238VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002239 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002240 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002241 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2242 assert(my_data != NULL);
2243
Chris Forbes04b61da2016-11-03 09:53:59 +13002244 skip |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002245
Chris Forbes04b61da2016-11-03 09:53:59 +13002246 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002247 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2248
2249 validate_result(my_data->report_data, "vkSetEvent", result);
2250 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002251
2252 return result;
2253}
2254
Chia-I Wu01ca2372016-05-13 14:37:49 +08002255VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002256 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002257 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002258 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2259 assert(my_data != NULL);
2260
Chris Forbes04b61da2016-11-03 09:53:59 +13002261 skip |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002262
Chris Forbes04b61da2016-11-03 09:53:59 +13002263 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002264 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2265
2266 validate_result(my_data->report_data, "vkResetEvent", result);
2267 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002268
2269 return result;
2270}
2271
Chia-I Wu01ca2372016-05-13 14:37:49 +08002272VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002273 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002274 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002275 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002276 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2277 assert(device_data != nullptr);
2278 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002279
Chris Forbes04b61da2016-11-03 09:53:59 +13002280 skip |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002281
Dustin Gravesc900f572016-05-16 11:07:59 -06002282 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2283 if (pCreateInfo != nullptr) {
2284 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2285 // VkQueryPipelineStatisticFlagBits values
2286 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2287 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002288 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002289 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2290 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2291 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2292 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2293 }
2294 }
2295
Chris Forbes04b61da2016-11-03 09:53:59 +13002296 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002297 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2298
Dustin Gravesc900f572016-05-16 11:07:59 -06002299 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002300 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002301
2302 return result;
2303}
2304
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002305VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002306 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002307 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002308 assert(my_data != NULL);
2309
Chris Forbes04b61da2016-11-03 09:53:59 +13002310 skip |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002311
Chris Forbes04b61da2016-11-03 09:53:59 +13002312 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002313 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002314 }
2315}
2316
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002317VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2318 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002319 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002320 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002321 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002322 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002323
Chris Forbes04b61da2016-11-03 09:53:59 +13002324 skip |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002325 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002326
Chris Forbes04b61da2016-11-03 09:53:59 +13002327 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002328 result = get_dispatch_table(pc_device_table_map, device)
2329 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002330
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002331 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002332 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002333
2334 return result;
2335}
2336
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002337VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2338 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002339 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002340 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002341 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2342 assert(device_data != nullptr);
2343 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002344
Karl Schultza9ef1e52016-10-06 17:53:48 -06002345 // TODO: Add check for VALIDATION_ERROR_00660
2346 // TODO: Add check for VALIDATION_ERROR_00661
2347 // TODO: Add check for VALIDATION_ERROR_00662
2348 // TODO: Add check for VALIDATION_ERROR_00670
2349 // TODO: Add check for VALIDATION_ERROR_00671
2350 // TODO: Add check for VALIDATION_ERROR_00672
2351 // TODO: Add check for VALIDATION_ERROR_00673
2352 // TODO: Add check for VALIDATION_ERROR_00674
2353 // TODO: Add check for VALIDATION_ERROR_00675
2354 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2355 // TODO: Add check for VALIDATION_ERROR_00663
Chris Forbes04b61da2016-11-03 09:53:59 +13002356 skip |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002357
Dustin Gravesc900f572016-05-16 11:07:59 -06002358 if (pCreateInfo != nullptr) {
2359 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2360 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2361 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2362 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002363 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 -06002364 __LINE__, VALIDATION_ERROR_00665, LayerName,
2365 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2366 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2367 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002368 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002369
Dustin Gravesc900f572016-05-16 11:07:59 -06002370 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2371 // queueFamilyIndexCount uint32_t values
2372 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002373 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 -06002374 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002375 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2376 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002377 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2378 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002379 }
2380
2381 // Ensure that the queue family indices were specified at device creation
Chris Forbes04b61da2016-11-03 09:53:59 +13002382 skip |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesc900f572016-05-16 11:07:59 -06002383 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2384 }
2385 }
2386
Chris Forbes04b61da2016-11-03 09:53:59 +13002387 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002388 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2389
Dustin Gravesc900f572016-05-16 11:07:59 -06002390 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002391 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002392
2393 return result;
2394}
2395
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002396VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002397 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002398 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002399 assert(my_data != NULL);
2400
Chris Forbes04b61da2016-11-03 09:53:59 +13002401 skip |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002402
Chris Forbes04b61da2016-11-03 09:53:59 +13002403 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002404 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002405 }
2406}
2407
Chia-I Wu01ca2372016-05-13 14:37:49 +08002408VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2409 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002410 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002411 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002412 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002413 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002414
Chris Forbes04b61da2016-11-03 09:53:59 +13002415 skip |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002416
Chris Forbes04b61da2016-11-03 09:53:59 +13002417 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002418 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2419
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002420 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002421 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002422
2423 return result;
2424}
2425
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002426VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002427 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002428 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002429 assert(my_data != NULL);
2430
Chris Forbes04b61da2016-11-03 09:53:59 +13002431 skip |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002432
Chris Forbes04b61da2016-11-03 09:53:59 +13002433 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002434 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002435 }
2436}
2437
Chia-I Wu01ca2372016-05-13 14:37:49 +08002438VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2439 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002440 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002441 bool skip = false;
Dustin Gravesf8032f22016-05-11 18:31:44 -06002442 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002443 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002444 debug_report_data *report_data = device_data->report_data;
2445
Chris Forbes04b61da2016-11-03 09:53:59 +13002446 skip |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002447
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002448 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002449 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002450 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002451 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2452 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002453 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002454 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2455 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2456 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2457 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002458
Dustin Gravesc900f572016-05-16 11:07:59 -06002459 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2460 // queueFamilyIndexCount uint32_t values
2461 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002462 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 -06002463 __LINE__, REQUIRED_PARAMETER, LayerName,
2464 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2465 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2466 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2467 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002468
Chris Forbes04b61da2016-11-03 09:53:59 +13002469 skip |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesf8032f22016-05-11 18:31:44 -06002470 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2471 }
2472
2473 // width, height, and depth members of extent must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002474 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2475 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002476 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
Chris Forbes04b61da2016-11-03 09:53:59 +13002477 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002478
2479 // mipLevels must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002480 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002481
2482 // arrayLayers must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002483 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002484
2485 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2486 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002487 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002488 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002489 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002490 }
2491
2492 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2493 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2494 // extent.height must be equal
2495 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2496 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002497 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002498 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2499 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2500 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002501 }
2502
2503 if (pCreateInfo->extent.depth != 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002504 skip |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002505 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002506 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2507 }
2508 }
2509
2510 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2511 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2512 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002513 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002514 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2515 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2516 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002517 }
2518
2519 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2520 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2521 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2522 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002523 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002524 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2525 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2526 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002527 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002528 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002529
Chris Forbes04b61da2016-11-03 09:53:59 +13002530 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002531 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2532
Dustin Gravesf8032f22016-05-11 18:31:44 -06002533 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002534 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002535
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002536 return result;
2537}
2538
Chia-I Wu01ca2372016-05-13 14:37:49 +08002539VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002540 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002541 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002542 assert(my_data != NULL);
2543
Chris Forbes04b61da2016-11-03 09:53:59 +13002544 skip |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002545
Chris Forbes04b61da2016-11-03 09:53:59 +13002546 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002547 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002548 }
2549}
2550
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002551bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002552 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002553 if (pSubresource != nullptr) {
2554 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2555 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002556 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 -06002557 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002558 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2559 return false;
2560 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002561 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002562
2563 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002564}
2565
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002566VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2567 VkSubresourceLayout *pLayout) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002568 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002569 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002570 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002571
Chris Forbes04b61da2016-11-03 09:53:59 +13002572 skip |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002573
Chris Forbes04b61da2016-11-03 09:53:59 +13002574 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002575 PreGetImageSubresourceLayout(device, pSubresource);
2576
2577 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002578 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002579}
2580
Chia-I Wu01ca2372016-05-13 14:37:49 +08002581VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2582 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002583 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002584 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002585 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002586 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002587 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002588
Chris Forbes04b61da2016-11-03 09:53:59 +13002589 skip |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002590
Dustin Graves0b70a632016-04-27 17:44:56 -06002591 if (pCreateInfo != nullptr) {
2592 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002593 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2594 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002595 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002596 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2597 "pCreateInfo->subresourceRange.layerCount must be 1",
2598 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2599 }
2600 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002601 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2602 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2603 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002604 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002605 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2606 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2607 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2608 }
2609 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002610 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2611 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002612 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002613 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2614 "pCreateInfo->subresourceRange.layerCount must be 6");
2615 }
2616 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002617 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2618 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002619 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002620 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2621 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2622 }
2623 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2624 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002625 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002626 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2627 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2628 }
2629
Dustin Graves2a80dc62016-07-12 13:57:02 -06002630 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2631 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002632 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002633 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2634 "pCreateInfo->subresourceRange.layerCount must be 1");
2635 }
2636 }
2637 }
2638
Chris Forbes04b61da2016-11-03 09:53:59 +13002639 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002640 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2641
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002642 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002643 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002644
2645 return result;
2646}
2647
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002648VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002649 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002650 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002651 assert(my_data != NULL);
2652
Chris Forbes04b61da2016-11-03 09:53:59 +13002653 skip |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002654
Chris Forbes04b61da2016-11-03 09:53:59 +13002655 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002656 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002657 }
2658}
2659
Chia-I Wu01ca2372016-05-13 14:37:49 +08002660VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002661 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002662 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002663 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002664 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002665 assert(my_data != NULL);
2666
Chris Forbes04b61da2016-11-03 09:53:59 +13002667 skip |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002668
Chris Forbes04b61da2016-11-03 09:53:59 +13002669 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002670 result =
2671 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002672
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002673 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002674 }
2675
Michael Lentine03d8e572015-09-15 14:59:14 -05002676 return result;
2677}
2678
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002679VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2680 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002681 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002682 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002683 assert(my_data != NULL);
2684
Chris Forbes04b61da2016-11-03 09:53:59 +13002685 skip |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002686
Chris Forbes04b61da2016-11-03 09:53:59 +13002687 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002688 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002689 }
2690}
2691
Chia-I Wu01ca2372016-05-13 14:37:49 +08002692VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002693 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002694 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002695 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002696 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002697 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002698
Chris Forbes04b61da2016-11-03 09:53:59 +13002699 skip |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002700
Chris Forbes04b61da2016-11-03 09:53:59 +13002701 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002702 result =
2703 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002704
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002705 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002706 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002707
2708 return result;
2709}
2710
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002711VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2712 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002713 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002714 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002715 assert(my_data != NULL);
2716
Chris Forbes04b61da2016-11-03 09:53:59 +13002717 skip |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002718
Chris Forbes04b61da2016-11-03 09:53:59 +13002719 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002720 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002721 }
2722}
2723
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002724VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2725 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002726 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002727 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002728 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002729 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002730
Chris Forbes04b61da2016-11-03 09:53:59 +13002731 skip |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002732
Chris Forbes04b61da2016-11-03 09:53:59 +13002733 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002734 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2735
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002736 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002737 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002738
2739 return result;
2740}
2741
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002742VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2743 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002744 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002745 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002746 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002747 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002748
Chris Forbes04b61da2016-11-03 09:53:59 +13002749 skip |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002750
Chris Forbes04b61da2016-11-03 09:53:59 +13002751 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002752 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2753
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002754 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002755 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002756
2757 return result;
2758}
2759
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002760bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002761 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2762
2763 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002764 if (pCreateInfos != nullptr) {
2765 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2766 if (pCreateInfos->basePipelineIndex != -1) {
2767 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002768 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 -06002769 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002770 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2771 "pCreateInfos->flags "
2772 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2773 return false;
2774 }
2775 }
2776
2777 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2778 if (pCreateInfos->basePipelineIndex != -1) {
2779 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002780 data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002781 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002782 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2783 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2784 "VK_NULL_HANDLE");
2785 return false;
2786 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002787 }
2788 }
2789
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002790 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002791 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002792 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 -06002793 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002794 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2795 "unrecognized enumerator");
2796 return false;
2797 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002798
2799 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2800 (data->physical_device_features.fillModeNonSolid == false)) {
2801 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002802 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 -06002803 DEVICE_FEATURE, LayerName,
2804 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2805 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2806 return false;
2807 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002808 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002809
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002810 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002811 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002812 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2813 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002814 pCreateInfos[i].pStages[j].pName);
2815 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002816 }
2817
2818 return true;
2819}
2820
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002821VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2822 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2823 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002824 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002825 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002826 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2827 assert(device_data != nullptr);
2828 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002829
Chris Forbes04b61da2016-11-03 09:53:59 +13002830 skip |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
Dustin Gravesc900f572016-05-16 11:07:59 -06002831 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002832
Dustin Gravesc900f572016-05-16 11:07:59 -06002833 if (pCreateInfos != nullptr) {
2834 for (uint32_t i = 0; i < createInfoCount; ++i) {
2835 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2836 if (pCreateInfos[i].pTessellationState == nullptr) {
2837 if (pCreateInfos[i].pStages != nullptr) {
2838 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2839 // pTessellationState must not be NULL
2840 bool has_control = false;
2841 bool has_eval = false;
2842
2843 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2844 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2845 has_control = true;
2846 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2847 has_eval = true;
2848 }
2849 }
2850
2851 if (has_control && has_eval) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002852 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 -06002853 __LINE__, REQUIRED_PARAMETER, LayerName,
2854 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2855 "control shader stage and a tessellation evaluation shader stage, "
2856 "pCreateInfos[%d].pTessellationState must not be NULL",
2857 i, i);
2858 }
2859 }
Dustin Graves629259b2016-05-30 16:14:27 -06002860 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002861 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002862 report_data, "vkCreateGraphicsPipelines",
2863 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2864 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002865
Chris Forbes04b61da2016-11-03 09:53:59 +13002866 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002867 report_data, "vkCreateGraphicsPipelines",
2868 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2869 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002870
2871 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002872 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 -06002873 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2874 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2875 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2876 i);
2877 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002878 }
2879
2880 if (pCreateInfos[i].pViewportState == nullptr) {
2881 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2882 // valid VkPipelineViewportStateCreateInfo structure
2883 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2884 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002885 skip |= log_msg(
Dustin Gravesc900f572016-05-16 11:07:59 -06002886 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2887 REQUIRED_PARAMETER, LayerName,
2888 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2889 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2890 i, i);
2891 }
2892 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002893 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002894 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2895 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2896 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002897
Chris Forbes04b61da2016-11-03 09:53:59 +13002898 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002899 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2900 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002901 pCreateInfos[i].pViewportState->flags);
2902
Dustin Gravesc900f572016-05-16 11:07:59 -06002903 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002904 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 -06002905 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2906 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2907 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2908 i);
2909 }
2910
2911 if (pCreateInfos[i].pDynamicState != nullptr) {
2912 bool has_dynamic_viewport = false;
2913 bool has_dynamic_scissor = false;
2914
2915 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2916 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2917 has_dynamic_viewport = true;
2918 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2919 has_dynamic_scissor = true;
2920 }
2921 }
2922
2923 // viewportCount must be greater than 0
2924 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2925 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002926 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 -06002927 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002928 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2929 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002930 "must be greater than 0",
2931 i, i);
2932 }
2933
2934 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2935 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2936 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002937 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002938 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2939 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002940 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002941 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2942 i, i);
2943 }
2944
2945 // scissorCount must be greater than 0
2946 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2947 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002948 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 -06002949 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002950 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2951 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002952 "must be greater than 0",
2953 i, i);
2954 }
2955
2956 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2957 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2958 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002959 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002960 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2961 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002962 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002963 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2964 i, i);
2965 }
2966 }
2967 }
2968
2969 if (pCreateInfos[i].pMultisampleState == nullptr) {
2970 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2971 // a valid VkPipelineMultisampleStateCreateInfo structure
2972 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2973 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002974 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002975 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2976 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2977 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2978 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2979 i, i);
2980 }
Dustin Graves629259b2016-05-30 16:14:27 -06002981 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002982 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002983 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2984 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002985 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002986
Chris Forbes04b61da2016-11-03 09:53:59 +13002987 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002988 report_data, "vkCreateGraphicsPipelines",
2989 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
2990 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002991
Chris Forbes04b61da2016-11-03 09:53:59 +13002992 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002993 report_data, "vkCreateGraphicsPipelines",
2994 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
2995 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06002996
Chris Forbes04b61da2016-11-03 09:53:59 +13002997 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002998 report_data, "vkCreateGraphicsPipelines",
2999 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3000 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3001 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3002 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003003
Chris Forbes04b61da2016-11-03 09:53:59 +13003004 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003005 report_data, "vkCreateGraphicsPipelines",
3006 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3007 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
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->alphaToOneEnable", ParameterName::IndexVector{i}),
3012 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003013
3014 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003015 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 -06003016 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3017 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3018 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3019 i);
3020 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003021 }
3022
3023 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003024 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003025 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003026 report_data, "vkCreateGraphicsPipelines",
3027 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3028 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003029
Chris Forbes04b61da2016-11-03 09:53:59 +13003030 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003031 report_data, "vkCreateGraphicsPipelines",
3032 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3033 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003034
Chris Forbes04b61da2016-11-03 09:53:59 +13003035 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003036 report_data, "vkCreateGraphicsPipelines",
3037 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3038 pCreateInfos[i].pDepthStencilState->depthTestEnable);
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->depthWriteEnable", ParameterName::IndexVector{i}),
3043 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003044
Chris Forbes04b61da2016-11-03 09:53:59 +13003045 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003046 report_data, "vkCreateGraphicsPipelines",
3047 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3048 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3049 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003050
Chris Forbes04b61da2016-11-03 09:53:59 +13003051 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003052 report_data, "vkCreateGraphicsPipelines",
3053 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3054 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
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->stencilTestEnable", ParameterName::IndexVector{i}),
3059 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003060
Chris Forbes04b61da2016-11-03 09:53:59 +13003061 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003062 report_data, "vkCreateGraphicsPipelines",
3063 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3064 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3065 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003066
Chris Forbes04b61da2016-11-03 09:53:59 +13003067 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003068 report_data, "vkCreateGraphicsPipelines",
3069 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3070 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3071 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003072
Chris Forbes04b61da2016-11-03 09:53:59 +13003073 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003074 report_data, "vkCreateGraphicsPipelines",
3075 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3076 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3077 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003078
Chris Forbes04b61da2016-11-03 09:53:59 +13003079 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003080 report_data, "vkCreateGraphicsPipelines",
3081 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3082 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3083 pCreateInfos[i].pDepthStencilState->front.compareOp);
3084
Chris Forbes04b61da2016-11-03 09:53:59 +13003085 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003086 report_data, "vkCreateGraphicsPipelines",
3087 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003088 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
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.passOp", 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.passOp);
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.depthFailOp", ParameterName::IndexVector{i}),
3098 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3099 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003100
Chris Forbes04b61da2016-11-03 09:53:59 +13003101 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003102 report_data, "vkCreateGraphicsPipelines",
3103 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3104 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3105 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003106
3107 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003108 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 -06003109 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3110 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3111 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3112 i);
3113 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003114 }
3115
3116 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3117 if (pCreateInfos[i].pColorBlendState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003118 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003119 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3120 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3121 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003122
Chris Forbes04b61da2016-11-03 09:53:59 +13003123 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003124 report_data, "vkCreateGraphicsPipelines",
3125 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3126 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003127
Chris Forbes04b61da2016-11-03 09:53:59 +13003128 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003129 report_data, "vkCreateGraphicsPipelines",
3130 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3131 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003132
Chris Forbes04b61da2016-11-03 09:53:59 +13003133 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003134 report_data, "vkCreateGraphicsPipelines",
3135 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3136 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3137 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003138
3139 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3140 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3141 ++attachmentIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003142 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003143 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3144 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3145 ParameterName::IndexVector{i, attachmentIndex}),
3146 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003147
Chris Forbes04b61da2016-11-03 09:53:59 +13003148 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003149 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003150 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3151 ParameterName::IndexVector{i, attachmentIndex}),
3152 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003153 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3154
Chris Forbes04b61da2016-11-03 09:53:59 +13003155 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003156 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003157 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3158 ParameterName::IndexVector{i, attachmentIndex}),
3159 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003160 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3161
Chris Forbes04b61da2016-11-03 09:53:59 +13003162 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003163 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3164 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3165 ParameterName::IndexVector{i, attachmentIndex}),
3166 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3167 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003168
Chris Forbes04b61da2016-11-03 09:53:59 +13003169 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003170 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003171 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3172 ParameterName::IndexVector{i, attachmentIndex}),
3173 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003174 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3175
Chris Forbes04b61da2016-11-03 09:53:59 +13003176 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003177 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003178 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3179 ParameterName::IndexVector{i, attachmentIndex}),
3180 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003181 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3182
Chris Forbes04b61da2016-11-03 09:53:59 +13003183 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003184 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3185 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3186 ParameterName::IndexVector{i, attachmentIndex}),
3187 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3188 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003189
Chris Forbes04b61da2016-11-03 09:53:59 +13003190 skip |=
Dustin Graves629259b2016-05-30 16:14:27 -06003191 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003192 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3193 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003194 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3195 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3196 }
3197 }
3198
Dustin Gravesc900f572016-05-16 11:07:59 -06003199 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003200 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 -06003201 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3202 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3203 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3204 i);
3205 }
3206
3207 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3208 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003209 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003210 report_data, "vkCreateGraphicsPipelines",
3211 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003212 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3213 }
3214 }
3215 }
3216 }
3217
Chris Forbes04b61da2016-11-03 09:53:59 +13003218 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003219 PreCreateGraphicsPipelines(device, pCreateInfos);
3220
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003221 result = get_dispatch_table(pc_device_table_map, device)
3222 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003223
Dustin Gravesc900f572016-05-16 11:07:59 -06003224 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003225 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003226
3227 return result;
3228}
3229
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003230bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003231 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3232
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003233 if (pCreateInfos != nullptr) {
3234 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003235 uint32_t i = 0;
3236 validate_string(data->report_data, "vkCreateComputePipelines",
3237 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003238 }
3239
3240 return true;
3241}
3242
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003243VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3244 const VkComputePipelineCreateInfo *pCreateInfos,
3245 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003246 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003247 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003248 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003249 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003250
Chris Forbes04b61da2016-11-03 09:53:59 +13003251 skip |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003252 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003253
Chris Forbes04b61da2016-11-03 09:53:59 +13003254 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003255 PreCreateComputePipelines(device, pCreateInfos);
3256
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003257 result = get_dispatch_table(pc_device_table_map, device)
3258 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003259
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003260 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003261 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003262
3263 return result;
3264}
3265
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003266VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003267 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003268 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003269 assert(my_data != NULL);
3270
Chris Forbes04b61da2016-11-03 09:53:59 +13003271 skip |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003272
Chris Forbes04b61da2016-11-03 09:53:59 +13003273 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003274 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003275 }
3276}
3277
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003278VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3279 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003280 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003281 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003282 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003283 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003284
Chris Forbes04b61da2016-11-03 09:53:59 +13003285 skip |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003286
Chris Forbes04b61da2016-11-03 09:53:59 +13003287 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003288 result =
3289 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003290
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003291 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003292 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003293
3294 return result;
3295}
3296
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003297VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3298 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003299 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003300 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003301 assert(my_data != NULL);
3302
Chris Forbes04b61da2016-11-03 09:53:59 +13003303 skip |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003304
Chris Forbes04b61da2016-11-03 09:53:59 +13003305 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003306 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003307 }
3308}
3309
Chia-I Wu01ca2372016-05-13 14:37:49 +08003310VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3311 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003312 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003313 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003314 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3315 assert(device_data != NULL);
3316 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003317
Chris Forbes04b61da2016-11-03 09:53:59 +13003318 skip |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003319
Dustin Gravesc900f572016-05-16 11:07:59 -06003320 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3321 if (pCreateInfo != nullptr) {
3322 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3323 if (pCreateInfo->compareEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003324 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003325 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3326 }
3327
3328 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3329 // valid VkBorderColor value
3330 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3331 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3332 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003333 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
Dustin Gravesc900f572016-05-16 11:07:59 -06003334 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3335 }
3336 }
3337
Chris Forbes04b61da2016-11-03 09:53:59 +13003338 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003339 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3340
Dustin Gravesc900f572016-05-16 11:07:59 -06003341 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003342 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003343
3344 return result;
3345}
3346
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003347VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003348 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003349 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003350 assert(my_data != NULL);
3351
Chris Forbes04b61da2016-11-03 09:53:59 +13003352 skip |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003353
Chris Forbes04b61da2016-11-03 09:53:59 +13003354 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003355 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003356 }
3357}
3358
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003359VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3360 const VkAllocationCallbacks *pAllocator,
3361 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003362 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003363 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003364 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3365 assert(device_data != nullptr);
3366 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003367
Chris Forbes04b61da2016-11-03 09:53:59 +13003368 skip |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003369
Dustin Gravesc900f572016-05-16 11:07:59 -06003370 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3371 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3372 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3373 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3374 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3375 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3376 // valid VkSampler handles
3377 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3378 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3379 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3380 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3381 ++descriptor_index) {
3382 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003383 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003384 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3385 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3386 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3387 " specified as VK_NULL_HANDLE",
3388 i, descriptor_index);
3389 }
3390 }
3391 }
3392
3393 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3394 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3395 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003396 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003397 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3398 UNRECOGNIZED_VALUE, LayerName,
3399 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3400 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3401 i, i);
3402 }
3403 }
3404 }
3405 }
3406
Chris Forbes04b61da2016-11-03 09:53:59 +13003407 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003408 result =
3409 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003410
Dustin Gravesc900f572016-05-16 11:07:59 -06003411 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003412 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003413
3414 return result;
3415}
3416
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003417VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3418 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003419 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003420 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003421 assert(my_data != NULL);
3422
Chris Forbes04b61da2016-11-03 09:53:59 +13003423 skip |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003424
Chris Forbes04b61da2016-11-03 09:53:59 +13003425 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003426 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003427 }
3428}
3429
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003430VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3431 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003432 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003433 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003434 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003435 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003436
Chris Forbes04b61da2016-11-03 09:53:59 +13003437 skip |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003438
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003439 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3440
Chris Forbes04b61da2016-11-03 09:53:59 +13003441 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003442 result =
3443 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003444
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003445 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003446 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003447
3448 return result;
3449}
3450
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003451VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3452 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003453 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003454 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003455 assert(my_data != NULL);
3456
Chris Forbes04b61da2016-11-03 09:53:59 +13003457 skip |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003458
Chris Forbes04b61da2016-11-03 09:53:59 +13003459 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003460 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003461 }
3462}
3463
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003464VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3465 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003466 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003467 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003468 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3469 assert(my_data != NULL);
3470
Chris Forbes04b61da2016-11-03 09:53:59 +13003471 skip |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003472
Chris Forbes04b61da2016-11-03 09:53:59 +13003473 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003474 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3475
3476 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3477 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003478
3479 return result;
3480}
3481
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003482VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3483 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003484 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003485 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003486 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003487 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003488
Chris Forbes04b61da2016-11-03 09:53:59 +13003489 skip |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003490
Chris Forbes04b61da2016-11-03 09:53:59 +13003491 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003492 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3493
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003494 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003495 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003496
3497 return result;
3498}
3499
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003500VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003501 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003502 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003503 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003504 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3505 assert(device_data != nullptr);
3506 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003507
Chris Forbes04b61da2016-11-03 09:53:59 +13003508 skip |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003509
Dustin Gravesc900f572016-05-16 11:07:59 -06003510 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3511 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3512 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003513 skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003514 pDescriptorSets, true, true);
3515
Chris Forbes04b61da2016-11-03 09:53:59 +13003516 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003517 result = get_dispatch_table(pc_device_table_map, device)
3518 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003519
Dustin Gravesc900f572016-05-16 11:07:59 -06003520 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003521 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003522
3523 return result;
3524}
3525
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003526VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3527 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3528 const VkCopyDescriptorSet *pDescriptorCopies) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003529 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003530 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3531 assert(device_data != NULL);
3532 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003533
Chris Forbes04b61da2016-11-03 09:53:59 +13003534 skip |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
Dustin Gravesc900f572016-05-16 11:07:59 -06003535 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003536
Dustin Gravesc900f572016-05-16 11:07:59 -06003537 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3538 if (pDescriptorWrites != NULL) {
3539 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3540 // descriptorCount must be greater than 0
3541 if (pDescriptorWrites[i].descriptorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003542 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003543 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3544 REQUIRED_PARAMETER, LayerName,
3545 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3546 }
3547
3548 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3549 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3550 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3551 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3552 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3553 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3554 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3555 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3556 if (pDescriptorWrites[i].pImageInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003557 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 -06003558 __LINE__, REQUIRED_PARAMETER, LayerName,
3559 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3560 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3561 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3562 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3563 i, i);
3564 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3565 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3566 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3567 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3568 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3569 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003570 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003571 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3572 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003573 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
Chris Forbes04b61da2016-11-03 09:53:59 +13003574 skip |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003575 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3576 ParameterName::IndexVector{i, descriptor_index}),
3577 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003578 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3579 }
3580 }
3581 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3582 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3583 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3584 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3585 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3586 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3587 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3588 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003589 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 -06003590 __LINE__, REQUIRED_PARAMETER, LayerName,
3591 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3592 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3593 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3594 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3595 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003596 } else {
3597 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003598 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003599 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3600 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003601 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3602 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003603 }
3604 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3605 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3606 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3607 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3608 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003609 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 -06003610 __LINE__, REQUIRED_PARAMETER, LayerName,
3611 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3612 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3613 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3614 i, i);
3615 } else {
3616 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3617 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003618 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003619 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3620 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003621 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3622 }
3623 }
3624 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003625
3626 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3627 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3628 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3629 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3630 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3631 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003632 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003633 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003634 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003635 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3636 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3637 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3638 }
3639 }
3640 }
3641 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3642 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3643 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3644 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3645 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3646 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003647 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003648 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003649 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003650 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3651 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3652 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3653 }
3654 }
3655 }
3656 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003657 }
3658 }
3659
Chris Forbes04b61da2016-11-03 09:53:59 +13003660 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003661 get_dispatch_table(pc_device_table_map, device)
3662 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003663 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003664}
3665
Chia-I Wu01ca2372016-05-13 14:37:49 +08003666VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003667 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003668 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003669 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003670 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003671 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003672
Chris Forbes04b61da2016-11-03 09:53:59 +13003673 skip |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003674
Chris Forbes04b61da2016-11-03 09:53:59 +13003675 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003676 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3677
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003678 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003679 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003680
3681 return result;
3682}
3683
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003684VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003685 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003686 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003687 assert(my_data != NULL);
3688
Chris Forbes04b61da2016-11-03 09:53:59 +13003689 skip |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003690
Chris Forbes04b61da2016-11-03 09:53:59 +13003691 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003692 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003693 }
3694}
3695
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003696bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003697 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003698 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3699
3700 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3701 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003702 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 -06003703 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003704 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3705 }
3706 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003707 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003708}
3709
Chia-I Wu01ca2372016-05-13 14:37:49 +08003710VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003711 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003712 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003713 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003714 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003715 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003716
Chris Forbes04b61da2016-11-03 09:53:59 +13003717 skip |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3718 skip |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003719
Chris Forbes04b61da2016-11-03 09:53:59 +13003720 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003721 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3722
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003723 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003724 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003725
3726 return result;
3727}
3728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003729VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003730 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003731 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003732 assert(my_data != NULL);
3733
Chris Forbes04b61da2016-11-03 09:53:59 +13003734 skip |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003735
Chris Forbes04b61da2016-11-03 09:53:59 +13003736 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003737 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003738 }
3739}
3740
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003741VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003742 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003743 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003744 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003745
Chris Forbes04b61da2016-11-03 09:53:59 +13003746 skip |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003747
Chris Forbes04b61da2016-11-03 09:53:59 +13003748 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003749 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003750 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003751}
3752
Chia-I Wu01ca2372016-05-13 14:37:49 +08003753VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003754 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003755 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003756 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003757 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003758 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003759
Chris Forbes04b61da2016-11-03 09:53:59 +13003760 skip |=
Dustin Gravesde628532016-04-21 16:30:17 -06003761 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003762
Chris Forbes04b61da2016-11-03 09:53:59 +13003763 skip |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003764
Chris Forbes04b61da2016-11-03 09:53:59 +13003765 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003766 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3767
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003768 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003769 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003770
3771 return result;
3772}
3773
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003774VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003775 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003776 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003777 assert(my_data != NULL);
3778
Chris Forbes04b61da2016-11-03 09:53:59 +13003779 skip |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003780
Chris Forbes04b61da2016-11-03 09:53:59 +13003781 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003782 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003783 }
3784}
3785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003786VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003787 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003788 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003789 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3790 assert(my_data != NULL);
3791
Chris Forbes04b61da2016-11-03 09:53:59 +13003792 skip |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003793
Chris Forbes04b61da2016-11-03 09:53:59 +13003794 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003795 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3796
3797 validate_result(my_data->report_data, "vkResetCommandPool", result);
3798 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003799
3800 return result;
3801}
3802
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003803VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3804 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003805 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003806 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003807 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003808 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003809
Chris Forbes04b61da2016-11-03 09:53:59 +13003810 skip |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003811
Chris Forbes04b61da2016-11-03 09:53:59 +13003812 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003813 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3814
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003815 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003816 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003817
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003818 return result;
3819}
3820
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003821VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003822 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003823 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003824 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3825 assert(device_data != nullptr);
3826 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003827
Chris Forbes04b61da2016-11-03 09:53:59 +13003828 skip |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003829
Dustin Gravesc900f572016-05-16 11:07:59 -06003830 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3831 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3832 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003833 skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003834 pCommandBuffers, true, true);
3835
Chris Forbes04b61da2016-11-03 09:53:59 +13003836 if (!skip) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003837 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003838 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003839 }
3840}
3841
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003842bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003843 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003844 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3845 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3846
3847 if (pInfo != NULL) {
3848 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003849 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003850 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 -06003851 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003852 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3853 "inheritedQueries.");
3854 }
3855
3856 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3857 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003858 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003859 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 -06003860 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003861 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3862 "valid combination of VkQueryControlFlagBits.",
3863 pInfo->queryFlags);
3864 }
3865 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003866 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003867}
3868
3869VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003870 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003871 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003872 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3873 assert(device_data != nullptr);
3874 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003875
Chris Forbes04b61da2016-11-03 09:53:59 +13003876 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003877
Dustin Gravesc900f572016-05-16 11:07:59 -06003878 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3879 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13003880 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Dustin Gravesc900f572016-05-16 11:07:59 -06003881 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3882 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3883
3884 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003885 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003886 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003887
Chris Forbes04b61da2016-11-03 09:53:59 +13003888 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Dustin Graves629259b2016-05-30 16:14:27 -06003889 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3890
Dustin Gravesc900f572016-05-16 11:07:59 -06003891 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003892 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06003893 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3894
3895 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003896 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Dustin Gravesc900f572016-05-16 11:07:59 -06003897 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3898 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3899 }
3900
Chris Forbes04b61da2016-11-03 09:53:59 +13003901 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003902
Chris Forbes04b61da2016-11-03 09:53:59 +13003903 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003904 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3905
Dustin Gravesc900f572016-05-16 11:07:59 -06003906 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003907 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003908
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003909 return result;
3910}
3911
Chia-I Wu01ca2372016-05-13 14:37:49 +08003912VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003913 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3914 assert(my_data != NULL);
3915
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003916 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003917
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003918 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003919
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003920 return result;
3921}
3922
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003923VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003924 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003925 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3926 assert(my_data != NULL);
3927
Chris Forbes04b61da2016-11-03 09:53:59 +13003928 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003929
Chris Forbes04b61da2016-11-03 09:53:59 +13003930 if (!skip) {
Dustin Graves16d18972016-05-09 17:36:57 -06003931 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3932
3933 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3934 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003935
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003936 return result;
3937}
3938
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003939VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3940 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003941 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003942 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3943 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003944
Chris Forbes04b61da2016-11-03 09:53:59 +13003945 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003946
Chris Forbes04b61da2016-11-03 09:53:59 +13003947 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003948 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3949 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003950}
3951
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003952bool preCmdSetViewport(debug_report_data *report_data, uint32_t viewport_count, const VkViewport *viewports) {
3953 bool skip =
3954 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
3955 return skip;
3956}
3957
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003958VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3959 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003960 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003961 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003962 assert(my_data != NULL);
3963
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003964 skip |= preCmdSetViewport(my_data->report_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003965
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003966 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003967 get_dispatch_table(pc_device_table_map, commandBuffer)
3968 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003969 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003970}
3971
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003972VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3973 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003974 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003975 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003976 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06003977 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07003978
Chris Forbes04b61da2016-11-03 09:53:59 +13003979 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003980
Mike Weiblena4742dc2016-10-31 11:05:56 -06003981 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
3982 const VkRect2D &pScissor = pScissors[scissorIndex];
3983
3984 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003985 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 -06003986 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
3987 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
3988 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003989 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 -06003990 VALIDATION_ERROR_01490, LayerName,
3991 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
3992 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
3993 }
3994
3995 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003996 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 -06003997 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
3998 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
3999 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004000 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 -06004001 VALIDATION_ERROR_01491, LayerName,
4002 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4003 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4004 }
4005 }
4006
Chris Forbes04b61da2016-11-03 09:53:59 +13004007 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004008 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4009 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004010}
4011
Chia-I Wu01ca2372016-05-13 14:37:49 +08004012VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004013 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004014}
4015
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004016VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4017 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004018 get_dispatch_table(pc_device_table_map, commandBuffer)
4019 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004020}
4021
Chia-I Wu01ca2372016-05-13 14:37:49 +08004022VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004023 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004024 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004025 assert(my_data != NULL);
4026
Chris Forbes04b61da2016-11-03 09:53:59 +13004027 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004028
Chris Forbes04b61da2016-11-03 09:53:59 +13004029 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004030 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4031 }
Cody Northrop12365112015-08-17 11:10:49 -06004032}
4033
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004034VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004035 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004036}
4037
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004038VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4039 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004040 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004041 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4042 assert(my_data != NULL);
4043
Chris Forbes04b61da2016-11-03 09:53:59 +13004044 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004045
Chris Forbes04b61da2016-11-03 09:53:59 +13004046 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004047 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4048 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004049}
4050
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004051VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004052 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004053 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4054 assert(my_data != NULL);
4055
Chris Forbes04b61da2016-11-03 09:53:59 +13004056 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004057
Chris Forbes04b61da2016-11-03 09:53:59 +13004058 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004059 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4060 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004061}
4062
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004063VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004064 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004065 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4066 assert(my_data != NULL);
4067
Chris Forbes04b61da2016-11-03 09:53:59 +13004068 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004069
Chris Forbes04b61da2016-11-03 09:53:59 +13004070 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004071 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4072 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004073}
4074
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004075VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4076 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4077 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4078 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004079 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004080 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004081 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004082
Chris Forbes04b61da2016-11-03 09:53:59 +13004083 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004084 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4085 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004086
Chris Forbes04b61da2016-11-03 09:53:59 +13004087 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004088 get_dispatch_table(pc_device_table_map, commandBuffer)
4089 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4090 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004091 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004092}
4093
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004094VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4095 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004096 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004097 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4098 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004099
Chris Forbes04b61da2016-11-03 09:53:59 +13004100 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004101
Chris Forbes04b61da2016-11-03 09:53:59 +13004102 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004103 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4104 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004105}
4106
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004107VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4108 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004109 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004110 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004111 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004112
Chris Forbes04b61da2016-11-03 09:53:59 +13004113 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004114
Chris Forbes04b61da2016-11-03 09:53:59 +13004115 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004116 get_dispatch_table(pc_device_table_map, commandBuffer)
4117 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004118 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004119}
4120
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004121bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4122 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004123 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004124 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004125 // 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 -07004126 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004127 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 -06004128 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004129 return false;
4130 }
4131
4132 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004133 // 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 -07004134 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004135 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 -06004136 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004137 return false;
4138 }
4139
4140 return true;
4141}
4142
Chia-I Wu01ca2372016-05-13 14:37:49 +08004143VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4144 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004145 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004146
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004147 get_dispatch_table(pc_device_table_map, commandBuffer)
4148 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004149}
4150
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004151VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4152 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004153 get_dispatch_table(pc_device_table_map, commandBuffer)
4154 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004155}
4156
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004157VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4158 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004159 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004160 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4161 assert(my_data != NULL);
4162
Chris Forbes04b61da2016-11-03 09:53:59 +13004163 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004164
Chris Forbes04b61da2016-11-03 09:53:59 +13004165 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004166 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4167 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004168}
4169
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004170VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4171 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004172 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004173 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4174 assert(my_data != NULL);
4175
Chris Forbes04b61da2016-11-03 09:53:59 +13004176 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004177
Chris Forbes04b61da2016-11-03 09:53:59 +13004178 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004179 get_dispatch_table(pc_device_table_map, commandBuffer)
4180 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4181 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004182}
4183
Chia-I Wu01ca2372016-05-13 14:37:49 +08004184VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004185 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004186}
4187
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004188VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004189 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004190 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4191 assert(my_data != NULL);
4192
Chris Forbes04b61da2016-11-03 09:53:59 +13004193 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004194
Chris Forbes04b61da2016-11-03 09:53:59 +13004195 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004196 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4197 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004198}
4199
Chia-I Wu01ca2372016-05-13 14:37:49 +08004200VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4201 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004202 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004203 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004204 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004205
Chris Forbes04b61da2016-11-03 09:53:59 +13004206 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004207
Chris Forbes04b61da2016-11-03 09:53:59 +13004208 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004209 get_dispatch_table(pc_device_table_map, commandBuffer)
4210 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004211 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004212}
4213
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004214bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004215 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004216 if (pRegions != nullptr) {
4217 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4218 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004219 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 -06004220 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004221 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4222 return false;
4223 }
4224 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4225 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004226 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 -06004227 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004228 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4229 return false;
4230 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004231 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004232
4233 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004234}
4235
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004236VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4237 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4238 const VkImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004239 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004240 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004241 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004242
Chris Forbes04b61da2016-11-03 09:53:59 +13004243 skip |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004244 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004245
Chris Forbes04b61da2016-11-03 09:53:59 +13004246 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004247 PreCmdCopyImage(commandBuffer, pRegions);
4248
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004249 get_dispatch_table(pc_device_table_map, commandBuffer)
4250 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004251 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004252}
4253
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004254bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004255 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004256 if (pRegions != nullptr) {
4257 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4258 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004259 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 -06004260 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004261 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4262 return false;
4263 }
4264 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4265 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004266 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 -06004267 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004268 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4269 return false;
4270 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004271 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004272
4273 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004274}
4275
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004276VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4277 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4278 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004279 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004280 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004281 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004282
Chris Forbes04b61da2016-11-03 09:53:59 +13004283 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004284 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004285
Chris Forbes04b61da2016-11-03 09:53:59 +13004286 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004287 PreCmdBlitImage(commandBuffer, pRegions);
4288
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004289 get_dispatch_table(pc_device_table_map, commandBuffer)
4290 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004291 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004292}
4293
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004294bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004295 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004296 if (pRegions != nullptr) {
4297 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4298 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004299 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004300 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004301 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4302 "enumerator");
4303 return false;
4304 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004305 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004306
4307 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004308}
4309
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004310VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4311 VkImageLayout dstImageLayout, uint32_t regionCount,
4312 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004313 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004314 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004315 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004316
Chris Forbes04b61da2016-11-03 09:53:59 +13004317 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004318 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004319
Chris Forbes04b61da2016-11-03 09:53:59 +13004320 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004321 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4322
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004323 get_dispatch_table(pc_device_table_map, commandBuffer)
4324 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004325 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004326}
4327
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004328bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004329 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004330 if (pRegions != nullptr) {
4331 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4332 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004333 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 -06004334 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004335 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4336 "enumerator");
4337 return false;
4338 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004339 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004340
4341 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004342}
4343
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004344VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4345 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004346 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004347 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004348 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004349
Chris Forbes04b61da2016-11-03 09:53:59 +13004350 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004351 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004352
Chris Forbes04b61da2016-11-03 09:53:59 +13004353 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004354 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4355
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004356 get_dispatch_table(pc_device_table_map, commandBuffer)
4357 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004358 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004359}
4360
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004361VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4362 VkDeviceSize dataSize, const uint32_t *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004363 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004364 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004365 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004366
Chris Forbes04b61da2016-11-03 09:53:59 +13004367 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004368
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004369 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004370 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004371 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4372 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004373 }
4374
4375 if ((dataSize <= 0) || (dataSize > 65536)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004376 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004377 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4378 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004379 dataSize);
4380 } else if (dataSize & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004381 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004382 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4383 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004384 }
4385
Chris Forbes04b61da2016-11-03 09:53:59 +13004386 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004387 get_dispatch_table(pc_device_table_map, commandBuffer)
4388 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004389 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004390}
4391
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004392VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4393 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004394 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004395 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4396 assert(my_data != NULL);
4397
Chris Forbes04b61da2016-11-03 09:53:59 +13004398 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004399
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004400 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004401 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004402 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4403 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004404 }
4405
4406 if (size != VK_WHOLE_SIZE) {
4407 if (size <= 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004408 skip |= log_msg(
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004409 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004410 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004411 } else if (size & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004412 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004413 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004414 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4415 }
4416 }
4417
Chris Forbes04b61da2016-11-03 09:53:59 +13004418 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004419 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4420 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004421}
4422
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004423VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4424 const VkClearColorValue *pColor, uint32_t rangeCount,
4425 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004426 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004427 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004428 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004429
Chris Forbes04b61da2016-11-03 09:53:59 +13004430 skip |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004431
Chris Forbes04b61da2016-11-03 09:53:59 +13004432 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004433 get_dispatch_table(pc_device_table_map, commandBuffer)
4434 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004435 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004436}
4437
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004438VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4439 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4440 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004441 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004442 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004443 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004444
Chris Forbes04b61da2016-11-03 09:53:59 +13004445 skip |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004446 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004447
Chris Forbes04b61da2016-11-03 09:53:59 +13004448 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004449 get_dispatch_table(pc_device_table_map, commandBuffer)
4450 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004451 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004452}
4453
Chia-I Wu01ca2372016-05-13 14:37:49 +08004454VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4455 const VkClearAttachment *pAttachments, uint32_t rectCount,
4456 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004457 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004458 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004459 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004460
Chris Forbes04b61da2016-11-03 09:53:59 +13004461 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004462
Chris Forbes04b61da2016-11-03 09:53:59 +13004463 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004464 get_dispatch_table(pc_device_table_map, commandBuffer)
4465 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004466 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004467}
4468
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004469bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004470 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004471 if (pRegions != nullptr) {
4472 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4473 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4474 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004475 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 -06004476 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004477 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4478 return false;
4479 }
4480 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4481 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4482 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004483 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 -06004484 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004485 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4486 return false;
4487 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004488 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004489
4490 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004491}
4492
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004493VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4494 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4495 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004496 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004497 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004498 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004499
Chris Forbes04b61da2016-11-03 09:53:59 +13004500 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004501 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004502
Chris Forbes04b61da2016-11-03 09:53:59 +13004503 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004504 PreCmdResolveImage(commandBuffer, pRegions);
4505
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004506 get_dispatch_table(pc_device_table_map, commandBuffer)
4507 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004508 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004509}
4510
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004511VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004512 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004513 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4514 assert(my_data != NULL);
4515
Chris Forbes04b61da2016-11-03 09:53:59 +13004516 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004517
Chris Forbes04b61da2016-11-03 09:53:59 +13004518 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004519 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4520 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004521}
4522
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004523VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004524 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004525 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4526 assert(my_data != NULL);
4527
Chris Forbes04b61da2016-11-03 09:53:59 +13004528 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004529
Chris Forbes04b61da2016-11-03 09:53:59 +13004530 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004531 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4532 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004533}
4534
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004535VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4536 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4537 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4538 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4539 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004540 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004541 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004542 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004543
Chris Forbes04b61da2016-11-03 09:53:59 +13004544 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004545 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4546 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004547
Chris Forbes04b61da2016-11-03 09:53:59 +13004548 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004549 get_dispatch_table(pc_device_table_map, commandBuffer)
4550 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4551 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004552 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004553}
4554
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004555VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4556 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4557 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4558 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4559 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004560 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004561 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004562 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004563
Chris Forbes04b61da2016-11-03 09:53:59 +13004564 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004565 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4566 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004567
Chris Forbes04b61da2016-11-03 09:53:59 +13004568 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004569 get_dispatch_table(pc_device_table_map, commandBuffer)
4570 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4571 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004572 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004573}
4574
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004575VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4576 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004577 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004578 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4579 assert(my_data != NULL);
4580
Chris Forbes04b61da2016-11-03 09:53:59 +13004581 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004582
Chris Forbes04b61da2016-11-03 09:53:59 +13004583 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004584 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4585 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004586}
4587
Chia-I Wu01ca2372016-05-13 14:37:49 +08004588VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004589 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004590 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4591 assert(my_data != NULL);
4592
Chris Forbes04b61da2016-11-03 09:53:59 +13004593 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004594
Chris Forbes04b61da2016-11-03 09:53:59 +13004595 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004596 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4597 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004598}
4599
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004600VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4601 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004602 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004603 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4604 assert(my_data != NULL);
4605
Chris Forbes04b61da2016-11-03 09:53:59 +13004606 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004607
Chris Forbes04b61da2016-11-03 09:53:59 +13004608 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004609 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4610 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004611}
4612
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004613bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4614 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004615
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004616 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004617
4618 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004619}
4620
Chia-I Wu01ca2372016-05-13 14:37:49 +08004621VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4622 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004623 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004624 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4625 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004626
Chris Forbes04b61da2016-11-03 09:53:59 +13004627 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004628
Chris Forbes04b61da2016-11-03 09:53:59 +13004629 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004630 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4631
4632 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4633 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004634}
4635
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004636VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4637 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4638 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004639 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004640 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4641 assert(my_data != NULL);
4642
Chris Forbes04b61da2016-11-03 09:53:59 +13004643 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004644 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004645
Chris Forbes04b61da2016-11-03 09:53:59 +13004646 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004647 get_dispatch_table(pc_device_table_map, commandBuffer)
4648 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4649 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004650}
4651
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004652VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4653 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004654 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004655 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004656 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004657
Chris Forbes04b61da2016-11-03 09:53:59 +13004658 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004659
Chris Forbes04b61da2016-11-03 09:53:59 +13004660 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004661 get_dispatch_table(pc_device_table_map, commandBuffer)
4662 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004663 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004664}
4665
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004666VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4667 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004668 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004669 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004670 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004671
Chris Forbes04b61da2016-11-03 09:53:59 +13004672 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004673
Chris Forbes04b61da2016-11-03 09:53:59 +13004674 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004675 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004676 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004677}
4678
Chia-I Wu01ca2372016-05-13 14:37:49 +08004679VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004680 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004681 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4682 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004683
Chris Forbes04b61da2016-11-03 09:53:59 +13004684 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004685
Chris Forbes04b61da2016-11-03 09:53:59 +13004686 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004687 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4688 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004689}
4690
Chia-I Wu01ca2372016-05-13 14:37:49 +08004691VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004692 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004693}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004694
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004695VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4696 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004697 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004698 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004699 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004700
Chris Forbes04b61da2016-11-03 09:53:59 +13004701 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004702
Chris Forbes04b61da2016-11-03 09:53:59 +13004703 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004704 get_dispatch_table(pc_device_table_map, commandBuffer)
4705 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004706 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004707}
4708
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004709VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004710 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4711}
4712
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004713VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4714 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004715 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4716}
4717
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004718VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4719 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004720 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4721 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4722
4723 return VK_ERROR_LAYER_NOT_PRESENT;
4724}
4725
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004726VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4727 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004728 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004729 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004730 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004731
4732 assert(physicalDevice);
4733
4734 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4735 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004736}
4737
Chris Forbes448ebcb2016-11-03 09:29:52 +13004738bool require_device_extension(layer_data *my_data, bool layer_data::*flag, char const *function_name, char const *extension_name)
4739{
4740 if (!(my_data->*flag)) {
4741 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4742 __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4743 "%s() called even though the %s extension was not enabled for this VkDevice.",
4744 function_name, extension_name);
4745 }
4746
4747 return false;
4748}
4749
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004750// WSI Extension Functions
4751
4752VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004753 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004754 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004755 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004756 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4757 assert(my_data != NULL);
4758
Chris Forbes04b61da2016-11-03 09:53:59 +13004759 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkCreateSwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004760
Chris Forbes04b61da2016-11-03 09:53:59 +13004761 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004762
Chris Forbes04b61da2016-11-03 09:53:59 +13004763 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004764 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4765
4766 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4767 }
4768
4769 return result;
4770}
4771
4772VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004773 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004774 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004775 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004776 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4777 assert(my_data != NULL);
4778
Chris Forbes04b61da2016-11-03 09:53:59 +13004779 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkGetSwapchainImagesKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004780
Chris Forbes04b61da2016-11-03 09:53:59 +13004781 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004782 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4783
Chris Forbes04b61da2016-11-03 09:53:59 +13004784 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004785 result = get_dispatch_table(pc_device_table_map, device)
4786 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4787
4788 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4789 }
4790
4791 return result;
4792}
4793
4794VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004795 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004796 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004797 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004798 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4799 assert(my_data != NULL);
4800
Chris Forbes04b61da2016-11-03 09:53:59 +13004801 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkAcquireNextImageKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004802
Chris Forbes04b61da2016-11-03 09:53:59 +13004803 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004804 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4805
Chris Forbes04b61da2016-11-03 09:53:59 +13004806 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004807 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004808 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004809
4810 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4811 }
4812
4813 return result;
4814}
4815
4816VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4817 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004818 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004819 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4820 assert(my_data != NULL);
4821
Chris Forbes04b61da2016-11-03 09:53:59 +13004822 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkQueuePresentKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004823
Chris Forbes04b61da2016-11-03 09:53:59 +13004824 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004825
Chris Forbes04b61da2016-11-03 09:53:59 +13004826 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004827 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4828
4829 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4830 }
4831
4832 return result;
4833}
4834
Chris Forbesbe5f5202016-11-02 18:34:25 +13004835VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004836 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13004837 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4838 assert(my_data != NULL);
4839
Chris Forbes04b61da2016-11-03 09:53:59 +13004840 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkDestroySwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004841
4842 /* No generated validation function for this call */
4843
Chris Forbes04b61da2016-11-03 09:53:59 +13004844 if (!skip) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13004845 get_dispatch_table(pc_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
4846 }
4847}
4848
Chris Forbes115f98c2016-11-03 09:51:48 +13004849bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name, char const *extension_name)
4850{
4851 if (!(instance_extension_map[get_dispatch_table(pc_instance_table_map, instance)].*flag)) {
4852 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4853 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
4854 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4855 "%s() called even though the %s extension was not enabled for this VkInstance.",
4856 function_name, extension_name);
4857 }
4858
4859 return false;
4860}
4861
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004862VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4863 VkSurfaceKHR surface, VkBool32 *pSupported) {
4864 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004865 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004866 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4867 assert(my_data != NULL);
4868
Chris Forbes04b61da2016-11-03 09:53:59 +13004869 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004870 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004871
Chris Forbes04b61da2016-11-03 09:53:59 +13004872 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004873 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4874
Chris Forbes04b61da2016-11-03 09:53:59 +13004875 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004876 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4877 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4878
4879 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4880 }
4881
4882 return result;
4883}
4884
4885VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4886 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4887 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004888 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004889 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4890 assert(my_data != NULL);
4891
Chris Forbes04b61da2016-11-03 09:53:59 +13004892 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004893 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004894
Chris Forbes04b61da2016-11-03 09:53:59 +13004895 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004896 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004897
Chris Forbes04b61da2016-11-03 09:53:59 +13004898 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004899 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4900 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4901
4902 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4903 }
4904
4905 return result;
4906}
4907
4908VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4909 uint32_t *pSurfaceFormatCount,
4910 VkSurfaceFormatKHR *pSurfaceFormats) {
4911 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004912 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004913 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4914 assert(my_data != NULL);
4915
Chris Forbes04b61da2016-11-03 09:53:59 +13004916 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004917 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004918
Chris Forbes04b61da2016-11-03 09:53:59 +13004919 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004920 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004921
Chris Forbes04b61da2016-11-03 09:53:59 +13004922 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004923 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4924 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4925
4926 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4927 }
4928
4929 return result;
4930}
4931
4932VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4933 uint32_t *pPresentModeCount,
4934 VkPresentModeKHR *pPresentModes) {
4935 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004936 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004937 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4938 assert(my_data != NULL);
4939
Chris Forbes04b61da2016-11-03 09:53:59 +13004940 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004941 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004942
Chris Forbes04b61da2016-11-03 09:53:59 +13004943 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004944 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004945
Chris Forbes04b61da2016-11-03 09:53:59 +13004946 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004947 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4948 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4949
4950 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4951 }
4952
4953 return result;
4954}
4955
Chris Forbesbe5f5202016-11-02 18:34:25 +13004956VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004957 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13004958 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4959 assert(my_data != NULL);
4960
Chris Forbes04b61da2016-11-03 09:53:59 +13004961 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004962 "vkDestroySurfaceKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004963
Chris Forbes04b61da2016-11-03 09:53:59 +13004964 if (!skip) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13004965 get_dispatch_table(pc_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
4966 }
4967}
4968
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004969#ifdef VK_USE_PLATFORM_WIN32_KHR
4970VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4971 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4972 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4973
4974 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4975 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13004976 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004977
Chris Forbes04b61da2016-11-03 09:53:59 +13004978 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004979 "vkCreateWin32SurfaceKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13004980
Chris Forbes04b61da2016-11-03 09:53:59 +13004981 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004982
Chris Forbes04b61da2016-11-03 09:53:59 +13004983 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004984 result =
4985 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
4986 }
4987
4988 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
4989
4990 return result;
4991}
Chris Forbes9a083b92016-11-02 16:58:15 +13004992
4993VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
4994 uint32_t queueFamilyIndex)
4995{
4996 VkBool32 result = false;
4997
4998 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4999 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005000 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005001
Chris Forbes04b61da2016-11-03 09:53:59 +13005002 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005003 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005004
Chris Forbes04b61da2016-11-03 09:53:59 +13005005 skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005006
Chris Forbes04b61da2016-11-03 09:53:59 +13005007 if (!skip) {
Chris Forbes9a083b92016-11-02 16:58:15 +13005008 result = get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceWin32PresentationSupportKHR(
5009 physicalDevice, queueFamilyIndex);
5010 }
5011
5012 return result;
5013}
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005014#endif // VK_USE_PLATFORM_WIN32_KHR
5015
5016#ifdef VK_USE_PLATFORM_XCB_KHR
5017VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5018 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5019 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5020
5021 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5022 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005023 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005024
Chris Forbes04b61da2016-11-03 09:53:59 +13005025 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005026 "vkCreateXcbSurfaceKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005027
Chris Forbes04b61da2016-11-03 09:53:59 +13005028 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005029
Chris Forbes04b61da2016-11-03 09:53:59 +13005030 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005031 result =
5032 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5033 }
5034
5035 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5036
5037 return result;
5038}
5039
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005040VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5041 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5042 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005043 VkBool32 result = false;
5044
5045 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5046 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005047 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005048
Chris Forbes04b61da2016-11-03 09:53:59 +13005049 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005050 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005051
Chris Forbes04b61da2016-11-03 09:53:59 +13005052 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005053 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005054
Chris Forbes04b61da2016-11-03 09:53:59 +13005055 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005056 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5057 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005058 }
5059
5060 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005061}
5062#endif // VK_USE_PLATFORM_XCB_KHR
5063
5064#ifdef VK_USE_PLATFORM_XLIB_KHR
5065VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005066 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005067 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5068
5069 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5070 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005071 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005072
Chris Forbes04b61da2016-11-03 09:53:59 +13005073 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005074 "vkCreateXlibSurfaceKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005075
Chris Forbes04b61da2016-11-03 09:53:59 +13005076 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005077
Chris Forbes04b61da2016-11-03 09:53:59 +13005078 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005079 result =
5080 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5081 }
5082
5083 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5084
5085 return result;
5086}
5087
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005088VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5089 uint32_t queueFamilyIndex, Display *dpy,
5090 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005091 VkBool32 result = false;
5092
5093 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5094 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005095 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005096
Chris Forbes04b61da2016-11-03 09:53:59 +13005097 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005098 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005099
Chris Forbes04b61da2016-11-03 09:53:59 +13005100 skip |= parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005101
Chris Forbes04b61da2016-11-03 09:53:59 +13005102 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005103 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5104 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005105 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005106 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005107}
5108#endif // VK_USE_PLATFORM_XLIB_KHR
5109
5110#ifdef VK_USE_PLATFORM_MIR_KHR
5111VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005112 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005113 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5114
5115 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5116 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005117 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005118
Chris Forbes04b61da2016-11-03 09:53:59 +13005119 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005120 "vkCreateMirSurfaceKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005121
Chris Forbes04b61da2016-11-03 09:53:59 +13005122 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005123
Chris Forbes04b61da2016-11-03 09:53:59 +13005124 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005125 result =
5126 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5127 }
5128
5129 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5130
5131 return result;
5132}
5133
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005134VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5135 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005136 VkBool32 result = false;
5137
5138 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5139 assert(my_data != NULL);
5140
Chris Forbes04b61da2016-11-03 09:53:59 +13005141 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005142
Chris Forbes04b61da2016-11-03 09:53:59 +13005143 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005144 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5145
Chris Forbes04b61da2016-11-03 09:53:59 +13005146 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005147
Chris Forbes04b61da2016-11-03 09:53:59 +13005148 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005149 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5150 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005151 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005152 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005153}
5154#endif // VK_USE_PLATFORM_MIR_KHR
5155
5156#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5157VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005158 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005159 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5160
5161 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5162 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005163 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005164
Chris Forbes04b61da2016-11-03 09:53:59 +13005165 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005166 "vkCreateWaylandSurfaceKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5167
Chris Forbes04b61da2016-11-03 09:53:59 +13005168 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005169
Chris Forbes04b61da2016-11-03 09:53:59 +13005170 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005171 result = get_dispatch_table(pc_instance_table_map, instance)
5172 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005173 }
5174
5175 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5176
5177 return result;
5178}
5179
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005180VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5181 uint32_t queueFamilyIndex,
5182 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005183 VkBool32 result = false;
5184
5185 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5186 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005187 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005188
Chris Forbes04b61da2016-11-03 09:53:59 +13005189 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005190 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5191
Chris Forbes04b61da2016-11-03 09:53:59 +13005192 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005193 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005194
Chris Forbes04b61da2016-11-03 09:53:59 +13005195 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005196 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5197 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005198 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005199
5200 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005201}
5202#endif // VK_USE_PLATFORM_WAYLAND_KHR
5203
5204#ifdef VK_USE_PLATFORM_ANDROID_KHR
5205VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005206 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005207 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5208
5209 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5210 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005211 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005212
Chris Forbes04b61da2016-11-03 09:53:59 +13005213 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005214 "vkCreateAndroidSurfaceKHR", VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005215
Chris Forbes04b61da2016-11-03 09:53:59 +13005216 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005217
Chris Forbes04b61da2016-11-03 09:53:59 +13005218 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005219 result = get_dispatch_table(pc_instance_table_map, instance)
5220 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005221 }
5222
5223 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5224
5225 return result;
5226}
5227#endif // VK_USE_PLATFORM_ANDROID_KHR
5228
Mark Youngead9b932016-09-08 12:28:38 -06005229VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5230 const VkSwapchainCreateInfoKHR *pCreateInfos,
5231 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5232 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005233 bool skip = false;
Mark Youngead9b932016-09-08 12:28:38 -06005234 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5235 assert(my_data != NULL);
5236
Chris Forbes04b61da2016-11-03 09:53:59 +13005237 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 +13005238
Chris Forbes04b61da2016-11-03 09:53:59 +13005239 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Youngead9b932016-09-08 12:28:38 -06005240 pSwapchains);
5241
Chris Forbes04b61da2016-11-03 09:53:59 +13005242 if (!skip) {
Mark Youngead9b932016-09-08 12:28:38 -06005243 result = get_dispatch_table(pc_device_table_map, device)
5244 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5245
5246 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5247 }
5248
5249 return result;
5250}
5251
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005252// VK_EXT_debug_marker Extension
5253VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5254 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005255 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005256 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5257 assert(my_data != NULL);
5258
Chris Forbes04b61da2016-11-03 09:53:59 +13005259 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005260
Chris Forbes04b61da2016-11-03 09:53:59 +13005261 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005262 result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5263
5264 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5265 }
5266
5267 return result;
5268}
5269
5270VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5271 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005272 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005273 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5274 assert(my_data != NULL);
5275
Chris Forbes04b61da2016-11-03 09:53:59 +13005276 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005277
Chris Forbes04b61da2016-11-03 09:53:59 +13005278 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005279 VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5280
5281 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5282 }
5283
5284 return result;
5285}
5286
5287VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005288 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005289 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5290 assert(my_data != NULL);
5291
Chris Forbes04b61da2016-11-03 09:53:59 +13005292 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005293
Chris Forbes04b61da2016-11-03 09:53:59 +13005294 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005295 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5296 }
5297}
5298
5299VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005300 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005301 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5302 assert(my_data != NULL);
5303
Chris Forbes04b61da2016-11-03 09:53:59 +13005304 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005305
Chris Forbes04b61da2016-11-03 09:53:59 +13005306 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005307 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5308 }
5309}
5310
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005311// VK_NV_external_memory_capabilities Extension
5312VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5313 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5314 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5315 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5316
5317 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005318 bool skip = false;
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005319 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5320 assert(my_data != NULL);
5321
Chris Forbes04b61da2016-11-03 09:53:59 +13005322 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005323 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5324
Chris Forbes04b61da2016-11-03 09:53:59 +13005325 if (!skip) {
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005326 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5327 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
5328 externalHandleType, pExternalImageFormatProperties);
5329
5330 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5331 }
5332
5333 return result;
5334}
5335
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005336#ifdef VK_USE_PLATFORM_WIN32_KHR
5337// VK_NV_external_memory_win32 Extension
5338VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5339 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5340
5341 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005342 bool skip = false;
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005343 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5344 assert(my_data != NULL);
5345
Chris Forbes04b61da2016-11-03 09:53:59 +13005346 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005347
Chris Forbes04b61da2016-11-03 09:53:59 +13005348 if (!skip) {
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005349 result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5350 }
5351
5352 return result;
5353}
5354#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005355
5356
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005357
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005358static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005359
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005360static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005361
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005362static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005363
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005364static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005365
Chia-I Wu01ca2372016-05-13 14:37:49 +08005366VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005367 assert(device);
5368
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005369 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5370
Dustin Graves080069b2016-04-05 13:48:15 -06005371 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005372 return NULL;
5373 }
5374
Chia-I Wuf9b01382016-05-16 07:37:41 +08005375 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5376 if (proc)
5377 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005378
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005379 proc = InterceptWsiEnabledCommand(funcName, device);
5380 if (proc)
5381 return proc;
5382
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005383 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005384 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005385 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005386}
5387
Chia-I Wu01ca2372016-05-13 14:37:49 +08005388VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005389 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005390 if (!proc)
5391 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005392
5393 if (!proc)
5394 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005395
Chia-I Wu617f2a42016-05-16 07:41:17 +08005396 if (proc)
5397 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005398
Chia-I Wu617f2a42016-05-16 07:41:17 +08005399 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005400
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005401 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005402
Chia-I Wu617f2a42016-05-16 07:41:17 +08005403 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005404 if (!proc)
5405 proc = InterceptWsiEnabledCommand(funcName, instance);
5406
Chia-I Wu617f2a42016-05-16 07:41:17 +08005407 if (proc)
5408 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005409
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005410 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005411 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005412 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005413}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005414
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005415static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005416 static const struct {
5417 const char *name;
5418 PFN_vkVoidFunction proc;
5419 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005420 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5421 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5422 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5423 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5424 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5425 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5426 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5427 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5428 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5429 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5430 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5431 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5432 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5433 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5434 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5435 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5436 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005437 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005438 };
5439
5440 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5441 if (!strcmp(core_instance_commands[i].name, name))
5442 return core_instance_commands[i].proc;
5443 }
5444
5445 return nullptr;
5446}
5447
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005448static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005449 static const struct {
5450 const char *name;
5451 PFN_vkVoidFunction proc;
5452 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005453 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5454 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5455 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5456 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5457 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5458 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5459 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5460 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5461 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5462 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5463 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5464 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5465 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5466 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5467 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5468 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5469 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5470 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5471 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5472 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5473 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5474 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5475 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5476 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5477 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5478 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5479 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5480 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5481 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5482 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5483 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5484 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5485 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5486 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5487 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5488 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5489 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5490 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5491 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5492 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5493 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5494 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5495 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5496 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5497 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5498 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5499 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5500 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5501 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5502 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5503 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5504 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5505 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5506 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5507 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5508 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5509 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5510 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5511 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5512 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5513 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5514 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5515 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5516 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5517 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5518 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5519 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5520 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5521 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5522 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5523 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5524 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5525 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5526 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5527 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5528 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5529 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5530 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5531 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5532 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5533 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5534 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5535 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5536 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5537 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5538 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5539 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5540 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5541 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5542 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5543 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5544 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5545 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5546 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5547 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5548 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5549 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5550 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5551 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5552 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5553 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5554 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5555 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5556 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5557 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5558 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5559 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5560 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5561 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5562 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5563 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5564 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5565 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5566 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5567 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5568 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5569 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005570 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5571 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5572 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5573 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005574#ifdef VK_USE_PLATFORM_WIN32_KHR
5575 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5576#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005577};
5578
Chia-I Wuf9b01382016-05-16 07:37:41 +08005579
5580 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5581 if (!strcmp(core_device_commands[i].name, name))
5582 return core_device_commands[i].proc;
5583 }
5584
5585 return nullptr;
5586}
5587
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005588static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005589 static const struct {
5590 const char *name;
5591 PFN_vkVoidFunction proc;
5592 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005593 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5594 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5595 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5596 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005597 {"vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR)},
Chris Forbes64c3c652016-11-03 10:15:31 +13005598 {"vkCreateSharedSwapchainsKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005599 };
5600
5601 if (device) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005602 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5603 if (!strcmp(wsi_device_commands[i].name, name))
5604 return wsi_device_commands[i].proc;
Mark Youngead9b932016-09-08 12:28:38 -06005605 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005606 }
5607
5608 return nullptr;
5609}
5610
5611static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5612 static const struct {
5613 const char *name;
5614 PFN_vkVoidFunction proc;
5615 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005616 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5617 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5618 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5619 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5620 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5621 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005622 {"vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005623 };
5624
Chris Forbes8a13e272016-11-02 17:43:34 +13005625 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5626 if (!strcmp(wsi_instance_commands[i].name, name))
5627 return wsi_instance_commands[i].proc;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005628 }
5629
5630#ifdef VK_USE_PLATFORM_WIN32_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005631 if (!strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005632 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
Chris Forbes9a083b92016-11-02 16:58:15 +13005633 if (!strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name))
5634 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005635#endif // VK_USE_PLATFORM_WIN32_KHR
5636#ifdef VK_USE_PLATFORM_XCB_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005637 if (!strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005638 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Chris Forbes9a083b92016-11-02 16:58:15 +13005639 if (!strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005640 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5641#endif // VK_USE_PLATFORM_XCB_KHR
5642#ifdef VK_USE_PLATFORM_XLIB_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005643 if (!strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005644 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Chris Forbes9a083b92016-11-02 16:58:15 +13005645 if (!strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005646 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5647#endif // VK_USE_PLATFORM_XLIB_KHR
5648#ifdef VK_USE_PLATFORM_MIR_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005649 if (!strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005650 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Chris Forbes9a083b92016-11-02 16:58:15 +13005651 if (!strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005652 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5653#endif // VK_USE_PLATFORM_MIR_KHR
5654#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005655 if (!strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005656 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Chris Forbes9a083b92016-11-02 16:58:15 +13005657 if (!strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005658 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5659#endif // VK_USE_PLATFORM_WAYLAND_KHR
5660#ifdef VK_USE_PLATFORM_ANDROID_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005661 if (!strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005662 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5663#endif // VK_USE_PLATFORM_ANDROID_KHR
5664
5665 return nullptr;
5666}
5667
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005668} // namespace parameter_validation
5669
5670// vk_layer_logging.h expects these to be defined
5671
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005672VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5673 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5674 const VkAllocationCallbacks *pAllocator,
5675 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005676 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005677}
5678
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005679VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5680 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005681 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005682}
5683
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005684VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5685 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5686 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005687 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005688}
5689
5690// loader-layer interface v0
5691
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005692VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5693 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005694 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005695}
5696
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005697VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5698 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005699 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005700}
5701
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005702VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5703 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005704 // the layer command handles VK_NULL_HANDLE just fine internally
5705 assert(physicalDevice == VK_NULL_HANDLE);
5706 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005707}
5708
5709VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5710 const char *pLayerName, uint32_t *pCount,
5711 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005712 // the layer command handles VK_NULL_HANDLE just fine internally
5713 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005714 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005715}
5716
5717VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005718 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005719}
5720
5721VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005722 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005723}