blob: a3c38d64358c4434277bd7e48a091d243cbf3dd0 [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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001208 bool skip_call = 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) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001213 return skip_call;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001214 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001215
1216 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1217 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) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001220 skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1221 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 }
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001224 return skip_call;
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;
1231 bool skip_call = false;
1232
1233 if (index == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001234 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1235 "%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()) {
1239 skip_call |= 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
1247 return skip_call;
1248}
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;
1254 bool skip_call = false;
1255
1256 if (indices != nullptr) {
1257 for (uint32_t i = 0; i < count; i++) {
1258 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001259 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1260 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()) {
1264 skip_call |= 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
1274 return skip_call;
1275}
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);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001357 bool skip_call = 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001370 skip_call |= 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001381 if (!skip_call) {
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;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001403 bool skip_call = 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001407 skip_call |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001408
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001409 if (!skip_call) {
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) {
1427 bool skip_call = 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001431 skip_call |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001432
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001433 if (!skip_call) {
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) {
1440 bool skip_call = 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001444 skip_call |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001445
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001446 if (!skip_call) {
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;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001457 bool skip_call = 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001461 skip_call |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
1462 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001463
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001464 if (!skip_call) {
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) {
1476 bool skip_call = 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001480 skip_call |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001481
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001482 if (!skip_call) {
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) {
1490 bool skip_call = 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001494 skip_call |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1495 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001496
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001497 if (!skip_call) {
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) {
1505 bool skip_call = 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
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001509 skip_call |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001510
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001511 if (!skip_call) {
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
1607 }
1608}
1609
1610static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1611 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes27e49622016-11-02 17:54:21 +13001612 device_data->swapchain_enabled = false;
1613 device_data->display_swapchain_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001614
1615 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1616 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001617 device_data->swapchain_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001618 }
Mark Youngead9b932016-09-08 12:28:38 -06001619 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001620 device_data->display_swapchain_enabled = true;
Mark Youngead9b932016-09-08 12:28:38 -06001621 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001622 }
1623}
1624
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001625void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001626 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001627
1628 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1629 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1630 my_device_data->queueFamilyIndexMap.insert(
1631 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1632 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001633 }
1634}
1635
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001636VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001637 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001638 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001639 * NOTE: We do not validate physicalDevice or any dispatchable
1640 * object as the first parameter. We couldn't get here if it was wrong!
1641 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001642
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001643 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001644 bool skip_call = false;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001645 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001646 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001647
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001648 skip_call |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001649
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001650 if (pCreateInfo != NULL) {
1651 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001652 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001653 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1654 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001655 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001656 }
Michael Lentine774704f2016-01-27 13:36:46 -06001657
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001658 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001659 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001660 skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice",
1661 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001662 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001663 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001664 }
1665
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001666 if (!skip_call) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001667 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001668 assert(chain_info != nullptr);
1669 assert(chain_info->u.pLayerInfo != nullptr);
1670
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001671 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1672 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001673 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001674 if (fpCreateDevice == NULL) {
1675 return VK_ERROR_INITIALIZATION_FAILED;
1676 }
1677
1678 // Advance the link info for the next element on the chain
1679 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1680
1681 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001682
1683 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1684
1685 if (result == VK_SUCCESS) {
1686 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1687 assert(my_device_data != nullptr);
1688
1689 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1690 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1691
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001692 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1693
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001694 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001695 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1696 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001697 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001698 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001699
1700 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1701 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001702
1703 // Query and save physical device limits for this device
1704 VkPhysicalDeviceProperties device_properties = {};
1705 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1706 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001707 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001708
1709 // Save app-enabled features in this device's layer_data structure
1710 if (pCreateInfo->pEnabledFeatures) {
1711 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1712 } else {
1713 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1714 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001715 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001716 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001717
Jeremy Hayes99a96322015-06-26 12:48:09 -06001718 return result;
1719}
1720
Chia-I Wu01ca2372016-05-13 14:37:49 +08001721VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001722 dispatch_key key = get_dispatch_key(device);
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001723 bool skip_call = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001724 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1725 assert(my_data != NULL);
1726
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001727 skip_call |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001728
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001729 if (!skip_call) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001730 layer_debug_report_destroy_device(device);
1731
Jeremy Hayes99a96322015-06-26 12:48:09 -06001732#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001733 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001734#endif
1735
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001736 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001737 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001738 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001739 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001740}
1741
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001742bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001743 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001744 assert(my_device_data != nullptr);
1745
Dustin Gravesde628532016-04-21 16:30:17 -06001746 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001747
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001748 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001749 if (queue_data->second <= queueIndex) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001750 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 -06001751 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001752 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1753 "was created.",
1754 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001755 return false;
1756 }
1757 return true;
1758}
1759
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001760VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1761 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001762 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001763 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001764
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001765 skip_call |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001766
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001767 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001768 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1769
1770 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001771 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001772}
1773
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001774VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001775 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001776 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001777 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001778 assert(my_data != NULL);
1779
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001780 skip_call |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001781
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001782 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001783 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1784
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001785 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001786 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001787
Jeremy Hayes99a96322015-06-26 12:48:09 -06001788 return result;
1789}
1790
Chia-I Wu01ca2372016-05-13 14:37:49 +08001791VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001792 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1793 assert(my_data != NULL);
1794
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001795 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001796
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001797 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001798
1799 return result;
1800}
1801
Chia-I Wu01ca2372016-05-13 14:37:49 +08001802VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001803 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1804 assert(my_data != NULL);
1805
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001806 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001807
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001808 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001809
1810 return result;
1811}
1812
Chia-I Wu01ca2372016-05-13 14:37:49 +08001813VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001814 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001815 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001816 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001817 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001818 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001819
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001820 skip_call |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001821
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001822 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001823 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1824
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001825 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001826 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001827
1828 return result;
1829}
1830
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001831VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
1832 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001833 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001834 assert(my_data != NULL);
1835
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001836 skip_call |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001837
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001838 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001839 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001840 }
1841}
1842
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001843VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1844 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001845 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001846 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001847 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001848 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001849
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001850 skip_call |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001851
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001852 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001853 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1854
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001855 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001856 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001857
1858 return result;
1859}
1860
Chia-I Wu01ca2372016-05-13 14:37:49 +08001861VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001862 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001863 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1864 assert(my_data != NULL);
1865
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001866 skip_call |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001867
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001868 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001869 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1870 }
1871}
1872
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001873VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1874 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001875 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001876 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001877 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001878 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001879
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001880 skip_call |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001881
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001882 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001883 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1884
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001885 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001886 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001887
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001888 return result;
1889}
1890
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001891VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1892 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001893 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001894 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001895 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001896 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001897
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001898 skip_call |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001899
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001900 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001901 result =
1902 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001903
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001904 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001905 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001906
Tony Barbourb1250542015-04-16 19:23:13 -06001907 return result;
1908}
1909
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001910VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1911 VkDeviceSize *pCommittedMemoryInBytes) {
1912 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001913 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001914 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001915
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001916 skip_call |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001917
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001918 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001919 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001920 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001921}
1922
Chia-I Wu01ca2372016-05-13 14:37:49 +08001923VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1924 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001925 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001926 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001927 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1928 assert(my_data != NULL);
1929
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001930 skip_call |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001931
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001932 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001933 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1934
1935 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1936 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001937
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001938 return result;
1939}
1940
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001941VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001942 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001943 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001944 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1945 assert(my_data != NULL);
1946
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001947 skip_call |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001948
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001949 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001950 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1951
1952 validate_result(my_data->report_data, "vkBindImageMemory", result);
1953 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001954
1955 return result;
1956}
1957
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001958VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1959 VkMemoryRequirements *pMemoryRequirements) {
1960 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001961 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001962 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001963
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001964 skip_call |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001965
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001966 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001967 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001968 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001969}
1970
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001971VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
1972 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001973 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001974 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001975
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001976 skip_call |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001977
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001978 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001979 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001980 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001981}
1982
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001983bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1984 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001985 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001986 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001987 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001988 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1989 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001990 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 -06001991 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001992 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
1993 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07001994 return false;
1995 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001996 }
1997
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001998 return true;
1999}
2000
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002001VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2002 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2003 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002004 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002005 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002006
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002007 skip_call |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2008 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002009
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002010 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002011 get_dispatch_table(pc_device_table_map, device)
2012 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002013
2014 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2015 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002016}
2017
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002018bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2019 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2020 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002021 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002022 if (pProperties != nullptr) {
2023 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2024 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002025 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 -06002026 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002027 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2028 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002029 return false;
2030 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002031 }
2032
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002033 return true;
2034}
2035
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002036VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2037 VkImageType type, VkSampleCountFlagBits samples,
2038 VkImageUsageFlags usage, VkImageTiling tiling,
2039 uint32_t *pPropertyCount,
2040 VkSparseImageFormatProperties *pProperties) {
2041 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002042 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002043 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002044
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002045 skip_call |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
2046 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002047
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002048 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002049 get_dispatch_table(pc_instance_table_map, physicalDevice)
2050 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2051 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002052
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002053 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2054 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002055 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002056}
2057
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002058VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2059 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002060 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002061 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002062 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002063 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002064
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002065 skip_call |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002066
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002067 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002068 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2069
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002070 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002071 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002072
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002073 return result;
2074}
2075
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002076VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2077 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002078 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002079 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002080 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002081 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002082
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002083 skip_call |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002084
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002085 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002086 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2087
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002088 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002089 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002090
2091 return result;
2092}
2093
Chia-I Wu01ca2372016-05-13 14:37:49 +08002094VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002095 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002096 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002097 assert(my_data != NULL);
2098
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002099 skip_call |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002100
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002101 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002102 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002103 }
2104}
2105
Chia-I Wu01ca2372016-05-13 14:37:49 +08002106VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002107 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002108 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002109 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002110 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002111
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002112 skip_call |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002113
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002114 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002115 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2116
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002117 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002118 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002119
2120 return result;
2121}
2122
Chia-I Wu01ca2372016-05-13 14:37:49 +08002123VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002124 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002125 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002126 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2127 assert(my_data != NULL);
2128
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002129 skip_call |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002130
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002131 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002132 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2133
2134 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2135 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002136
2137 return result;
2138}
2139
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002140VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2141 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002142 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002143 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002144 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002145 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002146
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002147 skip_call |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002148
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002149 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002150 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2151
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002152 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002153 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002154
2155 return result;
2156}
2157
Chia-I Wu01ca2372016-05-13 14:37:49 +08002158VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002159 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002160 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002161 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002162 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002163 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002164
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002165 skip_call |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002166
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002167 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002168 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2169
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002170 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002171 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002172
2173 return result;
2174}
2175
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002176VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
2177 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002178 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002179 assert(my_data != NULL);
2180
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002181 skip_call |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002182
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002183 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002184 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002185 }
2186}
2187
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002188VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2189 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002190 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002191 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002192 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002193 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002194
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002195 skip_call |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002196
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002197 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002198 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2199
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002200 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002201 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002202
2203 return result;
2204}
2205
Chia-I Wu01ca2372016-05-13 14:37:49 +08002206VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002207 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002208 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002209 assert(my_data != NULL);
2210
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002211 skip_call |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002212
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002213 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002214 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002215 }
2216}
2217
Chia-I Wu01ca2372016-05-13 14:37:49 +08002218VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002219 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002220 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002221 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2222 assert(my_data != NULL);
2223
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002224 skip_call |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002225
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002226 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002227 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2228
2229 validate_result(my_data->report_data, "vkGetEventStatus", result);
2230 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002231
2232 return result;
2233}
2234
Chia-I Wu01ca2372016-05-13 14:37:49 +08002235VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002236 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002237 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002238 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2239 assert(my_data != NULL);
2240
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002241 skip_call |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002242
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002243 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002244 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2245
2246 validate_result(my_data->report_data, "vkSetEvent", result);
2247 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002248
2249 return result;
2250}
2251
Chia-I Wu01ca2372016-05-13 14:37:49 +08002252VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002253 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002254 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002255 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2256 assert(my_data != NULL);
2257
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002258 skip_call |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002259
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002260 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002261 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2262
2263 validate_result(my_data->report_data, "vkResetEvent", result);
2264 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002265
2266 return result;
2267}
2268
Chia-I Wu01ca2372016-05-13 14:37:49 +08002269VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002270 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002271 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002272 bool skip_call = false;
2273 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2274 assert(device_data != nullptr);
2275 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002276
Dustin Gravesc900f572016-05-16 11:07:59 -06002277 skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002278
Dustin Gravesc900f572016-05-16 11:07:59 -06002279 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2280 if (pCreateInfo != nullptr) {
2281 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2282 // VkQueryPipelineStatisticFlagBits values
2283 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2284 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2285 skip_call |=
2286 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2287 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2288 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2289 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2290 }
2291 }
2292
2293 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002294 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2295
Dustin Gravesc900f572016-05-16 11:07:59 -06002296 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002297 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002298
2299 return result;
2300}
2301
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002302VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
2303 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002304 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002305 assert(my_data != NULL);
2306
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002307 skip_call |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002308
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002309 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002310 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002311 }
2312}
2313
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002314VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2315 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002316 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002317 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002318 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002319 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002320
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002321 skip_call |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
2322 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002323
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002324 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002325 result = get_dispatch_table(pc_device_table_map, device)
2326 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002327
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002328 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002329 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002330
2331 return result;
2332}
2333
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002334VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2335 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002336 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002337 bool skip_call = false;
2338 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2339 assert(device_data != nullptr);
2340 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002341
Karl Schultza9ef1e52016-10-06 17:53:48 -06002342 // TODO: Add check for VALIDATION_ERROR_00660
2343 // TODO: Add check for VALIDATION_ERROR_00661
2344 // TODO: Add check for VALIDATION_ERROR_00662
2345 // TODO: Add check for VALIDATION_ERROR_00670
2346 // TODO: Add check for VALIDATION_ERROR_00671
2347 // TODO: Add check for VALIDATION_ERROR_00672
2348 // TODO: Add check for VALIDATION_ERROR_00673
2349 // TODO: Add check for VALIDATION_ERROR_00674
2350 // TODO: Add check for VALIDATION_ERROR_00675
2351 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2352 // TODO: Add check for VALIDATION_ERROR_00663
Dustin Gravesc900f572016-05-16 11:07:59 -06002353 skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002354
Dustin Gravesc900f572016-05-16 11:07:59 -06002355 if (pCreateInfo != nullptr) {
2356 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2357 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2358 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2359 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Karl Schultza9ef1e52016-10-06 17:53:48 -06002360 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2361 __LINE__, VALIDATION_ERROR_00665, LayerName,
2362 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2363 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2364 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002365 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002366
Dustin Gravesc900f572016-05-16 11:07:59 -06002367 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2368 // queueFamilyIndexCount uint32_t values
2369 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2370 skip_call |= 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 -06002371 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002372 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2373 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002374 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2375 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002376 }
2377
2378 // Ensure that the queue family indices were specified at device creation
2379 skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2380 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2381 }
2382 }
2383
2384 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002385 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2386
Dustin Gravesc900f572016-05-16 11:07:59 -06002387 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002388 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002389
2390 return result;
2391}
2392
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002393VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
2394 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002395 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002396 assert(my_data != NULL);
2397
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002398 skip_call |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002399
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002400 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002401 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002402 }
2403}
2404
Chia-I Wu01ca2372016-05-13 14:37:49 +08002405VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2406 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002407 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002408 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002409 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002410 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002411
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002412 skip_call |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002413
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002414 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002415 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2416
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002417 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002418 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002419
2420 return result;
2421}
2422
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002423VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
2424 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002425 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002426 assert(my_data != NULL);
2427
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002428 skip_call |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002429
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002430 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002431 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002432 }
2433}
2434
Chia-I Wu01ca2372016-05-13 14:37:49 +08002435VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2436 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002437 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2438 bool skip_call = false;
2439 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002440 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002441 debug_report_data *report_data = device_data->report_data;
2442
2443 skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
2444
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002445 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002446 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002447 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002448 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2449 if (pCreateInfo->queueFamilyIndexCount <= 1) {
2450 skip_call |=
2451 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2452 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2453 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2454 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002455
Dustin Gravesc900f572016-05-16 11:07:59 -06002456 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2457 // queueFamilyIndexCount uint32_t values
2458 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2459 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2460 __LINE__, REQUIRED_PARAMETER, LayerName,
2461 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2462 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2463 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2464 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002465
2466 skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
2467 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2468 }
2469
2470 // width, height, and depth members of extent must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002471 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2472 skip_call |=
2473 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
2474 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002475
2476 // mipLevels must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002477 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002478
2479 // arrayLayers must be greater than 0
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002480 skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002481
2482 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2483 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
2484 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2485 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002486 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002487 }
2488
2489 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2490 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2491 // extent.height must be equal
2492 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2493 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002494 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2495 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2496 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2497 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002498 }
2499
2500 if (pCreateInfo->extent.depth != 1) {
2501 skip_call |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002502 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002503 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2504 }
2505 }
2506
2507 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2508 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2509 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002510 skip_call |=
2511 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2512 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2513 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002514 }
2515
2516 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2517 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2518 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2519 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002520 skip_call |=
2521 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2522 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2523 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002524 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002525 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002526
Dustin Gravesf8032f22016-05-11 18:31:44 -06002527 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002528 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2529
Dustin Gravesf8032f22016-05-11 18:31:44 -06002530 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002531 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002532
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002533 return result;
2534}
2535
Chia-I Wu01ca2372016-05-13 14:37:49 +08002536VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002537 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002538 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002539 assert(my_data != NULL);
2540
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002541 skip_call |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002542
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002543 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002544 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002545 }
2546}
2547
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002548bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002549 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002550 if (pSubresource != nullptr) {
2551 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2552 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002553 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 -06002554 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002555 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2556 return false;
2557 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002558 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002559
2560 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002561}
2562
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002563VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2564 VkSubresourceLayout *pLayout) {
2565 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002566 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002567 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002568
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002569 skip_call |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002570
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002571 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002572 PreGetImageSubresourceLayout(device, pSubresource);
2573
2574 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002575 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002576}
2577
Chia-I Wu01ca2372016-05-13 14:37:49 +08002578VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2579 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002580 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Graves0b70a632016-04-27 17:44:56 -06002581 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002582 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002583 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002584 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002585
Dustin Graves0b70a632016-04-27 17:44:56 -06002586 skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002587
Dustin Graves0b70a632016-04-27 17:44:56 -06002588 if (pCreateInfo != nullptr) {
2589 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002590 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2591 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002592 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2593 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2594 "pCreateInfo->subresourceRange.layerCount must be 1",
2595 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2596 }
2597 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002598 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2599 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2600 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002601 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2602 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2603 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2604 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2605 }
2606 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002607 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2608 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002609 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2610 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2611 "pCreateInfo->subresourceRange.layerCount must be 6");
2612 }
2613 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002614 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2615 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002616 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2617 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2618 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2619 }
2620 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2621 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
2622 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2623 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2624 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2625 }
2626
Dustin Graves2a80dc62016-07-12 13:57:02 -06002627 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2628 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Dustin Graves0b70a632016-04-27 17:44:56 -06002629 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2630 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2631 "pCreateInfo->subresourceRange.layerCount must be 1");
2632 }
2633 }
2634 }
2635
2636 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002637 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2638
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002639 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002640 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002641
2642 return result;
2643}
2644
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002645VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
2646 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002647 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002648 assert(my_data != NULL);
2649
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002650 skip_call |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002651
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002652 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002653 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002654 }
2655}
2656
Chia-I Wu01ca2372016-05-13 14:37:49 +08002657VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002658 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002659 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002660 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002661 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002662 assert(my_data != NULL);
2663
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002664 skip_call |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002665
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002666 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002667 result =
2668 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002669
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002670 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002671 }
2672
Michael Lentine03d8e572015-09-15 14:59:14 -05002673 return result;
2674}
2675
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002676VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2677 const VkAllocationCallbacks *pAllocator) {
2678 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002679 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002680 assert(my_data != NULL);
2681
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002682 skip_call |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002683
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002684 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002685 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002686 }
2687}
2688
Chia-I Wu01ca2372016-05-13 14:37:49 +08002689VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002690 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002691 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002692 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002693 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002694 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002695
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002696 skip_call |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002697
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002698 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002699 result =
2700 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002701
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002702 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002703 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002704
2705 return result;
2706}
2707
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002708VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2709 const VkAllocationCallbacks *pAllocator) {
2710 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002711 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002712 assert(my_data != NULL);
2713
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002714 skip_call |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002715
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002716 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002717 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002718 }
2719}
2720
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002721VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2722 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002723 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002724 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002725 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002726 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002727
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002728 skip_call |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002729
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002730 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002731 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2732
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002733 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002734 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002735
2736 return result;
2737}
2738
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002739VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2740 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002741 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002742 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002743 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002744 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002745
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002746 skip_call |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002747
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002748 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002749 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2750
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002751 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002752 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002753
2754 return result;
2755}
2756
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002757bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002758 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2759
2760 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002761 if (pCreateInfos != nullptr) {
2762 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2763 if (pCreateInfos->basePipelineIndex != -1) {
2764 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002765 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 -06002766 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002767 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2768 "pCreateInfos->flags "
2769 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2770 return false;
2771 }
2772 }
2773
2774 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2775 if (pCreateInfos->basePipelineIndex != -1) {
2776 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002777 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 -06002778 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002779 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2780 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2781 "VK_NULL_HANDLE");
2782 return false;
2783 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002784 }
2785 }
2786
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002787 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002788 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002789 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 -06002790 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002791 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2792 "unrecognized enumerator");
2793 return false;
2794 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002795
2796 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2797 (data->physical_device_features.fillModeNonSolid == false)) {
2798 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002799 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 -06002800 DEVICE_FEATURE, LayerName,
2801 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2802 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2803 return false;
2804 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002805 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002806
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002807 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002808 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002809 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2810 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002811 pCreateInfos[i].pStages[j].pName);
2812 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002813 }
2814
2815 return true;
2816}
2817
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002818VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2819 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2820 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002821 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06002822 bool skip_call = false;
2823 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2824 assert(device_data != nullptr);
2825 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002826
Dustin Gravesc900f572016-05-16 11:07:59 -06002827 skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2828 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002829
Dustin Gravesc900f572016-05-16 11:07:59 -06002830 if (pCreateInfos != nullptr) {
2831 for (uint32_t i = 0; i < createInfoCount; ++i) {
2832 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2833 if (pCreateInfos[i].pTessellationState == nullptr) {
2834 if (pCreateInfos[i].pStages != nullptr) {
2835 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2836 // pTessellationState must not be NULL
2837 bool has_control = false;
2838 bool has_eval = false;
2839
2840 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2841 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2842 has_control = true;
2843 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2844 has_eval = true;
2845 }
2846 }
2847
2848 if (has_control && has_eval) {
2849 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2850 __LINE__, REQUIRED_PARAMETER, LayerName,
2851 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2852 "control shader stage and a tessellation evaluation shader stage, "
2853 "pCreateInfos[%d].pTessellationState must not be NULL",
2854 i, i);
2855 }
2856 }
Dustin Graves629259b2016-05-30 16:14:27 -06002857 } else {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002858 skip_call |= validate_struct_pnext(
2859 report_data, "vkCreateGraphicsPipelines",
2860 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2861 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002862
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002863 skip_call |= validate_reserved_flags(
2864 report_data, "vkCreateGraphicsPipelines",
2865 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2866 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002867
2868 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2869 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2870 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2871 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2872 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2873 i);
2874 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002875 }
2876
2877 if (pCreateInfos[i].pViewportState == nullptr) {
2878 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2879 // valid VkPipelineViewportStateCreateInfo structure
2880 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2881 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2882 skip_call |= log_msg(
2883 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2884 REQUIRED_PARAMETER, LayerName,
2885 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2886 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2887 i, i);
2888 }
2889 } else {
Dustin Graves629259b2016-05-30 16:14:27 -06002890 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002891 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2892 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2893 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002894
2895 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002896 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2897 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002898 pCreateInfos[i].pViewportState->flags);
2899
Dustin Gravesc900f572016-05-16 11:07:59 -06002900 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2901 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2902 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2903 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2904 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2905 i);
2906 }
2907
2908 if (pCreateInfos[i].pDynamicState != nullptr) {
2909 bool has_dynamic_viewport = false;
2910 bool has_dynamic_scissor = false;
2911
2912 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2913 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2914 has_dynamic_viewport = true;
2915 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2916 has_dynamic_scissor = true;
2917 }
2918 }
2919
2920 // viewportCount must be greater than 0
2921 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2922 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2923 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2924 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002925 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2926 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002927 "must be greater than 0",
2928 i, i);
2929 }
2930
2931 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2932 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2933 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2934 skip_call |=
2935 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2936 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002937 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002938 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2939 i, i);
2940 }
2941
2942 // scissorCount must be greater than 0
2943 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2944 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2945 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2946 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002947 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2948 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002949 "must be greater than 0",
2950 i, i);
2951 }
2952
2953 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2954 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2955 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2956 skip_call |=
2957 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2958 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002959 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Dustin Gravesc900f572016-05-16 11:07:59 -06002960 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2961 i, i);
2962 }
2963 }
2964 }
2965
2966 if (pCreateInfos[i].pMultisampleState == nullptr) {
2967 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2968 // a valid VkPipelineMultisampleStateCreateInfo structure
2969 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2970 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2971 skip_call |=
2972 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2973 REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2974 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2975 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2976 i, i);
2977 }
Dustin Graves629259b2016-05-30 16:14:27 -06002978 } else {
2979 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002980 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2981 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002982 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002983
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002984 skip_call |= validate_reserved_flags(
2985 report_data, "vkCreateGraphicsPipelines",
2986 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
2987 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002988
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002989 skip_call |= validate_bool32(
2990 report_data, "vkCreateGraphicsPipelines",
2991 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
2992 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06002993
2994 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002995 report_data, "vkCreateGraphicsPipelines",
2996 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
2997 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
2998 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
2999 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003000
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003001 skip_call |= validate_bool32(
3002 report_data, "vkCreateGraphicsPipelines",
3003 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3004 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003005
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003006 skip_call |= validate_bool32(
3007 report_data, "vkCreateGraphicsPipelines",
3008 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3009 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003010
3011 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3012 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3013 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3014 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3015 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3016 i);
3017 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003018 }
3019
3020 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003021 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003022 skip_call |= validate_struct_pnext(
3023 report_data, "vkCreateGraphicsPipelines",
3024 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3025 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003026
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003027 skip_call |= validate_reserved_flags(
3028 report_data, "vkCreateGraphicsPipelines",
3029 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3030 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003031
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003032 skip_call |= validate_bool32(
3033 report_data, "vkCreateGraphicsPipelines",
3034 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3035 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003036
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003037 skip_call |= validate_bool32(
3038 report_data, "vkCreateGraphicsPipelines",
3039 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3040 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003041
3042 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003043 report_data, "vkCreateGraphicsPipelines",
3044 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3045 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3046 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003047
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003048 skip_call |= validate_bool32(
3049 report_data, "vkCreateGraphicsPipelines",
3050 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3051 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003052
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003053 skip_call |= validate_bool32(
3054 report_data, "vkCreateGraphicsPipelines",
3055 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3056 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003057
3058 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003059 report_data, "vkCreateGraphicsPipelines",
3060 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3061 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3062 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003063
3064 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003065 report_data, "vkCreateGraphicsPipelines",
3066 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3067 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3068 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003069
3070 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003071 report_data, "vkCreateGraphicsPipelines",
3072 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3073 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3074 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003075
3076 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003077 report_data, "vkCreateGraphicsPipelines",
3078 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3079 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3080 pCreateInfos[i].pDepthStencilState->front.compareOp);
3081
3082 skip_call |= validate_ranged_enum(
3083 report_data, "vkCreateGraphicsPipelines",
3084 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003085 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3086
3087 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003088 report_data, "vkCreateGraphicsPipelines",
3089 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003090 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3091
3092 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003093 report_data, "vkCreateGraphicsPipelines",
3094 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3095 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3096 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003097
3098 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003099 report_data, "vkCreateGraphicsPipelines",
3100 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3101 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3102 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003103
3104 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3105 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3106 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3107 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3108 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3109 i);
3110 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003111 }
3112
3113 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3114 if (pCreateInfos[i].pColorBlendState != nullptr) {
Dustin Graves629259b2016-05-30 16:14:27 -06003115 skip_call |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003116 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3117 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3118 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003119
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003120 skip_call |= validate_reserved_flags(
3121 report_data, "vkCreateGraphicsPipelines",
3122 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3123 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003124
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003125 skip_call |= validate_bool32(
3126 report_data, "vkCreateGraphicsPipelines",
3127 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3128 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003129
3130 skip_call |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003131 report_data, "vkCreateGraphicsPipelines",
3132 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3133 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3134 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003135
3136 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3137 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3138 ++attachmentIndex) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003139 skip_call |=
3140 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3141 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3142 ParameterName::IndexVector{i, attachmentIndex}),
3143 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003144
3145 skip_call |= validate_ranged_enum(
3146 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003147 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3148 ParameterName::IndexVector{i, attachmentIndex}),
3149 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003150 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3151
3152 skip_call |= validate_ranged_enum(
3153 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003154 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3155 ParameterName::IndexVector{i, attachmentIndex}),
3156 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003157 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3158
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003159 skip_call |=
3160 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3161 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3162 ParameterName::IndexVector{i, attachmentIndex}),
3163 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3164 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003165
3166 skip_call |= validate_ranged_enum(
3167 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003168 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3169 ParameterName::IndexVector{i, attachmentIndex}),
3170 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003171 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3172
3173 skip_call |= validate_ranged_enum(
3174 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003175 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3176 ParameterName::IndexVector{i, attachmentIndex}),
3177 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003178 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3179
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003180 skip_call |=
3181 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3182 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3183 ParameterName::IndexVector{i, attachmentIndex}),
3184 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3185 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003186
3187 skip_call |=
3188 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003189 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3190 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003191 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3192 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3193 }
3194 }
3195
Dustin Gravesc900f572016-05-16 11:07:59 -06003196 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3197 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3198 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3199 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3200 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3201 i);
3202 }
3203
3204 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3205 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3206 skip_call |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003207 report_data, "vkCreateGraphicsPipelines",
3208 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003209 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3210 }
3211 }
3212 }
3213 }
3214
3215 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003216 PreCreateGraphicsPipelines(device, pCreateInfos);
3217
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003218 result = get_dispatch_table(pc_device_table_map, device)
3219 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003220
Dustin Gravesc900f572016-05-16 11:07:59 -06003221 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003222 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003223
3224 return result;
3225}
3226
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003227bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003228 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3229
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003230 if (pCreateInfos != nullptr) {
3231 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003232 uint32_t i = 0;
3233 validate_string(data->report_data, "vkCreateComputePipelines",
3234 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003235 }
3236
3237 return true;
3238}
3239
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003240VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3241 const VkComputePipelineCreateInfo *pCreateInfos,
3242 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003243 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003244 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003245 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003246 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003247
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003248 skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3249 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003250
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003251 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003252 PreCreateComputePipelines(device, pCreateInfos);
3253
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003254 result = get_dispatch_table(pc_device_table_map, device)
3255 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003256
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003257 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003258 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003259
3260 return result;
3261}
3262
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003263VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3264 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003265 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003266 assert(my_data != NULL);
3267
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003268 skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003269
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003270 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003271 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003272 }
3273}
3274
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003275VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3276 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003277 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003278 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003279 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003280 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003281
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003282 skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003283
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003284 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003285 result =
3286 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003287
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003288 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003289 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003290
3291 return result;
3292}
3293
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003294VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3295 const VkAllocationCallbacks *pAllocator) {
3296 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003297 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003298 assert(my_data != NULL);
3299
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003300 skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003301
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003302 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003303 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003304 }
3305}
3306
Chia-I Wu01ca2372016-05-13 14:37:49 +08003307VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3308 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003309 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003310 bool skip_call = false;
3311 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3312 assert(device_data != NULL);
3313 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003314
Dustin Gravesc900f572016-05-16 11:07:59 -06003315 skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003316
Dustin Gravesc900f572016-05-16 11:07:59 -06003317 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3318 if (pCreateInfo != nullptr) {
3319 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3320 if (pCreateInfo->compareEnable == VK_TRUE) {
3321 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3322 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3323 }
3324
3325 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3326 // valid VkBorderColor value
3327 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3328 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3329 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3330 skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3331 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3332 }
3333 }
3334
3335 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003336 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3337
Dustin Gravesc900f572016-05-16 11:07:59 -06003338 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003339 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003340
3341 return result;
3342}
3343
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003344VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3345 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003346 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003347 assert(my_data != NULL);
3348
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003349 skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003350
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003351 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003352 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003353 }
3354}
3355
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003356VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3357 const VkAllocationCallbacks *pAllocator,
3358 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003359 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003360 bool skip_call = false;
3361 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3362 assert(device_data != nullptr);
3363 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003364
Dustin Gravesc900f572016-05-16 11:07:59 -06003365 skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003366
Dustin Gravesc900f572016-05-16 11:07:59 -06003367 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3368 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3369 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3370 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3371 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3372 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3373 // valid VkSampler handles
3374 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3375 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3376 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3377 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3378 ++descriptor_index) {
3379 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3380 skip_call |=
3381 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3382 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3383 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3384 " specified as VK_NULL_HANDLE",
3385 i, descriptor_index);
3386 }
3387 }
3388 }
3389
3390 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3391 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3392 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3393 skip_call |=
3394 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3395 UNRECOGNIZED_VALUE, LayerName,
3396 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3397 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3398 i, i);
3399 }
3400 }
3401 }
3402 }
3403
3404 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003405 result =
3406 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003407
Dustin Gravesc900f572016-05-16 11:07:59 -06003408 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003409 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003410
3411 return result;
3412}
3413
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003414VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3415 const VkAllocationCallbacks *pAllocator) {
3416 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003417 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003418 assert(my_data != NULL);
3419
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003420 skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003421
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003422 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003423 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003424 }
3425}
3426
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003427VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3428 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003429 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003430 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003431 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003432 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003433
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003434 skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003435
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003436 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3437
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003438 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003439 result =
3440 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003441
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003442 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003443 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003444
3445 return result;
3446}
3447
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003448VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3449 const VkAllocationCallbacks *pAllocator) {
3450 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003451 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003452 assert(my_data != NULL);
3453
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003454 skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003455
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003456 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003457 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003458 }
3459}
3460
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003461VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3462 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003463 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003464 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003465 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3466 assert(my_data != NULL);
3467
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003468 skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003469
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003470 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003471 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3472
3473 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3474 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003475
3476 return result;
3477}
3478
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003479VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3480 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003481 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003482 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003483 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003484 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003485
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003486 skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003487
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003488 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003489 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3490
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003491 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003492 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003493
3494 return result;
3495}
3496
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003497VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003498 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003499 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003500 bool skip_call = false;
3501 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3502 assert(device_data != nullptr);
3503 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003504
Dustin Gravesc900f572016-05-16 11:07:59 -06003505 skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003506
Dustin Gravesc900f572016-05-16 11:07:59 -06003507 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3508 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3509 // validate_array()
3510 skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3511 pDescriptorSets, true, true);
3512
3513 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003514 result = get_dispatch_table(pc_device_table_map, device)
3515 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003516
Dustin Gravesc900f572016-05-16 11:07:59 -06003517 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003518 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003519
3520 return result;
3521}
3522
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003523VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3524 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3525 const VkCopyDescriptorSet *pDescriptorCopies) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003526 bool skip_call = false;
3527 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3528 assert(device_data != NULL);
3529 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003530
Dustin Gravesc900f572016-05-16 11:07:59 -06003531 skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3532 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003533
Dustin Gravesc900f572016-05-16 11:07:59 -06003534 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3535 if (pDescriptorWrites != NULL) {
3536 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3537 // descriptorCount must be greater than 0
3538 if (pDescriptorWrites[i].descriptorCount == 0) {
3539 skip_call |=
3540 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3541 REQUIRED_PARAMETER, LayerName,
3542 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3543 }
3544
3545 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3546 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3547 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3548 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3549 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3550 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3551 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3552 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3553 if (pDescriptorWrites[i].pImageInfo == nullptr) {
3554 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3555 __LINE__, REQUIRED_PARAMETER, LayerName,
3556 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3557 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3558 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3559 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3560 i, i);
3561 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3562 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3563 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3564 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3565 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3566 ++descriptor_index) {
3567 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003568 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3569 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003570 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3571 skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003572 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3573 ParameterName::IndexVector{i, descriptor_index}),
3574 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003575 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3576 }
3577 }
3578 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3579 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3580 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3581 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3582 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3583 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3584 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3585 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3586 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3587 __LINE__, REQUIRED_PARAMETER, LayerName,
3588 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3589 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3590 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3591 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3592 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003593 } else {
3594 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3595 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003596 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3597 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003598 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3599 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003600 }
3601 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3602 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3603 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3604 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3605 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3606 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3607 __LINE__, REQUIRED_PARAMETER, LayerName,
3608 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3609 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3610 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3611 i, i);
3612 } else {
3613 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3614 ++descriptor_index) {
3615 skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003616 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3617 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003618 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3619 }
3620 }
3621 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003622
3623 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3624 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3625 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
3626 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3627 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3628 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
3629 skip_call |=
3630 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003631 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003632 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3633 ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3634 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3635 }
3636 }
3637 }
3638 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3639 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3640 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3641 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3642 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3643 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
3644 skip_call |=
3645 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003646 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003647 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3648 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3649 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3650 }
3651 }
3652 }
3653 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003654 }
3655 }
3656
3657 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003658 get_dispatch_table(pc_device_table_map, device)
3659 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003660 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003661}
3662
Chia-I Wu01ca2372016-05-13 14:37:49 +08003663VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003664 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003665 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003666 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003667 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003668 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003669
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003670 skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003671
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003672 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003673 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3674
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003675 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003676 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003677
3678 return result;
3679}
3680
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003681VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3682 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003683 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003684 assert(my_data != NULL);
3685
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003686 skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003687
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003688 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003689 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003690 }
3691}
3692
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003693bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
3694 bool skip_call = false;
3695 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3696
3697 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3698 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
3699 skip_call |= 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 -06003700 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003701 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3702 }
3703 }
3704 return skip_call;
3705}
3706
Chia-I Wu01ca2372016-05-13 14:37:49 +08003707VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003708 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003709 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003710 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003711 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003712 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003713
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003714 skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3715 skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003716
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003717 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003718 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3719
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003720 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003721 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003722
3723 return result;
3724}
3725
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003726VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
3727 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003728 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003729 assert(my_data != NULL);
3730
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003731 skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003732
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003733 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003734 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003735 }
3736}
3737
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003738VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3739 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003740 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003741 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003742
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003743 skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003744
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003745 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003746 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003747 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003748}
3749
Chia-I Wu01ca2372016-05-13 14:37:49 +08003750VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003751 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003752 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003753 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003754 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003755 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003756
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003757 skip_call |=
Dustin Gravesde628532016-04-21 16:30:17 -06003758 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003759
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003760 skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003761
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003762 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003763 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3764
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003765 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003766 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003767
3768 return result;
3769}
3770
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003771VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3772 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003773 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003774 assert(my_data != NULL);
3775
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003776 skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003777
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003778 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003779 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003780 }
3781}
3782
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003783VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003784 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003785 bool skip_call = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003786 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3787 assert(my_data != NULL);
3788
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003789 skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003790
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003791 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003792 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3793
3794 validate_result(my_data->report_data, "vkResetCommandPool", result);
3795 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003796
3797 return result;
3798}
3799
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003800VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3801 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003802 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003803 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003804 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003805 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003806
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003807 skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003808
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003809 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003810 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3811
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003812 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003813 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003814
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003815 return result;
3816}
3817
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003818VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003819 const VkCommandBuffer *pCommandBuffers) {
Dustin Gravesc900f572016-05-16 11:07:59 -06003820 bool skip_call = false;
3821 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3822 assert(device_data != nullptr);
3823 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003824
Dustin Gravesc900f572016-05-16 11:07:59 -06003825 skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003826
Dustin Gravesc900f572016-05-16 11:07:59 -06003827 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3828 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3829 // validate_array()
3830 skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3831 pCommandBuffers, true, true);
3832
3833 if (!skip_call) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003834 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003835 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003836 }
3837}
3838
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003839bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3840 bool skip_call = false;
3841 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3842 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3843
3844 if (pInfo != NULL) {
3845 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
3846 skip_call |=
3847 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 -06003848 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003849 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3850 "inheritedQueries.");
3851 }
3852
3853 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3854 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
3855 skip_call |=
3856 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 -06003857 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003858 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3859 "valid combination of VkQueryControlFlagBits.",
3860 pInfo->queryFlags);
3861 }
3862 }
3863 return skip_call;
3864}
3865
3866VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003867 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesc900f572016-05-16 11:07:59 -06003868 bool skip_call = false;
3869 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3870 assert(device_data != nullptr);
3871 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003872
Dustin Gravesc900f572016-05-16 11:07:59 -06003873 skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003874
Dustin Gravesc900f572016-05-16 11:07:59 -06003875 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3876 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3877 skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3878 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3879 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3880
3881 if (pBeginInfo->pInheritanceInfo != NULL) {
Dustin Graves629259b2016-05-30 16:14:27 -06003882 skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003883 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003884
3885 skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3886 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3887
Dustin Gravesc900f572016-05-16 11:07:59 -06003888 // TODO: This only needs to be validated when the inherited queries feature is enabled
3889 // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3890 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3891
3892 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3893 skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3894 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3895 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3896 }
3897
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003898 skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
3899
Dustin Gravesc900f572016-05-16 11:07:59 -06003900 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003901 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3902
Dustin Gravesc900f572016-05-16 11:07:59 -06003903 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003904 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003905
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003906 return result;
3907}
3908
Chia-I Wu01ca2372016-05-13 14:37:49 +08003909VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003910 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3911 assert(my_data != NULL);
3912
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003913 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003914
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003915 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003916
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003917 return result;
3918}
3919
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003920VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003921 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003922 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3923 assert(my_data != NULL);
3924
Dustin Graves16d18972016-05-09 17:36:57 -06003925 bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003926
Dustin Graves16d18972016-05-09 17:36:57 -06003927 if (!skip_call) {
3928 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3929
3930 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3931 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003932
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003933 return result;
3934}
3935
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003936VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3937 VkPipeline pipeline) {
3938 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003939 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3940 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003941
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003942 skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003943
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003944 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003945 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3946 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003947}
3948
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003949bool preCmdSetViewport(debug_report_data *report_data, uint32_t viewport_count, const VkViewport *viewports) {
3950 bool skip =
3951 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
3952 return skip;
3953}
3954
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003955VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3956 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003957 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003958 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003959 assert(my_data != NULL);
3960
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003961 skip |= preCmdSetViewport(my_data->report_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003962
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06003963 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003964 get_dispatch_table(pc_device_table_map, commandBuffer)
3965 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003966 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06003967}
3968
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003969VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3970 const VkRect2D *pScissors) {
3971 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003972 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003973 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06003974 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07003975
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003976 skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003977
Mike Weiblena4742dc2016-10-31 11:05:56 -06003978 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
3979 const VkRect2D &pScissor = pScissors[scissorIndex];
3980
3981 if (pScissor.offset.x < 0) {
3982 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3983 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
3984 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
3985 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
3986 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3987 VALIDATION_ERROR_01490, LayerName,
3988 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
3989 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
3990 }
3991
3992 if (pScissor.offset.y < 0) {
3993 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3994 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
3995 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
3996 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
3997 skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3998 VALIDATION_ERROR_01491, LayerName,
3999 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4000 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4001 }
4002 }
4003
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004004 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004005 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4006 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004007}
4008
Chia-I Wu01ca2372016-05-13 14:37:49 +08004009VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004010 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004011}
4012
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004013VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4014 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004015 get_dispatch_table(pc_device_table_map, commandBuffer)
4016 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004017}
4018
Chia-I Wu01ca2372016-05-13 14:37:49 +08004019VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004020 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004021 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004022 assert(my_data != NULL);
4023
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004024 skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004025
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004026 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004027 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4028 }
Cody Northrop12365112015-08-17 11:10:49 -06004029}
4030
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004031VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004032 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004033}
4034
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004035VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4036 uint32_t compareMask) {
4037 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004038 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4039 assert(my_data != NULL);
4040
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004041 skip_call |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004042
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004043 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004044 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4045 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004046}
4047
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004048VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
4049 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004050 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4051 assert(my_data != NULL);
4052
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004053 skip_call |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004054
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004055 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004056 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4057 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004058}
4059
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004060VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
4061 bool skip_call = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004062 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4063 assert(my_data != NULL);
4064
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004065 skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004066
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004067 if (!skip_call) {
Dustin Graves46948e62016-05-06 10:16:06 -06004068 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4069 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004070}
4071
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004072VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4073 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4074 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4075 const uint32_t *pDynamicOffsets) {
4076 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004077 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004078 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004079
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004080 skip_call |=
4081 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4082 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004083
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004084 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004085 get_dispatch_table(pc_device_table_map, commandBuffer)
4086 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4087 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004088 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004089}
4090
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004091VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4092 VkIndexType indexType) {
4093 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004094 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4095 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004096
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004097 skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004098
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004099 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004100 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4101 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004102}
4103
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004104VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4105 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4106 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004107 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004108 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004109
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004110 skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004111
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004112 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004113 get_dispatch_table(pc_device_table_map, commandBuffer)
4114 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004115 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004116}
4117
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004118bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4119 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004120 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004121 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004122 // 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 -07004123 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004124 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 -06004125 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004126 return false;
4127 }
4128
4129 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004130 // 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 -07004131 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004132 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 -06004133 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004134 return false;
4135 }
4136
4137 return true;
4138}
4139
Chia-I Wu01ca2372016-05-13 14:37:49 +08004140VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4141 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004142 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004143
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004144 get_dispatch_table(pc_device_table_map, commandBuffer)
4145 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004146}
4147
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004148VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4149 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004150 get_dispatch_table(pc_device_table_map, commandBuffer)
4151 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004152}
4153
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004154VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4155 uint32_t stride) {
4156 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004157 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4158 assert(my_data != NULL);
4159
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004160 skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004161
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004162 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004163 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4164 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004165}
4166
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004167VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4168 uint32_t count, uint32_t stride) {
4169 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004170 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4171 assert(my_data != NULL);
4172
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004173 skip_call |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004174
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004175 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004176 get_dispatch_table(pc_device_table_map, commandBuffer)
4177 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4178 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004179}
4180
Chia-I Wu01ca2372016-05-13 14:37:49 +08004181VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004182 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004183}
4184
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004185VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4186 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004187 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4188 assert(my_data != NULL);
4189
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004190 skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004191
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004192 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004193 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4194 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004195}
4196
Chia-I Wu01ca2372016-05-13 14:37:49 +08004197VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4198 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004199 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004200 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004201 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004202
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004203 skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004204
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004205 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004206 get_dispatch_table(pc_device_table_map, commandBuffer)
4207 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004208 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004209}
4210
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004211bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004212 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004213 if (pRegions != nullptr) {
4214 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4215 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004216 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 -06004217 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004218 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4219 return false;
4220 }
4221 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4222 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004223 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 -06004224 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004225 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4226 return false;
4227 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004228 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004229
4230 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004231}
4232
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004233VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4234 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4235 const VkImageCopy *pRegions) {
4236 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004237 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004238 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004239
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004240 skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4241 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004242
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004243 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004244 PreCmdCopyImage(commandBuffer, pRegions);
4245
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004246 get_dispatch_table(pc_device_table_map, commandBuffer)
4247 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004248 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004249}
4250
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004251bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004252 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004253 if (pRegions != nullptr) {
4254 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4255 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004256 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 -06004257 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004258 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4259 return false;
4260 }
4261 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4262 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004263 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 -06004264 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004265 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4266 return false;
4267 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004268 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004269
4270 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004271}
4272
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004273VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4274 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4275 const VkImageBlit *pRegions, VkFilter filter) {
4276 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004277 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004278 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004279
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004280 skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4281 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004282
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004283 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004284 PreCmdBlitImage(commandBuffer, pRegions);
4285
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004286 get_dispatch_table(pc_device_table_map, commandBuffer)
4287 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004288 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004289}
4290
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004291bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004292 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004293 if (pRegions != nullptr) {
4294 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4295 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004296 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 -06004297 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004298 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4299 "enumerator");
4300 return false;
4301 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004302 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004303
4304 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004305}
4306
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004307VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4308 VkImageLayout dstImageLayout, uint32_t regionCount,
4309 const VkBufferImageCopy *pRegions) {
4310 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004311 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004312 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004313
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004314 skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4315 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004316
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004317 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004318 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4319
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004320 get_dispatch_table(pc_device_table_map, commandBuffer)
4321 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004322 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004323}
4324
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004325bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004326 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004327 if (pRegions != nullptr) {
4328 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4329 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004330 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 -06004331 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004332 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4333 "enumerator");
4334 return false;
4335 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004336 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004337
4338 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004339}
4340
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004341VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4342 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4343 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004344 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004345 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004346
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004347 skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4348 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004349
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004350 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004351 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4352
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004353 get_dispatch_table(pc_device_table_map, commandBuffer)
4354 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004355 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004356}
4357
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004358VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4359 VkDeviceSize dataSize, const uint32_t *pData) {
4360 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004361 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004362 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004363
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004364 skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004365
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004366 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004367 skip_call |= log_msg(
4368 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4369 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004370 }
4371
4372 if ((dataSize <= 0) || (dataSize > 65536)) {
4373 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004374 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4375 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004376 dataSize);
4377 } else if (dataSize & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004378 skip_call |= log_msg(
4379 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4380 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004381 }
4382
4383 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004384 get_dispatch_table(pc_device_table_map, commandBuffer)
4385 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004386 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004387}
4388
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004389VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4390 VkDeviceSize size, uint32_t data) {
4391 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004392 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4393 assert(my_data != NULL);
4394
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004395 skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004396
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004397 if (dstOffset & 3) {
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004398 skip_call |= log_msg(
4399 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4400 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004401 }
4402
4403 if (size != VK_WHOLE_SIZE) {
4404 if (size <= 0) {
4405 skip_call |= log_msg(
4406 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004407 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004408 } else if (size & 3) {
4409 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004410 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004411 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4412 }
4413 }
4414
4415 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004416 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4417 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004418}
4419
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004420VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4421 const VkClearColorValue *pColor, uint32_t rangeCount,
4422 const VkImageSubresourceRange *pRanges) {
4423 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004424 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004425 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004426
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004427 skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004428
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004429 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004430 get_dispatch_table(pc_device_table_map, commandBuffer)
4431 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004432 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004433}
4434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004435VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4436 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4437 const VkImageSubresourceRange *pRanges) {
4438 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004439 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004440 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004441
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004442 skip_call |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4443 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004444
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004445 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004446 get_dispatch_table(pc_device_table_map, commandBuffer)
4447 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004448 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004449}
4450
Chia-I Wu01ca2372016-05-13 14:37:49 +08004451VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4452 const VkClearAttachment *pAttachments, uint32_t rectCount,
4453 const VkClearRect *pRects) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004454 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004455 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004456 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004457
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004458 skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004459
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004460 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004461 get_dispatch_table(pc_device_table_map, commandBuffer)
4462 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004463 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004464}
4465
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004466bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004467 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004468 if (pRegions != nullptr) {
4469 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4470 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4471 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004472 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 -06004473 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004474 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4475 return false;
4476 }
4477 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4478 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4479 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004480 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 -06004481 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004482 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4483 return false;
4484 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004485 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004486
4487 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004488}
4489
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004490VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4491 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4492 const VkImageResolve *pRegions) {
4493 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004494 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004495 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004496
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004497 skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4498 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004499
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004500 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004501 PreCmdResolveImage(commandBuffer, pRegions);
4502
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004503 get_dispatch_table(pc_device_table_map, commandBuffer)
4504 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004505 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004506}
4507
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004508VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4509 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004510 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4511 assert(my_data != NULL);
4512
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004513 skip_call |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004514
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004515 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004516 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4517 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004518}
4519
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004520VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4521 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004522 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4523 assert(my_data != NULL);
4524
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004525 skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004526
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004527 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004528 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4529 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004530}
4531
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004532VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4533 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4534 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4535 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4536 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4537 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004538 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004539 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004540
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004541 skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4542 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4543 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004544
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004545 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004546 get_dispatch_table(pc_device_table_map, commandBuffer)
4547 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4548 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004549 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004550}
4551
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004552VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4553 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4554 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4555 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4556 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4557 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004558 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004559 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004560
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004561 skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4562 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4563 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004564
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004565 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004566 get_dispatch_table(pc_device_table_map, commandBuffer)
4567 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4568 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004569 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004570}
4571
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004572VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4573 VkQueryControlFlags flags) {
4574 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004575 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4576 assert(my_data != NULL);
4577
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004578 skip_call |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004579
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004580 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004581 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4582 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004583}
4584
Chia-I Wu01ca2372016-05-13 14:37:49 +08004585VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004586 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004587 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4588 assert(my_data != NULL);
4589
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004590 skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004591
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004592 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004593 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4594 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004595}
4596
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004597VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4598 uint32_t queryCount) {
4599 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004600 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4601 assert(my_data != NULL);
4602
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004603 skip_call |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004604
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004605 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004606 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4607 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004608}
4609
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004610bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4611 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004612
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004613 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004614
4615 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004616}
4617
Chia-I Wu01ca2372016-05-13 14:37:49 +08004618VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4619 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004620 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004621 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4622 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004623
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004624 skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004625
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004626 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004627 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4628
4629 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4630 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004631}
4632
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004633VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4634 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4635 VkDeviceSize stride, VkQueryResultFlags flags) {
4636 bool skip_call = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004637 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4638 assert(my_data != NULL);
4639
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004640 skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4641 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004642
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004643 if (!skip_call) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004644 get_dispatch_table(pc_device_table_map, commandBuffer)
4645 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4646 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004647}
4648
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004649VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4650 uint32_t offset, uint32_t size, const void *pValues) {
4651 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004652 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004653 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004654
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004655 skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004656
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004657 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004658 get_dispatch_table(pc_device_table_map, commandBuffer)
4659 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004660 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004661}
4662
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004663VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4664 VkSubpassContents contents) {
4665 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004666 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004667 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004668
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004669 skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004670
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004671 if (!skip_call) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004672 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004673 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004674}
4675
Chia-I Wu01ca2372016-05-13 14:37:49 +08004676VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004677 bool skip_call = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004678 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4679 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004680
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004681 skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004682
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004683 if (!skip_call) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004684 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4685 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004686}
4687
Chia-I Wu01ca2372016-05-13 14:37:49 +08004688VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004689 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004690}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004691
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004692VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4693 const VkCommandBuffer *pCommandBuffers) {
4694 bool skip_call = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004695 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004696 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004697
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004698 skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004699
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004700 if (!skip_call) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004701 get_dispatch_table(pc_device_table_map, commandBuffer)
4702 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004703 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004704}
4705
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004706VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004707 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4708}
4709
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004710VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4711 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004712 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4713}
4714
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004715VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4716 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004717 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4718 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4719
4720 return VK_ERROR_LAYER_NOT_PRESENT;
4721}
4722
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004723VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4724 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004725 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004726 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004727 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004728
4729 assert(physicalDevice);
4730
4731 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4732 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004733}
4734
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004735// WSI Extension Functions
4736
4737VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004738 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004739 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004740 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004741 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4742 assert(my_data != NULL);
4743
Chris Forbesbe5f5202016-11-02 18:34:25 +13004744 if (!my_data->swapchain_enabled) {
4745 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT,
4746 reinterpret_cast<uint64_t>(device), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4747 "vkCreateSwapchainKHR() called even though the %s extension was not enabled for this VkDevice.",
4748 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
4749 }
4750
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004751 skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004752
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004753 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004754 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4755
4756 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4757 }
4758
4759 return result;
4760}
4761
4762VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004763 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004764 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004765 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004766 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4767 assert(my_data != NULL);
4768
Chris Forbesbe5f5202016-11-02 18:34:25 +13004769 if (!my_data->swapchain_enabled) {
4770 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT,
4771 reinterpret_cast<uint64_t>(device), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4772 "vkGetSwapchainImagesKHR() called even though the %s extension was not enabled for this VkDevice.",
4773 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
4774 }
4775
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004776 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004777 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4778
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004779 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004780 result = get_dispatch_table(pc_device_table_map, device)
4781 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4782
4783 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4784 }
4785
4786 return result;
4787}
4788
4789VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004790 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004791 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004792 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004793 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4794 assert(my_data != NULL);
4795
Chris Forbesbe5f5202016-11-02 18:34:25 +13004796 if (!my_data->swapchain_enabled) {
4797 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT,
4798 reinterpret_cast<uint64_t>(device), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4799 "vkAcquireNextImageKHR() called even though the %s extension was not enabled for this VkDevice.",
4800 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
4801 }
4802
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004803 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004804 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4805
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004806 if (!skip_call) {
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;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004818 bool skip_call = 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 Forbesbe5f5202016-11-02 18:34:25 +13004822 if (!my_data->swapchain_enabled) {
4823 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT,
4824 reinterpret_cast<uint64_t>(queue), __LINE__,
4825 EXTENSION_NOT_ENABLED, LayerName,
4826 "vkQueuePresentKHR() called even though the %s extension was not enabled for this VkDevice.",
4827 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
4828 }
4829
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004830 skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004831
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004832 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004833 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4834
4835 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4836 }
4837
4838 return result;
4839}
4840
Chris Forbesbe5f5202016-11-02 18:34:25 +13004841VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
4842 bool skip_call = false;
4843 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4844 assert(my_data != NULL);
4845
4846 if (!my_data->swapchain_enabled) {
4847 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT,
4848 reinterpret_cast<uint64_t>(device), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4849 "vkDestroySwapchainKHR() called even though the %s extension was not enabled for this VkDevice.",
4850 VK_KHR_SWAPCHAIN_EXTENSION_NAME);
4851 }
4852
4853 /* No generated validation function for this call */
4854
4855 if (!skip_call) {
4856 get_dispatch_table(pc_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
4857 }
4858}
4859
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004860VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4861 VkSurfaceKHR surface, VkBool32 *pSupported) {
4862 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004863 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004864 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4865 assert(my_data != NULL);
4866
Chris Forbes8a13e272016-11-02 17:43:34 +13004867 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, physicalDevice)].surface_enabled) {
4868 skip_call |= log_msg(
4869 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
4870 reinterpret_cast<uint64_t>(physicalDevice), __LINE__, EXTENSION_NOT_ENABLED,
4871 LayerName,
4872 "vkGetPhysicalDeviceSurfaceSupportKHR() called even though the %s extension was not enabled for this VkInstance.",
4873 VK_KHR_SURFACE_EXTENSION_NAME);
4874 }
4875
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004876 skip_call |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004877 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4878
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004879 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004880 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4881 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4882
4883 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4884 }
4885
4886 return result;
4887}
4888
4889VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4890 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4891 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004892 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004893 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4894 assert(my_data != NULL);
4895
Chris Forbes8a13e272016-11-02 17:43:34 +13004896 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, physicalDevice)].surface_enabled) {
4897 skip_call |= log_msg(
4898 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
4899 reinterpret_cast<uint64_t>(physicalDevice), __LINE__, EXTENSION_NOT_ENABLED,
4900 LayerName,
4901 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR() called even though the %s extension was not enabled for this VkInstance.",
Chris Forbesbe5f5202016-11-02 18:34:25 +13004902 VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004903 }
4904
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004905 skip_call |=
4906 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004907
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004908 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004909 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4910 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4911
4912 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4913 }
4914
4915 return result;
4916}
4917
4918VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4919 uint32_t *pSurfaceFormatCount,
4920 VkSurfaceFormatKHR *pSurfaceFormats) {
4921 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004922 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004923 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4924 assert(my_data != NULL);
4925
Chris Forbes8a13e272016-11-02 17:43:34 +13004926 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, physicalDevice)].surface_enabled) {
4927 skip_call |= log_msg(
4928 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
4929 reinterpret_cast<uint64_t>(physicalDevice), __LINE__, EXTENSION_NOT_ENABLED,
4930 LayerName,
4931 "vkGetPhysicalDeviceSurfaceFormatsKHR() called even though the %s extension was not enabled for this VkInstance.",
Chris Forbesbe5f5202016-11-02 18:34:25 +13004932 VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004933 }
4934
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004935 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4936 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004937
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004938 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004939 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4940 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4941
4942 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
4943 }
4944
4945 return result;
4946}
4947
4948VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4949 uint32_t *pPresentModeCount,
4950 VkPresentModeKHR *pPresentModes) {
4951 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004952 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004953 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
4954 assert(my_data != NULL);
4955
Chris Forbes8a13e272016-11-02 17:43:34 +13004956 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, physicalDevice)].surface_enabled) {
4957 skip_call |= log_msg(
4958 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
4959 reinterpret_cast<uint64_t>(physicalDevice), __LINE__, EXTENSION_NOT_ENABLED,
4960 LayerName,
4961 "vkGetPhysicalDeviceSurfacePresentModesKHR() called even though the %s extension was not enabled for this VkInstance.",
Chris Forbesbe5f5202016-11-02 18:34:25 +13004962 VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004963 }
4964
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004965 skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4966 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004967
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004968 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004969 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4970 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
4971
4972 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
4973 }
4974
4975 return result;
4976}
4977
Chris Forbesbe5f5202016-11-02 18:34:25 +13004978VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
4979 bool skip_call = false;
4980 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
4981 assert(my_data != NULL);
4982
4983 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, instance)].surface_enabled) {
4984 skip_call |= log_msg(
4985 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
4986 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED,
4987 LayerName, "vkDestroySurfaceKHR() called even though the %s extension was not enabled for this VkInstance.",
4988 VK_KHR_SURFACE_EXTENSION_NAME);
4989 }
4990
4991 if (!skip_call) {
4992 get_dispatch_table(pc_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
4993 }
4994}
4995
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004996#ifdef VK_USE_PLATFORM_WIN32_KHR
4997VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
4998 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
4999 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5000
5001 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5002 assert(my_data != NULL);
Chris Forbes9a083b92016-11-02 16:58:15 +13005003 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005004
Chris Forbes9a083b92016-11-02 16:58:15 +13005005 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, instance)].win32_enabled) {
5006 skip_call |=
5007 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
5008 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5009 "vkCreateWin32SurfaceKHR() called even though the %s extension was not enabled for this VkInstance.",
5010 VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
5011 }
5012
5013 skip_call |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005014
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005015 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005016 result =
5017 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5018 }
5019
5020 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5021
5022 return result;
5023}
Chris Forbes9a083b92016-11-02 16:58:15 +13005024
5025VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
5026 uint32_t queueFamilyIndex)
5027{
5028 VkBool32 result = false;
5029
5030 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5031 assert(my_data != NULL);
5032 bool skip_call = false;
5033
5034 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, physicalDevice)].win32_enabled) {
5035 skip_call |=
5036 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
5037 reinterpret_cast<uint64_t>(physicalDevice), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5038 "vkGetPhysicalDeviceWin32PresentationSupportKHR() called even though the %s extension was not enabled for this VkInstance.",
5039 VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
5040 }
5041
5042 skip_call |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
5043
5044 if (!skip_call) {
5045 result = get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceWin32PresentationSupportKHR(
5046 physicalDevice, queueFamilyIndex);
5047 }
5048
5049 return result;
5050}
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005051#endif // VK_USE_PLATFORM_WIN32_KHR
5052
5053#ifdef VK_USE_PLATFORM_XCB_KHR
5054VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5055 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5056 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5057
5058 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5059 assert(my_data != NULL);
Chris Forbes9a083b92016-11-02 16:58:15 +13005060 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005061
Chris Forbes9a083b92016-11-02 16:58:15 +13005062 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, instance)].xcb_enabled) {
5063 skip_call |=
5064 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
5065 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5066 "vkCreateXcbSurfaceKHR() called even though the %s extension was not enabled for this VkInstance.",
5067 VK_KHR_XCB_SURFACE_EXTENSION_NAME);
5068 }
5069
5070 skip_call |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005071
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005072 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005073 result =
5074 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5075 }
5076
5077 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5078
5079 return result;
5080}
5081
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005082VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5083 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5084 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005085 VkBool32 result = false;
5086
5087 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5088 assert(my_data != NULL);
Chris Forbes9a083b92016-11-02 16:58:15 +13005089 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005090
Chris Forbes9a083b92016-11-02 16:58:15 +13005091 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, physicalDevice)].xcb_enabled) {
5092 skip_call |=
5093 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
5094 reinterpret_cast<uint64_t>(physicalDevice), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5095 "vkGetPhysicalDeviceXcbPresentationSupportKHR() called even though the %s extension was not enabled for this VkInstance.",
5096 VK_KHR_XCB_SURFACE_EXTENSION_NAME);
5097 }
5098
5099 skip_call |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005100 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005101
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005102 if (!skip_call) {
5103 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5104 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005105 }
5106
5107 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005108}
5109#endif // VK_USE_PLATFORM_XCB_KHR
5110
5111#ifdef VK_USE_PLATFORM_XLIB_KHR
5112VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005113 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005114 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5115
5116 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5117 assert(my_data != NULL);
Chris Forbes9a083b92016-11-02 16:58:15 +13005118 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005119
Chris Forbes9a083b92016-11-02 16:58:15 +13005120 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, instance)].xlib_enabled) {
5121 skip_call |=
5122 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
5123 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5124 "vkCreateXlibSurfaceKHR() called even though the %s extension was not enabled for this VkInstance.",
5125 VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
5126 }
5127
5128 skip_call |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005129
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005130 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005131 result =
5132 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5133 }
5134
5135 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5136
5137 return result;
5138}
5139
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005140VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5141 uint32_t queueFamilyIndex, Display *dpy,
5142 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005143 VkBool32 result = false;
5144
5145 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5146 assert(my_data != NULL);
Chris Forbes9a083b92016-11-02 16:58:15 +13005147 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005148
Chris Forbes9a083b92016-11-02 16:58:15 +13005149 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, physicalDevice)].xlib_enabled) {
5150 skip_call |=
5151 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
5152 reinterpret_cast<uint64_t>(physicalDevice), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5153 "vkGetPhysicalDeviceXlibPresentationSupportKHR() called even though the %s extension was not enabled for this VkInstance.",
5154 VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
5155 }
5156
5157 skip_call |= parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005158
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005159 if (!skip_call) {
5160 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5161 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005162 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005163 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005164}
5165#endif // VK_USE_PLATFORM_XLIB_KHR
5166
5167#ifdef VK_USE_PLATFORM_MIR_KHR
5168VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005169 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005170 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5171
5172 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5173 assert(my_data != NULL);
Chris Forbes9a083b92016-11-02 16:58:15 +13005174 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005175
Chris Forbes9a083b92016-11-02 16:58:15 +13005176 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, instance)].mir_enabled) {
5177 skip_call |=
5178 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
5179 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5180 "vkCreateMirSurfaceKHR() called even though the %s extension was not enabled for this VkInstance.",
5181 VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5182 }
5183
5184 skip_call |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005185
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005186 if (!skip_call) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005187 result =
5188 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5189 }
5190
5191 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5192
5193 return result;
5194}
5195
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005196VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5197 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005198 VkBool32 result = false;
5199
5200 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5201 assert(my_data != NULL);
5202
Chris Forbes9a083b92016-11-02 16:58:15 +13005203 bool skip_call = false;
5204
5205 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, physicalDevice)].mir_enabled) {
5206 skip_call |=
5207 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
5208 reinterpret_cast<uint64_t>(physicalDevice), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5209 "vkGetPhysicalDeviceMirPresentationSupportKHR() called even though the %s extension was not enabled for this VkInstance.",
5210 VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5211 }
5212 skip_call |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005213
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005214 if (!skip_call) {
5215 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5216 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005217 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005218 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005219}
5220#endif // VK_USE_PLATFORM_MIR_KHR
5221
5222#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5223VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005224 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005225 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5226
5227 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5228 assert(my_data != NULL);
Chris Forbes9a083b92016-11-02 16:58:15 +13005229 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005230
Chris Forbes9a083b92016-11-02 16:58:15 +13005231 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, instance)].wayland_enabled) {
5232 skip_call |=
5233 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
5234 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5235 "vkCreateWaylandSurfaceKHR() called even though the %s extension was not enabled for this VkInstance.",
5236 VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5237 }
5238 skip_call |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005239
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005240 if (!skip_call) {
5241 result = get_dispatch_table(pc_instance_table_map, instance)
5242 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005243 }
5244
5245 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5246
5247 return result;
5248}
5249
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005250VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5251 uint32_t queueFamilyIndex,
5252 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005253 VkBool32 result = false;
5254
5255 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5256 assert(my_data != NULL);
Chris Forbes9a083b92016-11-02 16:58:15 +13005257 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005258
Chris Forbes9a083b92016-11-02 16:58:15 +13005259 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, physicalDevice)].wayland_enabled) {
5260 skip_call |=
5261 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
5262 reinterpret_cast<uint64_t>(physicalDevice), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5263 "vkGetPhysicalDeviceWaylandPresentationSupportKHR() called even though the %s extension was not enabled for this VkInstance.",
5264 VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5265 }
5266 skip_call |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005267 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005268
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005269 if (!skip_call) {
5270 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5271 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005272 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005273
5274 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005275}
5276#endif // VK_USE_PLATFORM_WAYLAND_KHR
5277
5278#ifdef VK_USE_PLATFORM_ANDROID_KHR
5279VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005280 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005281 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5282
5283 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5284 assert(my_data != NULL);
Chris Forbes9a083b92016-11-02 16:58:15 +13005285 bool skip_call = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005286
Chris Forbes9a083b92016-11-02 16:58:15 +13005287 if (!instance_extension_map[get_dispatch_table(pc_instance_table_map, instance)].android_enabled) {
5288 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
5289 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5290 "vkCreateAndroidSurfaceKHR() called even though the %s extension was not enabled for this VkInstance.",
5291 VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
5292 }
5293
5294 skip_call |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005295
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005296 if (!skip_call) {
5297 result = get_dispatch_table(pc_instance_table_map, instance)
5298 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005299 }
5300
5301 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5302
5303 return result;
5304}
5305#endif // VK_USE_PLATFORM_ANDROID_KHR
5306
Mark Youngead9b932016-09-08 12:28:38 -06005307VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5308 const VkSwapchainCreateInfoKHR *pCreateInfos,
5309 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5310 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5311 bool skip_call = false;
5312 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5313 assert(my_data != NULL);
5314
Chris Forbesbe5f5202016-11-02 18:34:25 +13005315 if (!my_data->display_swapchain_enabled) {
5316 skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT,
5317 reinterpret_cast<uint64_t>(device), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
5318 "vkCreateSharedSwapchainsKHR() called even though the %s extension was not enabled for this VkDevice.",
5319 VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME);
5320 }
5321
Mark Youngead9b932016-09-08 12:28:38 -06005322 skip_call |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
5323 pSwapchains);
5324
5325 if (!skip_call) {
5326 result = get_dispatch_table(pc_device_table_map, device)
5327 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5328
5329 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5330 }
5331
5332 return result;
5333}
5334
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005335// VK_EXT_debug_marker Extension
5336VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5337 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5338 bool skip_call = false;
5339 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5340 assert(my_data != NULL);
5341
5342 skip_call |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
5343
5344 if (!skip_call) {
5345 result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5346
5347 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5348 }
5349
5350 return result;
5351}
5352
5353VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5354 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5355 bool skip_call = false;
5356 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5357 assert(my_data != NULL);
5358
5359 skip_call |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
5360
5361 if (!skip_call) {
5362 VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5363
5364 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5365 }
5366
5367 return result;
5368}
5369
5370VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5371 bool skip_call = false;
5372 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5373 assert(my_data != NULL);
5374
5375 skip_call |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
5376
5377 if (!skip_call) {
5378 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5379 }
5380}
5381
5382VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5383 bool skip_call = false;
5384 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5385 assert(my_data != NULL);
5386
5387 skip_call |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
5388
5389 if (!skip_call) {
5390 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5391 }
5392}
5393
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005394// VK_NV_external_memory_capabilities Extension
5395VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5396 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5397 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5398 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5399
5400 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5401 bool skip_call = false;
5402 layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5403 assert(my_data != NULL);
5404
5405 skip_call |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
5406 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5407
5408 if (!skip_call) {
5409 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5410 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
5411 externalHandleType, pExternalImageFormatProperties);
5412
5413 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5414 }
5415
5416 return result;
5417}
5418
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005419#ifdef VK_USE_PLATFORM_WIN32_KHR
5420// VK_NV_external_memory_win32 Extension
5421VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5422 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5423
5424 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5425 bool skip_call = false;
5426 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5427 assert(my_data != NULL);
5428
5429 skip_call |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
5430
5431 if (!skip_call) {
5432 result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5433 }
5434
5435 return result;
5436}
5437#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005438
5439
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005440
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005441static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005442
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005443static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005444
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005445static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005446
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005447static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005448
Chia-I Wu01ca2372016-05-13 14:37:49 +08005449VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005450 assert(device);
5451
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005452 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5453
Dustin Graves080069b2016-04-05 13:48:15 -06005454 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005455 return NULL;
5456 }
5457
Chia-I Wuf9b01382016-05-16 07:37:41 +08005458 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5459 if (proc)
5460 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005461
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005462 proc = InterceptWsiEnabledCommand(funcName, device);
5463 if (proc)
5464 return proc;
5465
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005466 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005467 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005468 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005469}
5470
Chia-I Wu01ca2372016-05-13 14:37:49 +08005471VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005472 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005473 if (!proc)
5474 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005475
5476 if (!proc)
5477 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005478
Chia-I Wu617f2a42016-05-16 07:41:17 +08005479 if (proc)
5480 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005481
Chia-I Wu617f2a42016-05-16 07:41:17 +08005482 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005483
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005484 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005485
Chia-I Wu617f2a42016-05-16 07:41:17 +08005486 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005487 if (!proc)
5488 proc = InterceptWsiEnabledCommand(funcName, instance);
5489
Chia-I Wu617f2a42016-05-16 07:41:17 +08005490 if (proc)
5491 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005492
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005493 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005494 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005495 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005496}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005497
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005498static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005499 static const struct {
5500 const char *name;
5501 PFN_vkVoidFunction proc;
5502 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005503 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5504 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5505 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5506 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5507 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5508 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5509 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5510 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5511 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5512 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5513 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5514 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5515 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5516 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5517 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5518 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5519 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005520 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005521 };
5522
5523 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5524 if (!strcmp(core_instance_commands[i].name, name))
5525 return core_instance_commands[i].proc;
5526 }
5527
5528 return nullptr;
5529}
5530
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005531static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005532 static const struct {
5533 const char *name;
5534 PFN_vkVoidFunction proc;
5535 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005536 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5537 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5538 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5539 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5540 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5541 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5542 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5543 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5544 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5545 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5546 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5547 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5548 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5549 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5550 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5551 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5552 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5553 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5554 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5555 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5556 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5557 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5558 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5559 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5560 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5561 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5562 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5563 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5564 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5565 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5566 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5567 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5568 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5569 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5570 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5571 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5572 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5573 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5574 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5575 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5576 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5577 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5578 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5579 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5580 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5581 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5582 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5583 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5584 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5585 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5586 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5587 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5588 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5589 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5590 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5591 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5592 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5593 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5594 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5595 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5596 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5597 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5598 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5599 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5600 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5601 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5602 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5603 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5604 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5605 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5606 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5607 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5608 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5609 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5610 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5611 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5612 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5613 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5614 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5615 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5616 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5617 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5618 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5619 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5620 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5621 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5622 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5623 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5624 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5625 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5626 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5627 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5628 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5629 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5630 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5631 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5632 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5633 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5634 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5635 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5636 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5637 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5638 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5639 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5640 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5641 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5642 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5643 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5644 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5645 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5646 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5647 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5648 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5649 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5650 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5651 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5652 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005653 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5654 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5655 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5656 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005657#ifdef VK_USE_PLATFORM_WIN32_KHR
5658 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5659#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005660};
5661
Chia-I Wuf9b01382016-05-16 07:37:41 +08005662
5663 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5664 if (!strcmp(core_device_commands[i].name, name))
5665 return core_device_commands[i].proc;
5666 }
5667
5668 return nullptr;
5669}
5670
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005671static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005672 static const struct {
5673 const char *name;
5674 PFN_vkVoidFunction proc;
5675 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005676 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5677 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5678 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5679 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005680 {"vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005681 };
5682
5683 if (device) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005684 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5685 if (!strcmp(wsi_device_commands[i].name, name))
5686 return wsi_device_commands[i].proc;
Mark Youngead9b932016-09-08 12:28:38 -06005687 }
5688
Chris Forbesbe5f5202016-11-02 18:34:25 +13005689 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
5690 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
Mark Youngead9b932016-09-08 12:28:38 -06005691 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005692 }
5693
5694 return nullptr;
5695}
5696
5697static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5698 static const struct {
5699 const char *name;
5700 PFN_vkVoidFunction proc;
5701 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005702 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5703 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5704 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5705 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5706 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5707 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005708 {"vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005709 };
5710
Chris Forbes8a13e272016-11-02 17:43:34 +13005711 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5712 if (!strcmp(wsi_instance_commands[i].name, name))
5713 return wsi_instance_commands[i].proc;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005714 }
5715
5716#ifdef VK_USE_PLATFORM_WIN32_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005717 if (!strcmp("vkCreateWin32SurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005718 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
Chris Forbes9a083b92016-11-02 16:58:15 +13005719 if (!strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name))
5720 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005721#endif // VK_USE_PLATFORM_WIN32_KHR
5722#ifdef VK_USE_PLATFORM_XCB_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005723 if (!strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005724 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Chris Forbes9a083b92016-11-02 16:58:15 +13005725 if (!strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005726 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
5727#endif // VK_USE_PLATFORM_XCB_KHR
5728#ifdef VK_USE_PLATFORM_XLIB_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005729 if (!strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005730 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Chris Forbes9a083b92016-11-02 16:58:15 +13005731 if (!strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005732 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
5733#endif // VK_USE_PLATFORM_XLIB_KHR
5734#ifdef VK_USE_PLATFORM_MIR_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005735 if (!strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005736 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Chris Forbes9a083b92016-11-02 16:58:15 +13005737 if (!strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005738 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
5739#endif // VK_USE_PLATFORM_MIR_KHR
5740#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005741 if (!strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005742 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Chris Forbes9a083b92016-11-02 16:58:15 +13005743 if (!strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005744 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
5745#endif // VK_USE_PLATFORM_WAYLAND_KHR
5746#ifdef VK_USE_PLATFORM_ANDROID_KHR
Chris Forbes9a083b92016-11-02 16:58:15 +13005747 if (!strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005748 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
5749#endif // VK_USE_PLATFORM_ANDROID_KHR
5750
5751 return nullptr;
5752}
5753
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005754} // namespace parameter_validation
5755
5756// vk_layer_logging.h expects these to be defined
5757
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005758VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5759 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5760 const VkAllocationCallbacks *pAllocator,
5761 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005762 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005763}
5764
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005765VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5766 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005767 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005768}
5769
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005770VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5771 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5772 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005773 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005774}
5775
5776// loader-layer interface v0
5777
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005778VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5779 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005780 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005781}
5782
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005783VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5784 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005785 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005786}
5787
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005788VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5789 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005790 // the layer command handles VK_NULL_HANDLE just fine internally
5791 assert(physicalDevice == VK_NULL_HANDLE);
5792 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005793}
5794
5795VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5796 const char *pLayerName, uint32_t *pCount,
5797 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005798 // the layer command handles VK_NULL_HANDLE just fine internally
5799 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005800 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005801}
5802
5803VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005804 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005805}
5806
5807VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005808 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005809}