blob: 929bc5f3d692948002b56a351b47e530a54f2a78 [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
Chris Forbes7b58a712016-11-24 11:35:31 +130056struct instance_layer_data {
Chris Forbes7b57a392016-11-02 17:56:50 +130057 VkInstance instance = VK_NULL_HANDLE;
Chia-I Wua570b7c2016-05-16 07:48:14 +080058
Chris Forbes7b57a392016-11-02 17:56:50 +130059 debug_report_data *report_data = nullptr;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070060 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060061
Ian Elliotted6b5ac2016-04-28 09:08:13 -060062 // The following are for keeping track of the temporary callbacks that can
63 // be used in vkCreateInstance and vkDestroyInstance:
Chris Forbes7b57a392016-11-02 17:56:50 +130064 uint32_t num_tmp_callbacks = 0;
65 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos = nullptr;
66 VkDebugReportCallbackEXT *tmp_callbacks = nullptr;
Chris Forbes6be763e2016-11-24 12:42:33 +130067 instance_extension_enables extensions = {};
Chris Forbes7b58a712016-11-24 11:35:31 +130068};
Ian Elliotted6b5ac2016-04-28 09:08:13 -060069
Chris Forbes7b58a712016-11-24 11:35:31 +130070struct layer_data {
71 instance_layer_data *instance_data = nullptr;
72
Jon Ashburn5484e0c2016-03-08 17:48:44 -070073 // Device Data
Chris Forbes7b58a712016-11-24 11:35:31 +130074 debug_report_data *report_data = nullptr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070075 // Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060076 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
Chris Forbes7b57a392016-11-02 17:56:50 +130077 VkPhysicalDeviceLimits device_limits = {};
78 VkPhysicalDeviceFeatures physical_device_features = {};
79 VkPhysicalDevice physical_device = VK_NULL_HANDLE;
Michael Lentinebdf744f2016-01-27 15:43:43 -060080
Chris Forbes7b57a392016-11-02 17:56:50 +130081 bool swapchain_enabled = false;
82 bool display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -060083 bool amd_negative_viewport_height_enabled = false;
Cody Northrop55443ef2015-09-28 15:09:32 -060084};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050085
Jon Ashburn5484e0c2016-03-08 17:48:44 -070086static std::unordered_map<void *, layer_data *> layer_data_map;
Chris Forbes7b58a712016-11-24 11:35:31 +130087static std::unordered_map<void *, instance_layer_data *> instance_layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060088static device_table_map pc_device_table_map;
89static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060090
Chris Forbes7b58a712016-11-24 11:35:31 +130091static void init_parameter_validation(instance_layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -060092
Mark Lobodzinski739391a2016-03-17 15:08:18 -060093 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
Jeremy Hayes99a96322015-06-26 12:48:09 -060094}
95
Mark Lobodzinski72ecd912016-08-11 13:25:38 -060096VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
97 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
98 const VkAllocationCallbacks *pAllocator,
99 VkDebugReportCallbackEXT *pMsgCallback) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700100 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700101 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600102
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700103 if (result == VK_SUCCESS) {
Chris Forbes7b58a712016-11-24 11:35:31 +1300104 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinski97c4d512016-05-19 15:27:18 -0600105 result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600106 }
107
108 return result;
109}
110
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600111VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
Chia-I Wu01ca2372016-05-13 14:37:49 +0800112 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700113 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700114 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600115
Chris Forbes7b58a712016-11-24 11:35:31 +1300116 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700117 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600118}
119
Mark Lobodzinski72ecd912016-08-11 13:25:38 -0600120VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
121 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
122 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700123 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
124 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700125}
126
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700127static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Tony Barbour59a47322015-06-24 16:06:58 -0600128
Chia-I Wu3384db82016-05-16 07:30:58 +0800129static const VkLayerProperties global_layer = {
Jon Ashburndc9111c2016-03-22 12:57:13 -0600130 "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
Chia-I Wu3384db82016-05-16 07:30:58 +0800131};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700132
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700133static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600134 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700135 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
136 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
137 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
138 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
139 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 -0700140 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700141 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600142 return false;
143 }
144
145 return true;
146}
147
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700148static std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
149 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600150 return "unrecognized enumerator";
151 }
152
153 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700154 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600155 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
156 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700157 if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600158 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
159 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700160 if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600161 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
162 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700163 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600164 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
165 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700166 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600167 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
168 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700169 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600170 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
171 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700172 if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600173 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
174 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700175 if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600176 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
177 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700178 if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600179 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
180 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700181 if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600182 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
183 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700184 if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800185 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600186 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700187 if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800188 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600189 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700190 if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
Jon Ashburn766866a2016-01-22 15:39:20 -0700191 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
192 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600193
194 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700195 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600196 enumeratorString += string;
197
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700198 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600199 enumeratorString += '|';
200 }
201 }
202
203 return enumeratorString;
204}
205
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700206static bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
207 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
208 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
209 VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
210 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
211 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600212 return false;
213 }
214
215 return true;
216}
217
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700218static std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
219 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600220 return "unrecognized enumerator";
221 }
222
223 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700224 if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600225 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
226 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700227 if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600228 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600229 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700230 if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600231 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
232 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700233 if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600234 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
235 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700236 if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600237 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
238 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700239 if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800240 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600241 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700242 if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600243 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
244 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700245 if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800246 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600247 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600248
249 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700250 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600251 enumeratorString += string;
252
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700253 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600254 enumeratorString += '|';
255 }
256 }
257
258 return enumeratorString;
259}
260
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700261static bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
262 VkQueueFlagBits allFlags =
263 (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
264 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600265 return false;
266 }
267
268 return true;
269}
270
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700271static std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
272 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600273 return "unrecognized enumerator";
274 }
275
276 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700277 if (enumerator & VK_QUEUE_TRANSFER_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800278 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600279 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700280 if (enumerator & VK_QUEUE_COMPUTE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600281 strings.push_back("VK_QUEUE_COMPUTE_BIT");
282 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700283 if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800284 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600285 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700286 if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600287 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
288 }
289
290 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700291 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600292 enumeratorString += string;
293
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700294 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600295 enumeratorString += '|';
296 }
297 }
298
299 return enumeratorString;
300}
301
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700302static bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
303 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
304 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
305 VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
306 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600307 return false;
308 }
309
310 return true;
311}
312
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700313static std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
314 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600315 return "unrecognized enumerator";
316 }
317
318 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700319 if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600320 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
321 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700322 if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800323 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600324 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700325 if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600326 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
327 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700328 if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800329 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600330 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700331 if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800332 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600333 }
334
335 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700336 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600337 enumeratorString += string;
338
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700339 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600340 enumeratorString += '|';
341 }
342 }
343
344 return enumeratorString;
345}
346
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700347static bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700348 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700349 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600350 return false;
351 }
352
353 return true;
354}
355
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700356static std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
357 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600358 return "unrecognized enumerator";
359 }
360
361 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700362 if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800363 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600364 }
365
366 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700367 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600368 enumeratorString += string;
369
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700370 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600371 enumeratorString += '|';
372 }
373 }
374
375 return enumeratorString;
376}
377
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700378static bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
379 VkSparseImageFormatFlagBits allFlags =
380 (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
381 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
382 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600383 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600384 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600385
386 return true;
387}
388
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700389static std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
390 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600391 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600392 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600393
394 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700395 if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800396 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600397 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700398 if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800399 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600400 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700401 if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800402 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600403 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600404
405 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700406 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600407 enumeratorString += string;
408
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700409 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600410 enumeratorString += '|';
411 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600412 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600413
414 return enumeratorString;
415}
416
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700417static bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700418 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700419 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600420 return false;
421 }
422
423 return true;
424}
425
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700426static std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
427 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600428 return "unrecognized enumerator";
429 }
430
431 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700432 if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600433 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
434 }
435
436 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700437 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600438 enumeratorString += string;
439
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700440 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600441 enumeratorString += '|';
442 }
443 }
444
445 return enumeratorString;
446}
447
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700448static bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
449 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
450 VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
451 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
452 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
453 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600454 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
455 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
456 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700457 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600458 return false;
459 }
460
461 return true;
462}
463
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700464static std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
465 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600466 return "unrecognized enumerator";
467 }
468
469 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700470 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700471 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600472 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700473 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700474 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600475 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700476 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700477 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600478 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700479 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700480 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600481 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700482 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700483 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_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_GEOMETRY_SHADER_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700486 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600487 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700488 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700489 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600490 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700491 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700492 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600493 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700494 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700495 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600496 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700497 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700498 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600499 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700500 if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700501 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600502 }
503
504 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700505 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600506 enumeratorString += string;
507
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700508 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600509 enumeratorString += '|';
510 }
511 }
512
513 return enumeratorString;
514}
515
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700516static bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
517 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
518 VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
519 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600520 return false;
521 }
522
523 return true;
524}
525
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700526static std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
527 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600528 return "unrecognized enumerator";
529 }
530
531 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700532 if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600533 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
534 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700535 if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600536 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
537 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700538 if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600539 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
540 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700541 if (enumerator & VK_QUERY_RESULT_64_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600542 strings.push_back("VK_QUERY_RESULT_64_BIT");
543 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600544
545 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700546 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600547 enumeratorString += string;
548
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700549 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600550 enumeratorString += '|';
551 }
552 }
553
554 return enumeratorString;
555}
556
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700557static bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
558 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
559 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
560 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
561 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
562 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600563 return false;
564 }
565
566 return true;
567}
568
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700569static std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
570 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600571 return "unrecognized enumerator";
572 }
573
574 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700575 if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600576 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
577 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700578 if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600579 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
580 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700581 if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600582 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
583 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700584 if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600585 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
586 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700587 if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600588 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
589 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700590 if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800591 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600592 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700593 if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600594 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
595 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700596 if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800597 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600598 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700599 if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600600 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
601 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600602
603 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700604 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600605 enumeratorString += string;
606
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700607 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600608 enumeratorString += '|';
609 }
610 }
611
612 return enumeratorString;
613}
614
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700615static bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
616 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
617 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
618 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600619 return false;
620 }
621
622 return true;
623}
624
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700625static std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
626 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600627 return "unrecognized enumerator";
628 }
629
630 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700631 if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600632 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
633 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700634 if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600635 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
636 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700637 if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600638 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600639 }
640
641 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700642 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600643 enumeratorString += string;
644
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700645 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600646 enumeratorString += '|';
647 }
648 }
649
650 return enumeratorString;
651}
652
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700653static bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
654 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
655 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
656 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
657 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600658 return false;
659 }
660
661 return true;
662}
663
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700664static std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
665 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600666 return "unrecognized enumerator";
667 }
668
669 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700670 if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600671 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
672 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700673 if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600674 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
675 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700676 if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600677 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
678 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700679 if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600680 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
681 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700682 if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -0600683 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600684 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600685
686 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700687 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600688 enumeratorString += string;
689
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700690 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600691 enumeratorString += '|';
692 }
693 }
694
695 return enumeratorString;
696}
697
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700698static bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
699 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
700 VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
701 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600702 return false;
703 }
704
705 return true;
706}
707
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700708static std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
709 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600710 return "unrecognized enumerator";
711 }
712
713 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700714 if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800715 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600716 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700717 if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800718 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600719 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700720 if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800721 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600722 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700723 if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800724 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600725 }
726
727 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700728 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600729 enumeratorString += string;
730
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700731 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600732 enumeratorString += '|';
733 }
734 }
735
736 return enumeratorString;
737}
738
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700739static bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
740 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
741 VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
742 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600743 return false;
744 }
745
746 return true;
747}
748
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700749static std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
750 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600751 return "unrecognized enumerator";
752 }
753
754 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700755 if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600756 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
757 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700758 if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600759 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
760 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700761 if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600762 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600763 }
764
765 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700766 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600767 enumeratorString += string;
768
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700769 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600770 enumeratorString += '|';
771 }
772 }
773
774 return enumeratorString;
775}
776
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700777static bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
778 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
779 VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
780 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
781 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600782 return false;
783 }
784
785 return true;
786}
787
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700788static std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
789 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600790 return "unrecognized enumerator";
791 }
792
793 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700794 if (enumerator & VK_SHADER_STAGE_ALL) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600795 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600796 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700797 if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600798 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600799 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700800 if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600801 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
802 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700803 if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600804 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
805 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700806 if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600807 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600808 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700809 if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600810 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600811 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700812 if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600813 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600814 }
815
816 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700817 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600818 enumeratorString += string;
819
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700820 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600821 enumeratorString += '|';
822 }
823 }
824
825 return enumeratorString;
826}
827
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700828static bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800829 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700830 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
831 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
832 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
833 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
834 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
835 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 -0700836 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700837 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600838 return false;
839 }
840
841 return true;
842}
843
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700844static std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
845 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600846 return "unrecognized enumerator";
847 }
848
849 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700850 if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800851 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
852 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700853 if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
Chia-I Wu89d0f942015-10-31 00:31:16 +0800854 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600855 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700856 if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600857 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600858 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700859 if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600860 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600861 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700862 if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600863 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600864 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700865 if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -0700866 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600867 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700868 if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600869 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600870 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700871 if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600872 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600873 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700874 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -0600875 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600876 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700877 if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600878 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600879 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700880 if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600881 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
882 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700883 if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600884 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
885 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700886 if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700887 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600888 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700889 if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600890 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
891 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700892 if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600893 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
894 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700895 if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600896 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
897 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700898 if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600899 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600900 }
901
902 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700903 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600904 enumeratorString += string;
905
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700906 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600907 enumeratorString += '|';
908 }
909 }
910
911 return enumeratorString;
912}
913
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700914static bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
Chia-I Wua4594202015-10-27 19:54:37 +0800915 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700916 VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
917 VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
918 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
919 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
920 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 +0800921
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700922 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600923 return false;
924 }
925
926 return true;
927}
928
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700929static std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
930 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600931 return "unrecognized enumerator";
932 }
933
934 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700935 if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800936 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600937 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700938 if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800939 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600940 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700941 if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800942 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600943 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700944 if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800945 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600946 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700947 if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800948 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600949 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700950 if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800951 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600952 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700953 if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800954 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600955 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700956 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800957 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600958 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700959 if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800960 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600961 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700962 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800963 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600964 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700965 if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800966 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600967 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700968 if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800969 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600970 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700971 if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800972 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600973 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700974 if (enumerator & VK_ACCESS_HOST_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800975 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600976 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700977 if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800978 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600979 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700980 if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800981 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600982 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700983 if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
Chia-I Wua4594202015-10-27 19:54:37 +0800984 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600985 }
986
987 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700988 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600989 enumeratorString += string;
990
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700991 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600992 enumeratorString += '|';
993 }
994 }
995
996 return enumeratorString;
997}
998
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700999static bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1000 VkCommandPoolCreateFlagBits allFlags =
1001 (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1002 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001003 return false;
1004 }
1005
1006 return true;
1007}
1008
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001009static std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1010 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001011 return "unrecognized enumerator";
1012 }
1013
1014 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001015 if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001016 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001017 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001018 if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001019 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001020 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001021
1022 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001023 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001024 enumeratorString += string;
1025
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001026 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001027 enumeratorString += '|';
1028 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001029 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001030
1031 return enumeratorString;
1032}
1033
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001034static bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001035 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001036 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001037 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001038 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001039
1040 return true;
1041}
1042
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001043static std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1044 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001045 return "unrecognized enumerator";
1046 }
1047
1048 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001049 if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001050 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001051 }
1052
1053 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001054 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001055 enumeratorString += string;
1056
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001057 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001058 enumeratorString += '|';
1059 }
1060 }
1061
1062 return enumeratorString;
1063}
1064
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001065static bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1066 VkCommandBufferUsageFlags allFlags =
1067 (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1068 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1069 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001070 return false;
1071 }
1072
1073 return true;
1074}
1075
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001076static std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1077 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001078 return "unrecognized enumerator";
1079 }
1080
1081 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001082 if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001083 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001084 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001085 if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001086 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001087 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001088 if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001089 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001090 }
1091
1092 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001093 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001094 enumeratorString += string;
1095
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001096 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001097 enumeratorString += '|';
1098 }
1099 }
1100
1101 return enumeratorString;
1102}
1103
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001104static bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001105 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001106 if (enumerator & (~allFlags)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001107 return false;
1108 }
1109
1110 return true;
1111}
1112
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001113static std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1114 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001115 return "unrecognized enumerator";
1116 }
1117
1118 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001119 if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001120 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001121 }
1122
1123 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001124 for (auto const &string : strings) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001125 enumeratorString += string;
1126
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001127 if (string != strings.back()) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001128 enumeratorString += '|';
1129 }
1130 }
1131
1132 return enumeratorString;
1133}
1134
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001135static bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1136 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1137 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1138 if (enumerator & (~allFlags)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001139 return false;
1140 }
1141
1142 return true;
1143}
1144
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001145static std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1146 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001147 return "unrecognized enumerator";
1148 }
1149
1150 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001151 if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001152 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1153 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001154 if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001155 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1156 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001157 if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001158 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1159 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001160 if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001161 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1162 }
1163
1164 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001165 for (auto const &string : strings) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001166 enumeratorString += string;
1167
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001168 if (string != strings.back()) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001169 enumeratorString += '|';
1170 }
1171 }
1172
1173 return enumeratorString;
1174}
1175
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001176static bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001177 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001178 if (enumerator & (~allFlags)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001179 return false;
1180 }
1181
1182 return true;
1183}
1184
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001185static std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1186 if (!ValidateEnumerator(enumerator)) {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001187 return "unrecognized enumerator";
1188 }
1189
1190 std::vector<std::string> strings;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001191 if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001192 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001193 }
1194
1195 std::string enumeratorString;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001196 for (auto const &string : strings) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001197 enumeratorString += string;
1198
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001199 if (string != strings.back()) {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001200 enumeratorString += '|';
1201 }
1202 }
1203
1204 return enumeratorString;
1205}
1206
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001207static const int MaxParamCheckerStringLength = 256;
1208
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001209static bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
Dustin Graves080069b2016-04-05 13:48:15 -06001210 const char *validateString) {
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001211 assert(apiName != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001212 assert(validateString != nullptr);
1213
Chris Forbes04b61da2016-11-03 09:53:59 +13001214 bool skip = false;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001215
1216 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1217
1218 if (result == VK_STRING_ERROR_NONE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001219 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001220 } else if (result & VK_STRING_ERROR_LENGTH) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001221
Chris Forbes04b61da2016-11-03 09:53:59 +13001222 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001223 INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
1224 MaxParamCheckerStringLength);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001225 } else if (result & VK_STRING_ERROR_BAD_DATA) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001226 skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Dustin Graves8ffbbf62016-07-22 13:19:46 -06001227 INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
1228 stringName.get_name().c_str());
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001229 }
Chris Forbes04b61da2016-11-03 09:53:59 +13001230 return skip;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001231}
1232
Dustin Gravesde628532016-04-21 16:30:17 -06001233static bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1234 uint32_t index) {
1235 assert(device_data != nullptr);
1236 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001237 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001238
1239 if (index == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001240 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001241 "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
Dustin Gravesde628532016-04-21 16:30:17 -06001242 } else {
1243 const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1244 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001245 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001246 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1247 "the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001248 function_name, parameter_name, index);
1249 return false;
1250 }
1251 }
1252
Chris Forbes04b61da2016-11-03 09:53:59 +13001253 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001254}
1255
1256static bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1257 const uint32_t count, const uint32_t *indices) {
1258 assert(device_data != nullptr);
1259 debug_report_data *report_data = device_data->report_data;
Chris Forbes04b61da2016-11-03 09:53:59 +13001260 bool skip = false;
Dustin Gravesde628532016-04-21 16:30:17 -06001261
1262 if (indices != nullptr) {
1263 for (uint32_t i = 0; i < count; i++) {
1264 if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001265 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001266 LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
Dustin Gravesde628532016-04-21 16:30:17 -06001267 } else {
1268 const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1269 if (queue_data == device_data->queueFamilyIndexMap.end()) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001270 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06001271 LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1272 "created, via the VkDeviceQueueCreateInfo structure.",
Dustin Gravesde628532016-04-21 16:30:17 -06001273 function_name, parameter_name, i, indices[i]);
1274 return false;
1275 }
1276 }
1277 }
1278 }
1279
Chris Forbes04b61da2016-11-03 09:53:59 +13001280 return skip;
Dustin Gravesde628532016-04-21 16:30:17 -06001281}
1282
Chris Forbes6be763e2016-11-24 12:42:33 +13001283static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data);
Mark Lobodzinski7d80ef62016-08-15 16:22:50 -06001284
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001285VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1286 VkInstance *pInstance) {
Dustin Graves842621d2016-03-03 14:17:08 -07001287 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001288
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001289 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001290 assert(chain_info != nullptr);
1291 assert(chain_info->u.pLayerInfo != nullptr);
1292
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001293 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1294 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Dustin Graves842621d2016-03-03 14:17:08 -07001295 if (fpCreateInstance == NULL) {
1296 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001297 }
1298
Dustin Graves842621d2016-03-03 14:17:08 -07001299 // Advance the link info for the next element on the chain
1300 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1301
1302 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001303
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001304 if (result == VK_SUCCESS) {
Chris Forbes7b58a712016-11-24 11:35:31 +13001305 auto my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), instance_layer_data_map);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001306 assert(my_instance_data != nullptr);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001307
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001308 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
Dustin Graves842621d2016-03-03 14:17:08 -07001309
Chia-I Wua570b7c2016-05-16 07:48:14 +08001310 my_instance_data->instance = *pInstance;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001311 my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1312 pCreateInfo->ppEnabledExtensionNames);
Dustin Graves842621d2016-03-03 14:17:08 -07001313
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001314 // Look for one or more debug report create info structures
1315 // and setup a callback(s) for each one found.
1316 if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1317 &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1318 if (my_instance_data->num_tmp_callbacks > 0) {
1319 // Setup the temporary callback(s) here to catch early issues:
1320 if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1321 my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1322 // Failure of setting up one or more of the callback.
1323 // Therefore, clean up and don't use those callbacks:
1324 layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1325 my_instance_data->num_tmp_callbacks = 0;
1326 }
1327 }
1328 }
1329
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001330 init_parameter_validation(my_instance_data, pAllocator);
Chris Forbes6be763e2016-11-24 12:42:33 +13001331 CheckInstanceRegisterExtensions(pCreateInfo, my_instance_data);
Dustin Graves842621d2016-03-03 14:17:08 -07001332
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001333 // Ordinarily we'd check these before calling down the chain, but none of the layer
1334 // support is in place until now, if we survive we can report the issue now.
1335 parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
Dustin Graves842621d2016-03-03 14:17:08 -07001336
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001337 if (pCreateInfo->pApplicationInfo) {
1338 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1339 validate_string(my_instance_data->report_data, "vkCreateInstance",
1340 "pCreateInfo->VkApplicationInfo->pApplicationName",
1341 pCreateInfo->pApplicationInfo->pApplicationName);
1342 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001343
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001344 if (pCreateInfo->pApplicationInfo->pEngineName) {
1345 validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1346 pCreateInfo->pApplicationInfo->pEngineName);
1347 }
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001348 }
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001349
1350 // Disable the tmp callbacks:
1351 if (my_instance_data->num_tmp_callbacks > 0) {
1352 layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1353 my_instance_data->tmp_callbacks);
1354 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001355 }
1356
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001357 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001358}
1359
Chia-I Wu01ca2372016-05-13 14:37:49 +08001360VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001361 // Grab the key before the instance is destroyed.
1362 dispatch_key key = get_dispatch_key(instance);
Chris Forbes04b61da2016-11-03 09:53:59 +13001363 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001364 auto my_data = get_my_data_ptr(key, instance_layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001365 assert(my_data != NULL);
1366
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001367 // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1368 bool callback_setup = false;
1369 if (my_data->num_tmp_callbacks > 0) {
1370 if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1371 my_data->tmp_callbacks)) {
1372 callback_setup = true;
1373 }
1374 }
1375
Chris Forbes04b61da2016-11-03 09:53:59 +13001376 skip |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001377
Ian Elliotted6b5ac2016-04-28 09:08:13 -06001378 // Disable and cleanup the temporary callback(s):
1379 if (callback_setup) {
1380 layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1381 }
1382 if (my_data->num_tmp_callbacks > 0) {
1383 layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1384 my_data->num_tmp_callbacks = 0;
1385 }
1386
Chris Forbes04b61da2016-11-03 09:53:59 +13001387 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001388 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Dustin Graves27a912a2016-03-07 17:52:14 -07001389 pTable->DestroyInstance(instance, pAllocator);
1390
1391 // Clean up logging callback, if any
1392 while (my_data->logging_callback.size() > 0) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001393 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1394 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001395 my_data->logging_callback.pop_back();
1396 }
1397
Chris Forbes78a56b02016-11-02 16:13:01 +13001398 layer_debug_report_destroy_instance(my_data->report_data);
Dustin Graves27a912a2016-03-07 17:52:14 -07001399 layer_data_map.erase(pTable);
1400
1401 pc_instance_table_map.erase(key);
Tony Barbour24edb7c2016-03-22 13:23:24 -06001402 layer_data_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001403 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001404}
1405
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001406VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
1407 VkPhysicalDevice *pPhysicalDevices) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001408 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001409 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001410 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001411 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001412
Chris Forbes04b61da2016-11-03 09:53:59 +13001413 skip |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001414
Chris Forbes04b61da2016-11-03 09:53:59 +13001415 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001416 result = get_dispatch_table(pc_instance_table_map, instance)
1417 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001418
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001419 validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001420 if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
1421 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
1422 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
1423 // Save the supported features for each physical device
1424 VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
1425 disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
1426 }
1427 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001428 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001429 return result;
1430}
1431
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001432VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001433 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001434 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001435 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001436
Chris Forbes04b61da2016-11-03 09:53:59 +13001437 skip |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001438
Chris Forbes04b61da2016-11-03 09:53:59 +13001439 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001440 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001441 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001442}
1443
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001444VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1445 VkFormatProperties *pFormatProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001446 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001447 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001448 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001449
Chris Forbes04b61da2016-11-03 09:53:59 +13001450 skip |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001451
Chris Forbes04b61da2016-11-03 09:53:59 +13001452 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001453 get_dispatch_table(pc_instance_table_map, physicalDevice)
1454 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001455 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001456}
1457
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001458VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1459 VkImageType type, VkImageTiling tiling,
1460 VkImageUsageFlags usage, VkImageCreateFlags flags,
1461 VkImageFormatProperties *pImageFormatProperties) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001462 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001463 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001464 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001465 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001466
Chris Forbes04b61da2016-11-03 09:53:59 +13001467 skip |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001468 flags, pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001469
Chris Forbes04b61da2016-11-03 09:53:59 +13001470 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001471 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1472 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1473 pImageFormatProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001474
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001475 validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001476 }
Chia-I Wu17241042015-10-31 00:31:16 +08001477
1478 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001479}
1480
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001481VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001482 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001483 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001484 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001485
Chris Forbes04b61da2016-11-03 09:53:59 +13001486 skip |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001487
Chris Forbes04b61da2016-11-03 09:53:59 +13001488 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001489 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001490 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001491}
1492
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001493VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1494 uint32_t *pQueueFamilyPropertyCount,
1495 VkQueueFamilyProperties *pQueueFamilyProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001496 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001497 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001498 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001499
Chris Forbes04b61da2016-11-03 09:53:59 +13001500 skip |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001501 pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001502
Chris Forbes04b61da2016-11-03 09:53:59 +13001503 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001504 get_dispatch_table(pc_instance_table_map, physicalDevice)
1505 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001506 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001507}
1508
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001509VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1510 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001511 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001512 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001513 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001514
Chris Forbes04b61da2016-11-03 09:53:59 +13001515 skip |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001516
Chris Forbes04b61da2016-11-03 09:53:59 +13001517 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001518 get_dispatch_table(pc_instance_table_map, physicalDevice)
1519 ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001520 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001521}
1522
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001523void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1524 const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06001525 std::unordered_set<uint32_t> set;
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001526
Chris Forbes7b58a712016-11-24 11:35:31 +13001527 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes0e0161a2016-11-02 16:21:28 +13001528
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001529 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1530 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1531 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001532 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 -06001533 INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001534 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
1535 "structure.",
1536 i);
1537 } else {
1538 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
Michael Lentinefa71bd52016-01-27 12:50:30 -06001539 }
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001540
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001541 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
1542 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
1543 if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
1544 (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001545 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 -06001546 __LINE__, INVALID_USAGE, LayerName,
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001547 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
1548 "between 0 and 1. Actual value is %f",
1549 i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
1550 }
1551 }
1552 }
1553
1554 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
1555 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001556 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 -06001557 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001558 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1559 "of queue families.",
1560 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001561 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
1562 properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
1563 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13001564 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 -06001565 INVALID_USAGE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001566 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1567 "queues for the given family index.",
1568 i);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001569 }
Michael Lentine774704f2016-01-27 13:36:46 -06001570 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001571 }
1572}
1573
Chris Forbes6be763e2016-11-24 12:42:33 +13001574static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, instance_layer_data *instance_data) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001575
1576 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes6be763e2016-11-24 12:42:33 +13001577 auto name = pCreateInfo->ppEnabledExtensionNames[i];
1578
1579 if (strcmp(name, VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
1580 instance_data->extensions.surface_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001581 }
1582#ifdef VK_USE_PLATFORM_XLIB_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001583 if (strcmp(name, VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
1584 instance_data->extensions.xlib_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001585 }
1586#endif
1587#ifdef VK_USE_PLATFORM_XCB_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001588 if (strcmp(name, VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
1589 instance_data->extensions.xcb_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001590 }
1591#endif
1592#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001593 if (strcmp(name, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
1594 instance_data->extensions.wayland_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001595 }
1596#endif
1597#ifdef VK_USE_PLATFORM_MIR_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001598 if (strcmp(name, VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
1599 instance_data->extensions.mir_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001600 }
1601#endif
1602#ifdef VK_USE_PLATFORM_ANDROID_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001603 if (strcmp(name, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
1604 instance_data->extensions.android_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001605 }
1606#endif
1607#ifdef VK_USE_PLATFORM_WIN32_KHR
Chris Forbes6be763e2016-11-24 12:42:33 +13001608 if (strcmp(name, VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
1609 instance_data->extensions.win32_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001610 }
1611#endif
Chris Forbes6be763e2016-11-24 12:42:33 +13001612 if (strcmp(name, VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
1613 instance_data->extensions.display_enabled = true;
Chris Forbes2e47f432016-11-03 10:18:18 +13001614 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001615 }
1616}
1617
1618static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
1619 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes27e49622016-11-02 17:54:21 +13001620 device_data->swapchain_enabled = false;
1621 device_data->display_swapchain_enabled = false;
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001622 device_data->amd_negative_viewport_height_enabled = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001623
1624 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1625 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001626 device_data->swapchain_enabled = true;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001627 }
Mark Youngead9b932016-09-08 12:28:38 -06001628 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
Chris Forbes27e49622016-11-02 17:54:21 +13001629 device_data->display_swapchain_enabled = true;
Mark Youngead9b932016-09-08 12:28:38 -06001630 }
Mike Weiblen2906c9a2016-10-31 21:04:10 -06001631 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME) == 0) {
1632 device_data->amd_negative_viewport_height_enabled = true;
1633 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001634 }
1635}
1636
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001637void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001638 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001639
1640 if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
1641 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
1642 my_device_data->queueFamilyIndexMap.insert(
1643 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
1644 }
Michael Lentinebdf744f2016-01-27 15:43:43 -06001645 }
1646}
1647
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001648VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
Chia-I Wu01ca2372016-05-13 14:37:49 +08001649 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001650 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06001651 * NOTE: We do not validate physicalDevice or any dispatchable
1652 * object as the first parameter. We couldn't get here if it was wrong!
1653 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001654
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001655 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001656 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13001657 auto my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001658 assert(my_instance_data != nullptr);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001659
Chris Forbes04b61da2016-11-03 09:53:59 +13001660 skip |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
Dustin Graves842621d2016-03-03 14:17:08 -07001661
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001662 if (pCreateInfo != NULL) {
1663 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001664 for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001665 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001666 pCreateInfo->ppEnabledLayerNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001667 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001668 }
Michael Lentine774704f2016-01-27 13:36:46 -06001669
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001670 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
Dustin Graves29148ff2016-03-23 19:44:00 -06001671 for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001672 skip |= validate_string(my_instance_data->report_data, "vkCreateDevice",
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001673 "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001674 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07001675 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001676 }
1677
Chris Forbes04b61da2016-11-03 09:53:59 +13001678 if (!skip) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001679 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001680 assert(chain_info != nullptr);
1681 assert(chain_info->u.pLayerInfo != nullptr);
1682
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001683 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1684 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wua570b7c2016-05-16 07:48:14 +08001685 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001686 if (fpCreateDevice == NULL) {
1687 return VK_ERROR_INITIALIZATION_FAILED;
1688 }
1689
1690 // Advance the link info for the next element on the chain
1691 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1692
1693 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001694
1695 validate_result(my_instance_data->report_data, "vkCreateDevice", result);
1696
1697 if (result == VK_SUCCESS) {
1698 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1699 assert(my_device_data != nullptr);
1700
1701 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1702 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1703
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06001704 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
1705
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001706 uint32_t count;
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001707 VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
1708 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001709 std::vector<VkQueueFamilyProperties> properties(count);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001710 instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001711
1712 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1713 storeCreateDeviceData(*pDevice, pCreateInfo);
Mark Lobodzinskia4932512016-06-27 15:13:00 -06001714
1715 // Query and save physical device limits for this device
1716 VkPhysicalDeviceProperties device_properties = {};
1717 instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
1718 memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06001719 my_device_data->physical_device = physicalDevice;
Mark Lobodzinski7bdd9f22016-08-09 13:41:09 -06001720
1721 // Save app-enabled features in this device's layer_data structure
1722 if (pCreateInfo->pEnabledFeatures) {
1723 my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
1724 } else {
1725 memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
1726 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001727 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001728 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06001729
Jeremy Hayes99a96322015-06-26 12:48:09 -06001730 return result;
1731}
1732
Chia-I Wu01ca2372016-05-13 14:37:49 +08001733VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001734 dispatch_key key = get_dispatch_key(device);
Chris Forbes04b61da2016-11-03 09:53:59 +13001735 bool skip = false;
Dustin Graves27a912a2016-03-07 17:52:14 -07001736 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1737 assert(my_data != NULL);
1738
Chris Forbes04b61da2016-11-03 09:53:59 +13001739 skip |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001740
Chris Forbes04b61da2016-11-03 09:53:59 +13001741 if (!skip) {
Dustin Graves27a912a2016-03-07 17:52:14 -07001742 layer_debug_report_destroy_device(device);
1743
Jeremy Hayes99a96322015-06-26 12:48:09 -06001744#if DISPATCH_MAP_DEBUG
Mark Muelleraab36502016-05-03 13:17:29 -06001745 fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001746#endif
1747
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001748 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001749 pc_device_table_map.erase(key);
Tony Barbourd4eb06d2016-03-29 15:14:59 -06001750 layer_data_map.erase(key);
Dustin Graves27a912a2016-03-07 17:52:14 -07001751 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001752}
1753
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001754bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001755 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001756 assert(my_device_data != nullptr);
1757
Dustin Gravesde628532016-04-21 16:30:17 -06001758 validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06001759
Dustin Gravesf5b498c2016-03-17 11:04:45 -06001760 const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001761 if (queue_data->second <= queueIndex) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001762 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 -06001763 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001764 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1765 "was created.",
1766 queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001767 return false;
1768 }
1769 return true;
1770}
1771
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001772VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001773 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001774 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001775 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06001776
Chris Forbes04b61da2016-11-03 09:53:59 +13001777 skip |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001778
Chris Forbes04b61da2016-11-03 09:53:59 +13001779 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001780 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
1781
1782 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001783 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001784}
1785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001786VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001787 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001788 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001789 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001790 assert(my_data != NULL);
1791
Chris Forbes04b61da2016-11-03 09:53:59 +13001792 skip |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001793
Chris Forbes04b61da2016-11-03 09:53:59 +13001794 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001795 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1796
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001797 validate_result(my_data->report_data, "vkQueueSubmit", result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001798 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001799
Jeremy Hayes99a96322015-06-26 12:48:09 -06001800 return result;
1801}
1802
Chia-I Wu01ca2372016-05-13 14:37:49 +08001803VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001804 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1805 assert(my_data != NULL);
1806
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001807 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001808
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001809 validate_result(my_data->report_data, "vkQueueWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001810
1811 return result;
1812}
1813
Chia-I Wu01ca2372016-05-13 14:37:49 +08001814VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001815 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1816 assert(my_data != NULL);
1817
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001818 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001819
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001820 validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001821
1822 return result;
1823}
1824
Chia-I Wu01ca2372016-05-13 14:37:49 +08001825VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001826 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001827 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001828 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001829 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001830 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001831
Chris Forbes04b61da2016-11-03 09:53:59 +13001832 skip |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001833
Chris Forbes04b61da2016-11-03 09:53:59 +13001834 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001835 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1836
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001837 validate_result(my_data->report_data, "vkAllocateMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001838 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001839
1840 return result;
1841}
1842
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001843VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001844 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001845 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07001846 assert(my_data != NULL);
1847
Chris Forbes04b61da2016-11-03 09:53:59 +13001848 skip |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001849
Chris Forbes04b61da2016-11-03 09:53:59 +13001850 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001851 get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07001852 }
1853}
1854
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001855VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1856 VkMemoryMapFlags flags, void **ppData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001857 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001858 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001859 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001860 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001861
Chris Forbes04b61da2016-11-03 09:53:59 +13001862 skip |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001863
Chris Forbes04b61da2016-11-03 09:53:59 +13001864 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001865 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1866
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001867 validate_result(my_data->report_data, "vkMapMemory", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001868 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001869
1870 return result;
1871}
1872
Chia-I Wu01ca2372016-05-13 14:37:49 +08001873VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001874 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06001875 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1876 assert(my_data != NULL);
1877
Chris Forbes04b61da2016-11-03 09:53:59 +13001878 skip |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
Dustin Graves20fd66f2016-04-18 18:33:21 -06001879
Chris Forbes04b61da2016-11-03 09:53:59 +13001880 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001881 get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1882 }
1883}
1884
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001885VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1886 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001887 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001888 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001889 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001890 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001891
Chris Forbes04b61da2016-11-03 09:53:59 +13001892 skip |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06001893
Chris Forbes04b61da2016-11-03 09:53:59 +13001894 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001895 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1896
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001897 validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001898 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001899
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001900 return result;
1901}
1902
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001903VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1904 const VkMappedMemoryRange *pMemoryRanges) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001905 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001906 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001907 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001908 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001909
Chris Forbes04b61da2016-11-03 09:53:59 +13001910 skip |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06001911
Chris Forbes04b61da2016-11-03 09:53:59 +13001912 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001913 result =
1914 get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001915
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001916 validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001917 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001918
Tony Barbourb1250542015-04-16 19:23:13 -06001919 return result;
1920}
1921
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001922VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1923 VkDeviceSize *pCommittedMemoryInBytes) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001924 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001925 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001926 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001927
Chris Forbes04b61da2016-11-03 09:53:59 +13001928 skip |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001929
Chris Forbes04b61da2016-11-03 09:53:59 +13001930 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001931 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001932 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06001933}
1934
Chia-I Wu01ca2372016-05-13 14:37:49 +08001935VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
1936 VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001937 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001938 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001939 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1940 assert(my_data != NULL);
1941
Chris Forbes04b61da2016-11-03 09:53:59 +13001942 skip |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001943
Chris Forbes04b61da2016-11-03 09:53:59 +13001944 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001945 result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1946
1947 validate_result(my_data->report_data, "vkBindBufferMemory", result);
1948 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001949
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001950 return result;
1951}
1952
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001953VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001954 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13001955 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06001956 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1957 assert(my_data != NULL);
1958
Chris Forbes04b61da2016-11-03 09:53:59 +13001959 skip |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001960
Chris Forbes04b61da2016-11-03 09:53:59 +13001961 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06001962 result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1963
1964 validate_result(my_data->report_data, "vkBindImageMemory", result);
1965 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001966
1967 return result;
1968}
1969
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001970VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1971 VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001972 bool skip = 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
Chris Forbes04b61da2016-11-03 09:53:59 +13001976 skip |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001977
Chris Forbes04b61da2016-11-03 09:53:59 +13001978 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001979 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001980 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001981}
1982
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06001983VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13001984 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001985 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001986 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001987
Chris Forbes04b61da2016-11-03 09:53:59 +13001988 skip |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001989
Chris Forbes04b61da2016-11-03 09:53:59 +13001990 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07001991 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07001992 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001993}
1994
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001995bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
1996 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13001997 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07001998 if (pSparseMemoryRequirements != nullptr) {
Dustin Graves02a24a22016-03-08 13:34:49 -07001999 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002000 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2001 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002002 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 -06002003 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002004 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2005 "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002006 return false;
2007 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002008 }
2009
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002010 return true;
2011}
2012
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002013VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2014 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002015 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002016 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002017 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002018
Chris Forbes04b61da2016-11-03 09:53:59 +13002019 skip |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002020 pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002021
Chris Forbes04b61da2016-11-03 09:53:59 +13002022 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002023 get_dispatch_table(pc_device_table_map, device)
2024 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002025
2026 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2027 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002028}
2029
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002030bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2031 VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2032 uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
Chris Forbes7b58a712016-11-24 11:35:31 +13002033 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002034 if (pProperties != nullptr) {
2035 if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2036 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002037 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 -06002038 LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002039 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2040 "unrecognized enumerator");
Dustin Graves02a24a22016-03-08 13:34:49 -07002041 return false;
2042 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002043 }
2044
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002045 return true;
2046}
2047
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002048VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2049 VkImageType type, VkSampleCountFlagBits samples,
2050 VkImageUsageFlags usage, VkImageTiling tiling,
2051 uint32_t *pPropertyCount,
2052 VkSparseImageFormatProperties *pProperties) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002053 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13002054 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002055 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002056
Chris Forbes04b61da2016-11-03 09:53:59 +13002057 skip |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002058 usage, tiling, pPropertyCount, pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002059
Chris Forbes04b61da2016-11-03 09:53:59 +13002060 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002061 get_dispatch_table(pc_instance_table_map, physicalDevice)
2062 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2063 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002064
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002065 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2066 pProperties);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002067 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002068}
2069
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002070VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2071 VkFence fence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002072 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002073 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002074 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002075 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002076
Chris Forbes04b61da2016-11-03 09:53:59 +13002077 skip |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002078
Chris Forbes04b61da2016-11-03 09:53:59 +13002079 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002080 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2081
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002082 validate_result(my_data->report_data, "vkQueueBindSparse", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002083 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002084
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002085 return result;
2086}
2087
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002088VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2089 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002090 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002091 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002092 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002093 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002094
Chris Forbes04b61da2016-11-03 09:53:59 +13002095 skip |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002096
Chris Forbes04b61da2016-11-03 09:53:59 +13002097 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002098 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2099
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002100 validate_result(my_data->report_data, "vkCreateFence", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002101 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002102
2103 return result;
2104}
2105
Chia-I Wu01ca2372016-05-13 14:37:49 +08002106VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002107 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002108 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002109 assert(my_data != NULL);
2110
Chris Forbes04b61da2016-11-03 09:53:59 +13002111 skip |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002112
Chris Forbes04b61da2016-11-03 09:53:59 +13002113 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002114 get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002115 }
2116}
2117
Chia-I Wu01ca2372016-05-13 14:37:49 +08002118VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002119 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002120 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002121 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002122 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002123
Chris Forbes04b61da2016-11-03 09:53:59 +13002124 skip |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002125
Chris Forbes04b61da2016-11-03 09:53:59 +13002126 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002127 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2128
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002129 validate_result(my_data->report_data, "vkResetFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002130 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002131
2132 return result;
2133}
2134
Chia-I Wu01ca2372016-05-13 14:37:49 +08002135VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002136 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002137 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002138 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2139 assert(my_data != NULL);
2140
Chris Forbes04b61da2016-11-03 09:53:59 +13002141 skip |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002142
Chris Forbes04b61da2016-11-03 09:53:59 +13002143 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002144 result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2145
2146 validate_result(my_data->report_data, "vkGetFenceStatus", result);
2147 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002148
2149 return result;
2150}
2151
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002152VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2153 uint64_t timeout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002154 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002155 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002156 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002157 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002158
Chris Forbes04b61da2016-11-03 09:53:59 +13002159 skip |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002160
Chris Forbes04b61da2016-11-03 09:53:59 +13002161 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002162 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2163
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002164 validate_result(my_data->report_data, "vkWaitForFences", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002165 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002166
2167 return result;
2168}
2169
Chia-I Wu01ca2372016-05-13 14:37:49 +08002170VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002171 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002172 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002173 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002174 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002175 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002176
Chris Forbes04b61da2016-11-03 09:53:59 +13002177 skip |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002178
Chris Forbes04b61da2016-11-03 09:53:59 +13002179 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002180 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2181
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002182 validate_result(my_data->report_data, "vkCreateSemaphore", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002183 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002184
2185 return result;
2186}
2187
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002188VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002189 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002190 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002191 assert(my_data != NULL);
2192
Chris Forbes04b61da2016-11-03 09:53:59 +13002193 skip |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002194
Chris Forbes04b61da2016-11-03 09:53:59 +13002195 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002196 get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002197 }
2198}
2199
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002200VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2201 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002202 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002203 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002204 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002205 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002206
Chris Forbes04b61da2016-11-03 09:53:59 +13002207 skip |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002208
Chris Forbes04b61da2016-11-03 09:53:59 +13002209 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002210 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2211
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002212 validate_result(my_data->report_data, "vkCreateEvent", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002213 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002214
2215 return result;
2216}
2217
Chia-I Wu01ca2372016-05-13 14:37:49 +08002218VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002219 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002220 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002221 assert(my_data != NULL);
2222
Chris Forbes04b61da2016-11-03 09:53:59 +13002223 skip |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002224
Chris Forbes04b61da2016-11-03 09:53:59 +13002225 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002226 get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002227 }
2228}
2229
Chia-I Wu01ca2372016-05-13 14:37:49 +08002230VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002231 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002232 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002233 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2234 assert(my_data != NULL);
2235
Chris Forbes04b61da2016-11-03 09:53:59 +13002236 skip |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002237
Chris Forbes04b61da2016-11-03 09:53:59 +13002238 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002239 result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2240
2241 validate_result(my_data->report_data, "vkGetEventStatus", result);
2242 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002243
2244 return result;
2245}
2246
Chia-I Wu01ca2372016-05-13 14:37:49 +08002247VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002248 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002249 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002250 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2251 assert(my_data != NULL);
2252
Chris Forbes04b61da2016-11-03 09:53:59 +13002253 skip |= parameter_validation_vkSetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002254
Chris Forbes04b61da2016-11-03 09:53:59 +13002255 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002256 result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2257
2258 validate_result(my_data->report_data, "vkSetEvent", result);
2259 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002260
2261 return result;
2262}
2263
Chia-I Wu01ca2372016-05-13 14:37:49 +08002264VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002265 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002266 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002267 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2268 assert(my_data != NULL);
2269
Chris Forbes04b61da2016-11-03 09:53:59 +13002270 skip |= parameter_validation_vkResetEvent(my_data->report_data, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002271
Chris Forbes04b61da2016-11-03 09:53:59 +13002272 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06002273 result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2274
2275 validate_result(my_data->report_data, "vkResetEvent", result);
2276 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002277
2278 return result;
2279}
2280
Chia-I Wu01ca2372016-05-13 14:37:49 +08002281VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002282 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002283 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002284 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002285 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2286 assert(device_data != nullptr);
2287 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002288
Chris Forbes04b61da2016-11-03 09:53:59 +13002289 skip |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002290
Dustin Gravesc900f572016-05-16 11:07:59 -06002291 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2292 if (pCreateInfo != nullptr) {
2293 // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2294 // VkQueryPipelineStatisticFlagBits values
2295 if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2296 ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002297 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002298 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2299 UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2300 "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2301 "a valid combination of VkQueryPipelineStatisticFlagBits values");
2302 }
2303 }
2304
Chris Forbes04b61da2016-11-03 09:53:59 +13002305 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002306 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2307
Dustin Gravesc900f572016-05-16 11:07:59 -06002308 validate_result(report_data, "vkCreateQueryPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002309 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002310
2311 return result;
2312}
2313
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002314VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002315 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002316 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002317 assert(my_data != NULL);
2318
Chris Forbes04b61da2016-11-03 09:53:59 +13002319 skip |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002320
Chris Forbes04b61da2016-11-03 09:53:59 +13002321 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002322 get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002323 }
2324}
2325
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002326VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2327 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002328 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002329 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002330 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002331 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002332
Chris Forbes04b61da2016-11-03 09:53:59 +13002333 skip |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002334 pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002335
Chris Forbes04b61da2016-11-03 09:53:59 +13002336 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002337 result = get_dispatch_table(pc_device_table_map, device)
2338 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002339
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002340 validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002341 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002342
2343 return result;
2344}
2345
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002346VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2347 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002348 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002349 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002350 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2351 assert(device_data != nullptr);
2352 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002353
Karl Schultza9ef1e52016-10-06 17:53:48 -06002354 // TODO: Add check for VALIDATION_ERROR_00660
2355 // TODO: Add check for VALIDATION_ERROR_00661
2356 // TODO: Add check for VALIDATION_ERROR_00662
2357 // TODO: Add check for VALIDATION_ERROR_00670
2358 // TODO: Add check for VALIDATION_ERROR_00671
2359 // TODO: Add check for VALIDATION_ERROR_00672
2360 // TODO: Add check for VALIDATION_ERROR_00673
2361 // TODO: Add check for VALIDATION_ERROR_00674
2362 // TODO: Add check for VALIDATION_ERROR_00675
2363 // TODO: Note that the above errors need to be generated from the next function, which is codegened.
2364 // TODO: Add check for VALIDATION_ERROR_00663
Chris Forbes04b61da2016-11-03 09:53:59 +13002365 skip |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002366
Dustin Gravesc900f572016-05-16 11:07:59 -06002367 if (pCreateInfo != nullptr) {
2368 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2369 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2370 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2371 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002372 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Karl Schultza9ef1e52016-10-06 17:53:48 -06002373 __LINE__, VALIDATION_ERROR_00665, LayerName,
2374 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2375 "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
2376 validation_error_map[VALIDATION_ERROR_00665]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002377 }
Dustin Graves1e92cd72016-02-09 14:00:18 -07002378
Dustin Gravesc900f572016-05-16 11:07:59 -06002379 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2380 // queueFamilyIndexCount uint32_t values
2381 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002382 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Karl Schultza9ef1e52016-10-06 17:53:48 -06002383 __LINE__, VALIDATION_ERROR_00664, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002384 "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2385 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
Karl Schultza9ef1e52016-10-06 17:53:48 -06002386 "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
2387 validation_error_map[VALIDATION_ERROR_00664]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002388 }
2389
2390 // Ensure that the queue family indices were specified at device creation
Chris Forbes04b61da2016-11-03 09:53:59 +13002391 skip |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesc900f572016-05-16 11:07:59 -06002392 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2393 }
2394 }
2395
Chris Forbes04b61da2016-11-03 09:53:59 +13002396 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002397 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2398
Dustin Gravesc900f572016-05-16 11:07:59 -06002399 validate_result(report_data, "vkCreateBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002400 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002401
2402 return result;
2403}
2404
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002405VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002406 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002407 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002408 assert(my_data != NULL);
2409
Chris Forbes04b61da2016-11-03 09:53:59 +13002410 skip |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002411
Chris Forbes04b61da2016-11-03 09:53:59 +13002412 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002413 get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002414 }
2415}
2416
Chia-I Wu01ca2372016-05-13 14:37:49 +08002417VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
2418 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002419 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002420 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002421 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002422 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002423
Chris Forbes04b61da2016-11-03 09:53:59 +13002424 skip |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002425
Chris Forbes04b61da2016-11-03 09:53:59 +13002426 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002427 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2428
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002429 validate_result(my_data->report_data, "vkCreateBufferView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002430 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002431
2432 return result;
2433}
2434
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002435VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002436 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002437 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002438 assert(my_data != NULL);
2439
Chris Forbes04b61da2016-11-03 09:53:59 +13002440 skip |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002441
Chris Forbes04b61da2016-11-03 09:53:59 +13002442 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002443 get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002444 }
2445}
2446
Chia-I Wu01ca2372016-05-13 14:37:49 +08002447VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
2448 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Dustin Gravesf8032f22016-05-11 18:31:44 -06002449 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002450 bool skip = false;
Dustin Gravesf8032f22016-05-11 18:31:44 -06002451 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Gravesc900f572016-05-16 11:07:59 -06002452 assert(device_data != nullptr);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002453 debug_report_data *report_data = device_data->report_data;
2454
Chris Forbes04b61da2016-11-03 09:53:59 +13002455 skip |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002456
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002457 if (pCreateInfo != nullptr) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002458 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
Dustin Graves29148ff2016-03-23 19:44:00 -06002459 if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
Dustin Gravesc900f572016-05-16 11:07:59 -06002460 // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2461 if (pCreateInfo->queueFamilyIndexCount <= 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002462 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002463 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2464 INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2465 "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2466 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002467
Dustin Gravesc900f572016-05-16 11:07:59 -06002468 // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2469 // queueFamilyIndexCount uint32_t values
2470 if (pCreateInfo->pQueueFamilyIndices == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002471 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002472 __LINE__, REQUIRED_PARAMETER, LayerName,
2473 "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2474 "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2475 "pCreateInfo->queueFamilyIndexCount uint32_t values");
2476 }
Dustin Gravesf8032f22016-05-11 18:31:44 -06002477
Chris Forbes04b61da2016-11-03 09:53:59 +13002478 skip |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
Dustin Gravesf8032f22016-05-11 18:31:44 -06002479 pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2480 }
2481
2482 // width, height, and depth members of extent must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002483 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2484 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002485 ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
Chris Forbes04b61da2016-11-03 09:53:59 +13002486 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002487
2488 // mipLevels must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002489 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002490
2491 // arrayLayers must be greater than 0
Chris Forbes04b61da2016-11-03 09:53:59 +13002492 skip |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
Dustin Gravesf8032f22016-05-11 18:31:44 -06002493
2494 // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
2495 if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002496 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002497 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002498 "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002499 }
2500
2501 if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
2502 // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
2503 // extent.height must be equal
2504 if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
2505 (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002506 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002507 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2508 "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2509 "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002510 }
2511
2512 if (pCreateInfo->extent.depth != 1) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002513 skip |=
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06002514 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
Dustin Gravesf8032f22016-05-11 18:31:44 -06002515 "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
2516 }
2517 }
2518
2519 // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
2520 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
2521 if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002522 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002523 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2524 "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2525 "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
Dustin Gravesf8032f22016-05-11 18:31:44 -06002526 }
2527
2528 // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
2529 // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
2530 if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
2531 ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002532 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002533 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2534 "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2535 "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002536 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002537 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002538
Chris Forbes04b61da2016-11-03 09:53:59 +13002539 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002540 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2541
Dustin Gravesf8032f22016-05-11 18:31:44 -06002542 validate_result(report_data, "vkCreateImage", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002543 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002544
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002545 return result;
2546}
2547
Chia-I Wu01ca2372016-05-13 14:37:49 +08002548VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002549 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002550 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002551 assert(my_data != NULL);
2552
Chris Forbes04b61da2016-11-03 09:53:59 +13002553 skip |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002554
Chris Forbes04b61da2016-11-03 09:53:59 +13002555 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002556 get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002557 }
2558}
2559
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002560bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002561 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002562 if (pSubresource != nullptr) {
2563 if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2564 VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002565 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 -06002566 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002567 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2568 return false;
2569 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002570 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002571
2572 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002573}
2574
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002575VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2576 VkSubresourceLayout *pLayout) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002577 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002578 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002579 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002580
Chris Forbes04b61da2016-11-03 09:53:59 +13002581 skip |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002582
Chris Forbes04b61da2016-11-03 09:53:59 +13002583 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002584 PreGetImageSubresourceLayout(device, pSubresource);
2585
2586 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002587 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002588}
2589
Chia-I Wu01ca2372016-05-13 14:37:49 +08002590VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
2591 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002592 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002593 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002594 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002595 assert(my_data != NULL);
Dustin Graves0b70a632016-04-27 17:44:56 -06002596 debug_report_data *report_data = my_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002597
Chris Forbes04b61da2016-11-03 09:53:59 +13002598 skip |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002599
Dustin Graves0b70a632016-04-27 17:44:56 -06002600 if (pCreateInfo != nullptr) {
2601 if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002602 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2603 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002604 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002605 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
2606 "pCreateInfo->subresourceRange.layerCount must be 1",
2607 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
2608 }
2609 } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
Dustin Graves2a80dc62016-07-12 13:57:02 -06002610 (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2611 if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2612 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002613 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002614 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
2615 "pCreateInfo->subresourceRange.layerCount must be >= 1",
2616 ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
2617 }
2618 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002619 if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2620 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002621 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002622 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
2623 "pCreateInfo->subresourceRange.layerCount must be 6");
2624 }
2625 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
Dustin Graves2a80dc62016-07-12 13:57:02 -06002626 if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2627 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002628 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002629 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
2630 "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
2631 }
2632 } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
2633 if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002634 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002635 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2636 "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
2637 }
2638
Dustin Graves2a80dc62016-07-12 13:57:02 -06002639 if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2640 (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002641 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
Dustin Graves0b70a632016-04-27 17:44:56 -06002642 LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
2643 "pCreateInfo->subresourceRange.layerCount must be 1");
2644 }
2645 }
2646 }
2647
Chris Forbes04b61da2016-11-03 09:53:59 +13002648 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002649 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2650
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002651 validate_result(my_data->report_data, "vkCreateImageView", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002652 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002653
2654 return result;
2655}
2656
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002657VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002658 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002659 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002660 assert(my_data != NULL);
2661
Chris Forbes04b61da2016-11-03 09:53:59 +13002662 skip |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002663
Chris Forbes04b61da2016-11-03 09:53:59 +13002664 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002665 get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002666 }
2667}
2668
Chia-I Wu01ca2372016-05-13 14:37:49 +08002669VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002670 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002671 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002672 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002673 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002674 assert(my_data != NULL);
2675
Chris Forbes04b61da2016-11-03 09:53:59 +13002676 skip |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002677
Chris Forbes04b61da2016-11-03 09:53:59 +13002678 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002679 result =
2680 get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002681
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002682 validate_result(my_data->report_data, "vkCreateShaderModule", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002683 }
2684
Michael Lentine03d8e572015-09-15 14:59:14 -05002685 return result;
2686}
2687
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002688VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2689 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002690 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002691 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002692 assert(my_data != NULL);
2693
Chris Forbes04b61da2016-11-03 09:53:59 +13002694 skip |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002695
Chris Forbes04b61da2016-11-03 09:53:59 +13002696 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002697 get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002698 }
2699}
2700
Chia-I Wu01ca2372016-05-13 14:37:49 +08002701VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002702 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002703 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002704 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002705 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002706 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002707
Chris Forbes04b61da2016-11-03 09:53:59 +13002708 skip |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002709
Chris Forbes04b61da2016-11-03 09:53:59 +13002710 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002711 result =
2712 get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002713
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002714 validate_result(my_data->report_data, "vkCreatePipelineCache", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002715 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002716
2717 return result;
2718}
2719
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002720VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2721 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002722 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002723 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07002724 assert(my_data != NULL);
2725
Chris Forbes04b61da2016-11-03 09:53:59 +13002726 skip |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002727
Chris Forbes04b61da2016-11-03 09:53:59 +13002728 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002729 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07002730 }
2731}
2732
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002733VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2734 void *pData) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002735 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002736 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002737 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002738 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002739
Chris Forbes04b61da2016-11-03 09:53:59 +13002740 skip |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002741
Chris Forbes04b61da2016-11-03 09:53:59 +13002742 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002743 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2744
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002745 validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002746 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002747
2748 return result;
2749}
2750
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002751VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2752 const VkPipelineCache *pSrcCaches) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002753 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002754 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002755 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002756 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002757
Chris Forbes04b61da2016-11-03 09:53:59 +13002758 skip |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002759
Chris Forbes04b61da2016-11-03 09:53:59 +13002760 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07002761 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2762
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06002763 validate_result(my_data->report_data, "vkMergePipelineCaches", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07002764 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002765
2766 return result;
2767}
2768
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002769bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002770 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2771
2772 // TODO: Handle count
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002773 if (pCreateInfos != nullptr) {
2774 if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2775 if (pCreateInfos->basePipelineIndex != -1) {
2776 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002777 log_msg(data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002778 VALIDATION_ERROR_00526, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002779 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2780 "pCreateInfos->flags "
Mike Weiblen9858d962016-10-31 23:59:10 -06002781 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1. %s",
2782 validation_error_map[VALIDATION_ERROR_00526]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002783 return false;
2784 }
2785 }
2786
2787 if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2788 if (pCreateInfos->basePipelineIndex != -1) {
2789 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002790 data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002791 VALIDATION_ERROR_00528, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002792 "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2793 "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
Mike Weiblen9858d962016-10-31 23:59:10 -06002794 "VK_NULL_HANDLE. %s",
2795 validation_error_map[VALIDATION_ERROR_00528]);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002796 return false;
2797 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002798 }
2799 }
2800
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002801 if (pCreateInfos->pRasterizationState != nullptr) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002802 if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13002803 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 -06002804 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002805 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2806 "unrecognized enumerator");
2807 return false;
2808 }
Mark Lobodzinski2e67fdb2016-08-09 13:10:51 -06002809
2810 if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
2811 (data->physical_device_features.fillModeNonSolid == false)) {
2812 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13002813 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 -06002814 DEVICE_FEATURE, LayerName,
2815 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
2816 "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
2817 return false;
2818 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002819 }
Jeremy Hayes2fdaaf22016-03-01 17:51:54 -07002820
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002821 size_t i = 0;
Dustin Graves29148ff2016-03-23 19:44:00 -06002822 for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002823 validate_string(data->report_data, "vkCreateGraphicsPipelines",
2824 ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002825 pCreateInfos[i].pStages[j].pName);
2826 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002827 }
2828
2829 return true;
2830}
2831
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06002832VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2833 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2834 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07002835 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13002836 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06002837 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2838 assert(device_data != nullptr);
2839 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002840
Chris Forbes04b61da2016-11-03 09:53:59 +13002841 skip |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
Dustin Gravesc900f572016-05-16 11:07:59 -06002842 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002843
Dustin Gravesc900f572016-05-16 11:07:59 -06002844 if (pCreateInfos != nullptr) {
2845 for (uint32_t i = 0; i < createInfoCount; ++i) {
2846 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2847 if (pCreateInfos[i].pTessellationState == nullptr) {
2848 if (pCreateInfos[i].pStages != nullptr) {
2849 // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2850 // pTessellationState must not be NULL
2851 bool has_control = false;
2852 bool has_eval = false;
2853
2854 for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2855 if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2856 has_control = true;
2857 } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2858 has_eval = true;
2859 }
2860 }
2861
2862 if (has_control && has_eval) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002863 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002864 __LINE__, VALIDATION_ERROR_00536, LayerName,
2865 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2866 "control shader stage and a tessellation evaluation shader stage, "
2867 "pCreateInfos[%d].pTessellationState must not be NULL. %s",
2868 i, i, validation_error_map[VALIDATION_ERROR_00536]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002869 }
2870 }
Dustin Graves629259b2016-05-30 16:14:27 -06002871 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002872 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002873 report_data, "vkCreateGraphicsPipelines",
2874 ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
2875 pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002876
Chris Forbes04b61da2016-11-03 09:53:59 +13002877 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002878 report_data, "vkCreateGraphicsPipelines",
2879 ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
2880 pCreateInfos[i].pTessellationState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06002881
2882 if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002883 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002884 __LINE__, VALIDATION_ERROR_00538, LayerName,
2885 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2886 "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO. %s",
2887 i, validation_error_map[VALIDATION_ERROR_00538]);
Dustin Graves629259b2016-05-30 16:14:27 -06002888 }
Dustin Gravesc900f572016-05-16 11:07:59 -06002889 }
2890
2891 if (pCreateInfos[i].pViewportState == nullptr) {
2892 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2893 // valid VkPipelineViewportStateCreateInfo structure
2894 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2895 (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002896 skip |= log_msg(
Dustin Gravesc900f572016-05-16 11:07:59 -06002897 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblen9858d962016-10-31 23:59:10 -06002898 VALIDATION_ERROR_02113, LayerName,
Dustin Gravesc900f572016-05-16 11:07:59 -06002899 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
Mike Weiblen9858d962016-10-31 23:59:10 -06002900 "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure. "
2901 "%s",
2902 i, i, validation_error_map[VALIDATION_ERROR_02113]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002903 }
2904 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002905 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002906 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2907 ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
2908 NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002909
Chris Forbes04b61da2016-11-03 09:53:59 +13002910 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002911 validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
2912 ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
Dustin Graves629259b2016-05-30 16:14:27 -06002913 pCreateInfos[i].pViewportState->flags);
2914
Dustin Gravesc900f572016-05-16 11:07:59 -06002915 if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002916 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002917 __LINE__, INVALID_STRUCT_STYPE, LayerName,
2918 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2919 "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2920 i);
2921 }
2922
2923 if (pCreateInfos[i].pDynamicState != nullptr) {
2924 bool has_dynamic_viewport = false;
2925 bool has_dynamic_scissor = false;
2926
2927 for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2928 if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2929 has_dynamic_viewport = true;
2930 } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2931 has_dynamic_scissor = true;
2932 }
2933 }
2934
2935 // viewportCount must be greater than 0
2936 // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2937 if (pCreateInfos[i].pViewportState->viewportCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002938 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002939 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002940 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2941 "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002942 "must be greater than 0",
2943 i, i);
2944 }
2945
2946 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2947 // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2948 if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002949 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002950 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002951 __LINE__, VALIDATION_ERROR_02110, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002952 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002953 "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL. %s",
2954 i, i, validation_error_map[VALIDATION_ERROR_02110]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002955 }
2956
2957 // scissorCount must be greater than 0
2958 // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2959 if (pCreateInfos[i].pViewportState->scissorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002960 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06002961 __LINE__, REQUIRED_PARAMETER, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002962 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
2963 "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
Dustin Gravesc900f572016-05-16 11:07:59 -06002964 "must be greater than 0",
2965 i, i);
2966 }
2967
2968 // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2969 // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2970 if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13002971 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06002972 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mike Weiblen9858d962016-10-31 23:59:10 -06002973 __LINE__, VALIDATION_ERROR_02111, LayerName,
Tobin Ehlisbebd3162016-08-18 10:53:58 -06002974 "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
Mike Weiblen9858d962016-10-31 23:59:10 -06002975 "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL. %s",
2976 i, i, validation_error_map[VALIDATION_ERROR_02111]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002977 }
2978 }
2979 }
2980
2981 if (pCreateInfos[i].pMultisampleState == nullptr) {
2982 // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2983 // a valid VkPipelineMultisampleStateCreateInfo structure
2984 if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2985 pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
Mike Weiblen9858d962016-10-31 23:59:10 -06002986 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2987 __LINE__, VALIDATION_ERROR_02114, LayerName,
2988 "vkCreateGraphicsPipelines: if "
2989 "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2990 "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL. %s",
2991 i, i, validation_error_map[VALIDATION_ERROR_02114]);
Dustin Gravesc900f572016-05-16 11:07:59 -06002992 }
Dustin Graves629259b2016-05-30 16:14:27 -06002993 } else {
Chris Forbes04b61da2016-11-03 09:53:59 +13002994 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06002995 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
2996 ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
Dustin Gravesaf5c0292016-07-19 13:43:53 -06002997 NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06002998
Chris Forbes04b61da2016-11-03 09:53:59 +13002999 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003000 report_data, "vkCreateGraphicsPipelines",
3001 ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
3002 pCreateInfos[i].pMultisampleState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003003
Chris Forbes04b61da2016-11-03 09:53:59 +13003004 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003005 report_data, "vkCreateGraphicsPipelines",
3006 ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
3007 pCreateInfos[i].pMultisampleState->sampleShadingEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003008
Chris Forbes04b61da2016-11-03 09:53:59 +13003009 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003010 report_data, "vkCreateGraphicsPipelines",
3011 ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
3012 ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
3013 pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
3014 false);
Dustin Graves629259b2016-05-30 16:14:27 -06003015
Chris Forbes04b61da2016-11-03 09:53:59 +13003016 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003017 report_data, "vkCreateGraphicsPipelines",
3018 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
3019 pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003020
Chris Forbes04b61da2016-11-03 09:53:59 +13003021 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003022 report_data, "vkCreateGraphicsPipelines",
3023 ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
3024 pCreateInfos[i].pMultisampleState->alphaToOneEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003025
3026 if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003027 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Graves629259b2016-05-30 16:14:27 -06003028 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3029 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3030 "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3031 i);
3032 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003033 }
3034
3035 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
Dustin Graves629259b2016-05-30 16:14:27 -06003036 if (pCreateInfos[i].pDepthStencilState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003037 skip |= validate_struct_pnext(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003038 report_data, "vkCreateGraphicsPipelines",
3039 ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
3040 pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003041
Chris Forbes04b61da2016-11-03 09:53:59 +13003042 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003043 report_data, "vkCreateGraphicsPipelines",
3044 ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
3045 pCreateInfos[i].pDepthStencilState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003046
Chris Forbes04b61da2016-11-03 09:53:59 +13003047 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003048 report_data, "vkCreateGraphicsPipelines",
3049 ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
3050 pCreateInfos[i].pDepthStencilState->depthTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003051
Chris Forbes04b61da2016-11-03 09:53:59 +13003052 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003053 report_data, "vkCreateGraphicsPipelines",
3054 ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
3055 pCreateInfos[i].pDepthStencilState->depthWriteEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003056
Chris Forbes04b61da2016-11-03 09:53:59 +13003057 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003058 report_data, "vkCreateGraphicsPipelines",
3059 ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
3060 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3061 pCreateInfos[i].pDepthStencilState->depthCompareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003062
Chris Forbes04b61da2016-11-03 09:53:59 +13003063 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003064 report_data, "vkCreateGraphicsPipelines",
3065 ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
3066 pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003067
Chris Forbes04b61da2016-11-03 09:53:59 +13003068 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003069 report_data, "vkCreateGraphicsPipelines",
3070 ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
3071 pCreateInfos[i].pDepthStencilState->stencilTestEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003072
Chris Forbes04b61da2016-11-03 09:53:59 +13003073 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003074 report_data, "vkCreateGraphicsPipelines",
3075 ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
3076 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3077 pCreateInfos[i].pDepthStencilState->front.failOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003078
Chris Forbes04b61da2016-11-03 09:53:59 +13003079 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003080 report_data, "vkCreateGraphicsPipelines",
3081 ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
3082 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3083 pCreateInfos[i].pDepthStencilState->front.passOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003084
Chris Forbes04b61da2016-11-03 09:53:59 +13003085 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003086 report_data, "vkCreateGraphicsPipelines",
3087 ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
3088 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3089 pCreateInfos[i].pDepthStencilState->front.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003090
Chris Forbes04b61da2016-11-03 09:53:59 +13003091 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003092 report_data, "vkCreateGraphicsPipelines",
3093 ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
3094 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3095 pCreateInfos[i].pDepthStencilState->front.compareOp);
3096
Chris Forbes04b61da2016-11-03 09:53:59 +13003097 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003098 report_data, "vkCreateGraphicsPipelines",
3099 ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003100 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3101
Chris Forbes04b61da2016-11-03 09:53:59 +13003102 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003103 report_data, "vkCreateGraphicsPipelines",
3104 ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
Dustin Graves629259b2016-05-30 16:14:27 -06003105 VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3106
Chris Forbes04b61da2016-11-03 09:53:59 +13003107 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003108 report_data, "vkCreateGraphicsPipelines",
3109 ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
3110 "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
3111 pCreateInfos[i].pDepthStencilState->back.depthFailOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003112
Chris Forbes04b61da2016-11-03 09:53:59 +13003113 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003114 report_data, "vkCreateGraphicsPipelines",
3115 ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
3116 "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
3117 pCreateInfos[i].pDepthStencilState->back.compareOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003118
3119 if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003120 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Graves629259b2016-05-30 16:14:27 -06003121 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3122 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3123 "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3124 i);
3125 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003126 }
3127
3128 // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3129 if (pCreateInfos[i].pColorBlendState != nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003130 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003131 validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
3132 ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
3133 NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003134
Chris Forbes04b61da2016-11-03 09:53:59 +13003135 skip |= validate_reserved_flags(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003136 report_data, "vkCreateGraphicsPipelines",
3137 ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
3138 pCreateInfos[i].pColorBlendState->flags);
Dustin Graves629259b2016-05-30 16:14:27 -06003139
Chris Forbes04b61da2016-11-03 09:53:59 +13003140 skip |= validate_bool32(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003141 report_data, "vkCreateGraphicsPipelines",
3142 ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
3143 pCreateInfos[i].pColorBlendState->logicOpEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003144
Chris Forbes04b61da2016-11-03 09:53:59 +13003145 skip |= validate_array(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003146 report_data, "vkCreateGraphicsPipelines",
3147 ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
3148 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
3149 pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
Dustin Graves629259b2016-05-30 16:14:27 -06003150
3151 if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3152 for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3153 ++attachmentIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003154 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003155 validate_bool32(report_data, "vkCreateGraphicsPipelines",
3156 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
3157 ParameterName::IndexVector{i, attachmentIndex}),
3158 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
Dustin Graves629259b2016-05-30 16:14:27 -06003159
Chris Forbes04b61da2016-11-03 09:53:59 +13003160 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003161 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003162 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
3163 ParameterName::IndexVector{i, attachmentIndex}),
3164 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003165 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3166
Chris Forbes04b61da2016-11-03 09:53:59 +13003167 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003168 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003169 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
3170 ParameterName::IndexVector{i, attachmentIndex}),
3171 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003172 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3173
Chris Forbes04b61da2016-11-03 09:53:59 +13003174 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003175 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3176 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
3177 ParameterName::IndexVector{i, attachmentIndex}),
3178 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3179 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003180
Chris Forbes04b61da2016-11-03 09:53:59 +13003181 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003182 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003183 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
3184 ParameterName::IndexVector{i, attachmentIndex}),
3185 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003186 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3187
Chris Forbes04b61da2016-11-03 09:53:59 +13003188 skip |= validate_ranged_enum(
Dustin Graves629259b2016-05-30 16:14:27 -06003189 report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003190 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
3191 ParameterName::IndexVector{i, attachmentIndex}),
3192 "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
Dustin Graves629259b2016-05-30 16:14:27 -06003193 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3194
Chris Forbes04b61da2016-11-03 09:53:59 +13003195 skip |=
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003196 validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
3197 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
3198 ParameterName::IndexVector{i, attachmentIndex}),
3199 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
3200 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
Dustin Graves629259b2016-05-30 16:14:27 -06003201
Chris Forbes04b61da2016-11-03 09:53:59 +13003202 skip |=
Dustin Graves629259b2016-05-30 16:14:27 -06003203 validate_flags(report_data, "vkCreateGraphicsPipelines",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003204 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
3205 ParameterName::IndexVector{i, attachmentIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003206 "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3207 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3208 }
3209 }
3210
Dustin Gravesc900f572016-05-16 11:07:59 -06003211 if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003212 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003213 __LINE__, INVALID_STRUCT_STYPE, LayerName,
3214 "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3215 "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3216 i);
3217 }
3218
3219 // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3220 if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003221 skip |= validate_ranged_enum(
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003222 report_data, "vkCreateGraphicsPipelines",
3223 ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003224 VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3225 }
3226 }
3227 }
3228 }
3229
Chris Forbes04b61da2016-11-03 09:53:59 +13003230 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003231 PreCreateGraphicsPipelines(device, pCreateInfos);
3232
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003233 result = get_dispatch_table(pc_device_table_map, device)
3234 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003235
Dustin Gravesc900f572016-05-16 11:07:59 -06003236 validate_result(report_data, "vkCreateGraphicsPipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003237 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003238
3239 return result;
3240}
3241
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003242bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003243 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3244
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003245 if (pCreateInfos != nullptr) {
3246 // TODO: Handle count!
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003247 uint32_t i = 0;
3248 validate_string(data->report_data, "vkCreateComputePipelines",
3249 ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003250 }
3251
3252 return true;
3253}
3254
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003255VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3256 const VkComputePipelineCreateInfo *pCreateInfos,
3257 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003258 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003259 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003260 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003261 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003262
Chris Forbes04b61da2016-11-03 09:53:59 +13003263 skip |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003264 pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003265
Chris Forbes04b61da2016-11-03 09:53:59 +13003266 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003267 PreCreateComputePipelines(device, pCreateInfos);
3268
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003269 result = get_dispatch_table(pc_device_table_map, device)
3270 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003271
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003272 validate_result(my_data->report_data, "vkCreateComputePipelines", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003273 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003274
3275 return result;
3276}
3277
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003278VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003279 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003280 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003281 assert(my_data != NULL);
3282
Chris Forbes04b61da2016-11-03 09:53:59 +13003283 skip |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003284
Chris Forbes04b61da2016-11-03 09:53:59 +13003285 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003286 get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003287 }
3288}
3289
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003290VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3291 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003292 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003293 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003294 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003295 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003296
Chris Forbes04b61da2016-11-03 09:53:59 +13003297 skip |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003298
Chris Forbes04b61da2016-11-03 09:53:59 +13003299 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003300 result =
3301 get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003302
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003303 validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003304 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003305
3306 return result;
3307}
3308
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003309VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3310 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003311 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003312 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003313 assert(my_data != NULL);
3314
Chris Forbes04b61da2016-11-03 09:53:59 +13003315 skip |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003316
Chris Forbes04b61da2016-11-03 09:53:59 +13003317 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003318 get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003319 }
3320}
3321
Chia-I Wu01ca2372016-05-13 14:37:49 +08003322VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
3323 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003324 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003325 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003326 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3327 assert(device_data != NULL);
3328 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003329
Chris Forbes04b61da2016-11-03 09:53:59 +13003330 skip |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003331
Dustin Gravesc900f572016-05-16 11:07:59 -06003332 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3333 if (pCreateInfo != nullptr) {
3334 // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3335 if (pCreateInfo->compareEnable == VK_TRUE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003336 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
Dustin Gravesc900f572016-05-16 11:07:59 -06003337 VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3338 }
3339
3340 // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3341 // valid VkBorderColor value
3342 if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3343 (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3344 (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003345 skip |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
Dustin Gravesc900f572016-05-16 11:07:59 -06003346 VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3347 }
3348 }
3349
Chris Forbes04b61da2016-11-03 09:53:59 +13003350 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003351 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3352
Dustin Gravesc900f572016-05-16 11:07:59 -06003353 validate_result(report_data, "vkCreateSampler", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003354 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003355
3356 return result;
3357}
3358
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003359VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003360 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003361 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003362 assert(my_data != NULL);
3363
Chris Forbes04b61da2016-11-03 09:53:59 +13003364 skip |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003365
Chris Forbes04b61da2016-11-03 09:53:59 +13003366 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003367 get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003368 }
3369}
3370
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003371VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3372 const VkAllocationCallbacks *pAllocator,
3373 VkDescriptorSetLayout *pSetLayout) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003374 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003375 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003376 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3377 assert(device_data != nullptr);
3378 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003379
Chris Forbes04b61da2016-11-03 09:53:59 +13003380 skip |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003381
Dustin Gravesc900f572016-05-16 11:07:59 -06003382 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3383 if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3384 for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3385 if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3386 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3387 // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3388 // valid VkSampler handles
3389 if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3390 (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3391 (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3392 for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3393 ++descriptor_index) {
3394 if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003395 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003396 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3397 __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3398 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3399 " specified as VK_NULL_HANDLE",
3400 i, descriptor_index);
3401 }
3402 }
3403 }
3404
3405 // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3406 if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3407 ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003408 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003409 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3410 UNRECOGNIZED_VALUE, LayerName,
3411 "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3412 "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3413 i, i);
3414 }
3415 }
3416 }
3417 }
3418
Chris Forbes04b61da2016-11-03 09:53:59 +13003419 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003420 result =
3421 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003422
Dustin Gravesc900f572016-05-16 11:07:59 -06003423 validate_result(report_data, "vkCreateDescriptorSetLayout", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003424 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003425
3426 return result;
3427}
3428
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003429VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3430 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003431 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003432 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003433 assert(my_data != NULL);
3434
Chris Forbes04b61da2016-11-03 09:53:59 +13003435 skip |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003436
Chris Forbes04b61da2016-11-03 09:53:59 +13003437 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003438 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003439 }
3440}
3441
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003442VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3443 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003444 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003445 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003446 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003447 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003448
Chris Forbes04b61da2016-11-03 09:53:59 +13003449 skip |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003450
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003451 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3452
Chris Forbes04b61da2016-11-03 09:53:59 +13003453 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003454 result =
3455 get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003456
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003457 validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003458 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003459
3460 return result;
3461}
3462
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003463VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3464 const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003465 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003466 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003467 assert(my_data != NULL);
3468
Chris Forbes04b61da2016-11-03 09:53:59 +13003469 skip |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003470
Chris Forbes04b61da2016-11-03 09:53:59 +13003471 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003472 get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003473 }
3474}
3475
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003476VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3477 VkDescriptorPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003478 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003479 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003480 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3481 assert(my_data != NULL);
3482
Chris Forbes04b61da2016-11-03 09:53:59 +13003483 skip |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003484
Chris Forbes04b61da2016-11-03 09:53:59 +13003485 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003486 result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3487
3488 validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3489 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003490
3491 return result;
3492}
3493
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003494VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3495 VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003496 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003497 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003498 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003499 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003500
Chris Forbes04b61da2016-11-03 09:53:59 +13003501 skip |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003502
Chris Forbes04b61da2016-11-03 09:53:59 +13003503 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003504 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3505
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003506 validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003507 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003508
3509 return result;
3510}
3511
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003512VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003513 const VkDescriptorSet *pDescriptorSets) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003514 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003515 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003516 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3517 assert(device_data != nullptr);
3518 debug_report_data *report_data = device_data->report_data;
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003519
Chris Forbes04b61da2016-11-03 09:53:59 +13003520 skip |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003521
Dustin Gravesc900f572016-05-16 11:07:59 -06003522 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3523 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3524 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003525 skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003526 pDescriptorSets, true, true);
3527
Chris Forbes04b61da2016-11-03 09:53:59 +13003528 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003529 result = get_dispatch_table(pc_device_table_map, device)
3530 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003531
Dustin Gravesc900f572016-05-16 11:07:59 -06003532 validate_result(report_data, "vkFreeDescriptorSets", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003533 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003534
3535 return result;
3536}
3537
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003538VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3539 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3540 const VkCopyDescriptorSet *pDescriptorCopies) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003541 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003542 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3543 assert(device_data != NULL);
3544 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003545
Chris Forbes04b61da2016-11-03 09:53:59 +13003546 skip |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
Dustin Gravesc900f572016-05-16 11:07:59 -06003547 descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003548
Dustin Gravesc900f572016-05-16 11:07:59 -06003549 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3550 if (pDescriptorWrites != NULL) {
3551 for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3552 // descriptorCount must be greater than 0
3553 if (pDescriptorWrites[i].descriptorCount == 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003554 skip |=
Dustin Gravesc900f572016-05-16 11:07:59 -06003555 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3556 REQUIRED_PARAMETER, LayerName,
3557 "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3558 }
3559
3560 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3561 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3562 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3563 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3564 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3565 // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3566 // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3567 // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3568 if (pDescriptorWrites[i].pImageInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003569 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003570 __LINE__, REQUIRED_PARAMETER, LayerName,
3571 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3572 "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3573 "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3574 "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3575 i, i);
3576 } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3577 // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3578 // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3579 // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3580 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3581 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003582 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003583 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
3584 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003585 pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
Chris Forbes04b61da2016-11-03 09:53:59 +13003586 skip |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003587 ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
3588 ParameterName::IndexVector{i, descriptor_index}),
3589 "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
Dustin Gravesc900f572016-05-16 11:07:59 -06003590 pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3591 }
3592 }
3593 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3594 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3595 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3596 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3597 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3598 // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3599 // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3600 if (pDescriptorWrites[i].pBufferInfo == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003601 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003602 __LINE__, REQUIRED_PARAMETER, LayerName,
3603 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3604 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3605 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3606 "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3607 i, i);
Dustin Graves629259b2016-05-30 16:14:27 -06003608 } else {
3609 for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003610 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003611 ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
3612 ParameterName::IndexVector{i, descriptorIndex}),
Dustin Graves629259b2016-05-30 16:14:27 -06003613 pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3614 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003615 }
3616 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3617 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3618 // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3619 // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3620 if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003621 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Dustin Gravesc900f572016-05-16 11:07:59 -06003622 __LINE__, REQUIRED_PARAMETER, LayerName,
3623 "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3624 "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3625 "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3626 i, i);
3627 } else {
3628 for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3629 ++descriptor_index) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003630 skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
Dustin Graves8ffbbf62016-07-22 13:19:46 -06003631 ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
3632 ParameterName::IndexVector{i, descriptor_index}),
Dustin Gravesc900f572016-05-16 11:07:59 -06003633 pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3634 }
3635 }
3636 }
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003637
3638 if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3639 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
3640 VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
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, uniformAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003644 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003645 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 minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
3649 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
3650 }
3651 }
3652 }
3653 } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3654 (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3655 VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
3656 for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
3657 if (pDescriptorWrites[i].pBufferInfo != NULL) {
3658 if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003659 skip |=
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003660 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06003661 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
Mark Lobodzinski1a34d7e2016-06-28 11:51:16 -06003662 "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
3663 ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
3664 i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
3665 }
3666 }
3667 }
3668 }
Dustin Gravesc900f572016-05-16 11:07:59 -06003669 }
3670 }
3671
Chris Forbes04b61da2016-11-03 09:53:59 +13003672 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003673 get_dispatch_table(pc_device_table_map, device)
3674 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003675 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003676}
3677
Chia-I Wu01ca2372016-05-13 14:37:49 +08003678VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003679 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003680 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003681 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003682 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003683 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003684
Chris Forbes04b61da2016-11-03 09:53:59 +13003685 skip |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003686
Chris Forbes04b61da2016-11-03 09:53:59 +13003687 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003688 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3689
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003690 validate_result(my_data->report_data, "vkCreateFramebuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003691 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003692
3693 return result;
3694}
3695
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003696VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003697 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003698 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003699 assert(my_data != NULL);
3700
Chris Forbes04b61da2016-11-03 09:53:59 +13003701 skip |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003702
Chris Forbes04b61da2016-11-03 09:53:59 +13003703 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003704 get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003705 }
3706}
3707
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003708bool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003709 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003710 uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
3711
3712 for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
3713 if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003714 skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003715 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003716 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
3717 }
3718 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003719 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003720}
3721
Chia-I Wu01ca2372016-05-13 14:37:49 +08003722VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003723 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003724 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003725 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003726 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003727 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003728
Chris Forbes04b61da2016-11-03 09:53:59 +13003729 skip |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3730 skip |= PreCreateRenderPass(my_data, pCreateInfo);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003731
Chris Forbes04b61da2016-11-03 09:53:59 +13003732 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003733 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3734
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003735 validate_result(my_data->report_data, "vkCreateRenderPass", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003736 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003737
3738 return result;
3739}
3740
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003741VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003742 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003743 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003744 assert(my_data != NULL);
3745
Chris Forbes04b61da2016-11-03 09:53:59 +13003746 skip |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003747
Chris Forbes04b61da2016-11-03 09:53:59 +13003748 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003749 get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003750 }
3751}
3752
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003753VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003754 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003755 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003756 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003757
Chris Forbes04b61da2016-11-03 09:53:59 +13003758 skip |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003759
Chris Forbes04b61da2016-11-03 09:53:59 +13003760 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003761 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003762 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003763}
3764
Chia-I Wu01ca2372016-05-13 14:37:49 +08003765VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003766 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003767 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003768 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003769 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003770 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003771
Chris Forbes04b61da2016-11-03 09:53:59 +13003772 skip |=
Dustin Gravesde628532016-04-21 16:30:17 -06003773 validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
Mark Lobodzinskif20f0942016-03-22 10:07:26 -06003774
Chris Forbes04b61da2016-11-03 09:53:59 +13003775 skip |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003776
Chris Forbes04b61da2016-11-03 09:53:59 +13003777 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003778 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3779
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003780 validate_result(my_data->report_data, "vkCreateCommandPool", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003781 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003782
3783 return result;
3784}
3785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003786VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003787 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003788 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves27a912a2016-03-07 17:52:14 -07003789 assert(my_data != NULL);
3790
Chris Forbes04b61da2016-11-03 09:53:59 +13003791 skip |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003792
Chris Forbes04b61da2016-11-03 09:53:59 +13003793 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003794 get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
Dustin Graves27a912a2016-03-07 17:52:14 -07003795 }
3796}
3797
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003798VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003799 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003800 bool skip = false;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003801 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3802 assert(my_data != NULL);
3803
Chris Forbes04b61da2016-11-03 09:53:59 +13003804 skip |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003805
Chris Forbes04b61da2016-11-03 09:53:59 +13003806 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06003807 result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3808
3809 validate_result(my_data->report_data, "vkResetCommandPool", result);
3810 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003811
3812 return result;
3813}
3814
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003815VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3816 VkCommandBuffer *pCommandBuffers) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003817 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003818 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003819 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003820 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003821
Chris Forbes04b61da2016-11-03 09:53:59 +13003822 skip |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003823
Chris Forbes04b61da2016-11-03 09:53:59 +13003824 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003825 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3826
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003827 validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003828 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003829
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003830 return result;
3831}
3832
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003833VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
Chia-I Wu01ca2372016-05-13 14:37:49 +08003834 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003835 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003836 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3837 assert(device_data != nullptr);
3838 debug_report_data *report_data = device_data->report_data;
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003839
Chris Forbes04b61da2016-11-03 09:53:59 +13003840 skip |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003841
Dustin Gravesc900f572016-05-16 11:07:59 -06003842 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3843 // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3844 // validate_array()
Chris Forbes04b61da2016-11-03 09:53:59 +13003845 skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
Dustin Gravesc900f572016-05-16 11:07:59 -06003846 pCommandBuffers, true, true);
3847
Chris Forbes04b61da2016-11-03 09:53:59 +13003848 if (!skip) {
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003849 get_dispatch_table(pc_device_table_map, device)
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003850 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Dustin Gravesa2b2e462016-02-26 11:53:28 -07003851 }
3852}
3853
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003854bool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003855 bool skip = false;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003856 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
3857 const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
3858
3859 if (pInfo != NULL) {
3860 if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003861 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003862 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 -06003863 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003864 "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
3865 "inheritedQueries.");
3866 }
3867
3868 if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
3869 (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003870 skip |=
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003871 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 -06003872 reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003873 "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
3874 "valid combination of VkQueryControlFlagBits.",
3875 pInfo->queryFlags);
3876 }
3877 }
Chris Forbes04b61da2016-11-03 09:53:59 +13003878 return skip;
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003879}
3880
3881VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07003882 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13003883 bool skip = false;
Dustin Gravesc900f572016-05-16 11:07:59 -06003884 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3885 assert(device_data != nullptr);
3886 debug_report_data *report_data = device_data->report_data;
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003887
Chris Forbes04b61da2016-11-03 09:53:59 +13003888 skip |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003889
Dustin Gravesc900f572016-05-16 11:07:59 -06003890 // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3891 // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
Chris Forbes04b61da2016-11-03 09:53:59 +13003892 skip |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
Dustin Gravesc900f572016-05-16 11:07:59 -06003893 "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3894 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3895
3896 if (pBeginInfo->pInheritanceInfo != NULL) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003897 skip |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
Dustin Gravesaf5c0292016-07-19 13:43:53 -06003898 pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
Dustin Graves629259b2016-05-30 16:14:27 -06003899
Chris Forbes04b61da2016-11-03 09:53:59 +13003900 skip |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
Dustin Graves629259b2016-05-30 16:14:27 -06003901 pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3902
Dustin Gravesc900f572016-05-16 11:07:59 -06003903 // TODO: This only needs to be validated when the inherited queries feature is enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003904 // skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
Dustin Gravesc900f572016-05-16 11:07:59 -06003905 // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3906
3907 // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
Chris Forbes04b61da2016-11-03 09:53:59 +13003908 skip |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
Dustin Gravesc900f572016-05-16 11:07:59 -06003909 "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3910 pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3911 }
3912
Chris Forbes04b61da2016-11-03 09:53:59 +13003913 skip |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
Mark Lobodzinski4dc6cb02016-06-28 11:23:08 -06003914
Chris Forbes04b61da2016-11-03 09:53:59 +13003915 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07003916 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3917
Dustin Gravesc900f572016-05-16 11:07:59 -06003918 validate_result(report_data, "vkBeginCommandBuffer", result);
Dustin Graves1e92cd72016-02-09 14:00:18 -07003919 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003920
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003921 return result;
3922}
3923
Chia-I Wu01ca2372016-05-13 14:37:49 +08003924VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003925 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3926 assert(my_data != NULL);
3927
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003928 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003929
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003930 validate_result(my_data->report_data, "vkEndCommandBuffer", result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003931
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003932 return result;
3933}
3934
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003935VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Dustin Graves16d18972016-05-09 17:36:57 -06003936 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Dustin Gravesca7aa7c2016-03-25 15:13:28 -06003937 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3938 assert(my_data != NULL);
3939
Chris Forbes04b61da2016-11-03 09:53:59 +13003940 bool skip = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003941
Chris Forbes04b61da2016-11-03 09:53:59 +13003942 if (!skip) {
Dustin Graves16d18972016-05-09 17:36:57 -06003943 result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3944
3945 validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3946 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003947
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003948 return result;
3949}
3950
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06003951VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3952 VkPipeline pipeline) {
Chris Forbes04b61da2016-11-03 09:53:59 +13003953 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06003954 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3955 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003956
Chris Forbes04b61da2016-11-03 09:53:59 +13003957 skip |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
Dustin Graves29148ff2016-03-23 19:44:00 -06003958
Chris Forbes04b61da2016-11-03 09:53:59 +13003959 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06003960 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3961 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003962}
3963
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003964bool preCmdSetViewport(layer_data *my_data, uint32_t viewport_count, const VkViewport *viewports) {
3965 debug_report_data *report_data = my_data->report_data;
3966
Mark Lobodzinski5a242962016-10-28 12:57:23 -06003967 bool skip =
3968 validate_array(report_data, "vkCmdSetViewport", "viewportCount", "pViewports", viewport_count, viewports, true, true);
Mike Weiblen2906c9a2016-10-31 21:04:10 -06003969
3970 if (viewport_count > 0 && viewports != nullptr) {
3971 const VkPhysicalDeviceLimits &limits = my_data->device_limits;
3972 for (uint32_t viewportIndex = 0; viewportIndex < viewport_count; ++viewportIndex) {
3973 const VkViewport &viewport = viewports[viewportIndex];
3974
3975 if (viewport.width <= 0 || viewport.width > limits.maxViewportDimensions[0]) {
3976 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3977 VALIDATION_ERROR_01448, LayerName,
3978 "vkCmdSetViewport %d: width (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3979 viewport.width, limits.maxViewportDimensions[0], validation_error_map[VALIDATION_ERROR_01448]);
3980 }
3981
3982 bool invalid_height = (viewport.height <= 0 || viewport.height > limits.maxViewportDimensions[1]);
3983 if (my_data->amd_negative_viewport_height_enabled && (viewport.height < 0)) {
3984 // VALIDATION_ERROR_01790
3985 invalid_height = false;
3986 }
3987 if (invalid_height) {
3988 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3989 VALIDATION_ERROR_01449, LayerName,
3990 "vkCmdSetViewport %d: height (%f) exceeds permitted bounds (0,%u). %s", viewportIndex,
3991 viewport.height, limits.maxViewportDimensions[1], validation_error_map[VALIDATION_ERROR_01449]);
3992 }
3993
3994 if (viewport.x < limits.viewportBoundsRange[0] || viewport.x > limits.viewportBoundsRange[1]) {
3995 skip |=
3996 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3997 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: x (%f) exceeds permitted bounds (%f,%f). %s",
3998 viewportIndex, viewport.x, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
3999 validation_error_map[VALIDATION_ERROR_01450]);
4000 }
4001
4002 if (viewport.y < limits.viewportBoundsRange[0] || viewport.y > limits.viewportBoundsRange[1]) {
4003 skip |=
4004 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4005 VALIDATION_ERROR_01450, LayerName, "vkCmdSetViewport %d: y (%f) exceeds permitted bounds (%f,%f). %s",
4006 viewportIndex, viewport.y, limits.viewportBoundsRange[0], limits.viewportBoundsRange[1],
4007 validation_error_map[VALIDATION_ERROR_01450]);
4008 }
4009
4010 if (viewport.x + viewport.width > limits.viewportBoundsRange[1]) {
4011 skip |=
4012 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4013 VALIDATION_ERROR_01451, LayerName,
4014 "vkCmdSetViewport %d: x (%f) + width (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.x,
4015 viewport.width, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01451]);
4016 }
4017
4018 if (viewport.y + viewport.height > limits.viewportBoundsRange[1]) {
4019 skip |=
4020 log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4021 VALIDATION_ERROR_01452, LayerName,
4022 "vkCmdSetViewport %d: y (%f) + height (%f) exceeds permitted bound (%f). %s", viewportIndex, viewport.y,
4023 viewport.height, limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_01452]);
4024 }
4025 }
4026 }
4027
Mark Lobodzinski5a242962016-10-28 12:57:23 -06004028 return skip;
4029}
4030
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004031VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4032 const VkViewport *pViewports) {
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004033 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004034 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004035 assert(my_data != NULL);
4036
Mike Weiblen2906c9a2016-10-31 21:04:10 -06004037 skip |= preCmdSetViewport(my_data, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004038
Mark Lobodzinskib79b7732016-10-28 12:59:47 -06004039 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004040 get_dispatch_table(pc_device_table_map, commandBuffer)
4041 ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004042 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06004043}
4044
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004045VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
4046 const VkRect2D *pScissors) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004047 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004048 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004049 assert(my_data != NULL);
Mike Weiblena4742dc2016-10-31 11:05:56 -06004050 debug_report_data *report_data = my_data->report_data;
Dustin Graves1e92cd72016-02-09 14:00:18 -07004051
Chris Forbes04b61da2016-11-03 09:53:59 +13004052 skip |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004053
Mike Weiblena4742dc2016-10-31 11:05:56 -06004054 for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) {
4055 const VkRect2D &pScissor = pScissors[scissorIndex];
4056
4057 if (pScissor.offset.x < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004058 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004059 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s",
4060 scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_01489]);
4061 } else if (static_cast<int32_t>(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004062 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004063 VALIDATION_ERROR_01490, LayerName,
4064 "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex,
4065 pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_01490]);
4066 }
4067
4068 if (pScissor.offset.y < 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004069 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004070 VALIDATION_ERROR_01489, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s",
4071 scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_01489]);
4072 } else if (static_cast<int32_t>(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004073 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mike Weiblena4742dc2016-10-31 11:05:56 -06004074 VALIDATION_ERROR_01491, LayerName,
4075 "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex,
4076 pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_01491]);
4077 }
4078 }
4079
Chris Forbes04b61da2016-11-03 09:53:59 +13004080 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004081 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
4082 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004083}
4084
Chia-I Wu01ca2372016-05-13 14:37:49 +08004085VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004086 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004087}
4088
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004089VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4090 float depthBiasSlopeFactor) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004091 get_dispatch_table(pc_device_table_map, commandBuffer)
4092 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004093}
4094
Chia-I Wu01ca2372016-05-13 14:37:49 +08004095VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004096 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004097 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004098 assert(my_data != NULL);
4099
Chris Forbes04b61da2016-11-03 09:53:59 +13004100 skip |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004101
Chris Forbes04b61da2016-11-03 09:53:59 +13004102 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004103 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4104 }
Cody Northrop12365112015-08-17 11:10:49 -06004105}
4106
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004107VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004108 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06004109}
4110
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004111VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4112 uint32_t compareMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004113 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004114 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4115 assert(my_data != NULL);
4116
Chris Forbes04b61da2016-11-03 09:53:59 +13004117 skip |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004118
Chris Forbes04b61da2016-11-03 09:53:59 +13004119 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004120 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
4121 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004122}
4123
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004124VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004125 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004126 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4127 assert(my_data != NULL);
4128
Chris Forbes04b61da2016-11-03 09:53:59 +13004129 skip |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
Dustin Graves46948e62016-05-06 10:16:06 -06004130
Chris Forbes04b61da2016-11-03 09:53:59 +13004131 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004132 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
4133 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004134}
4135
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004136VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004137 bool skip = false;
Dustin Graves46948e62016-05-06 10:16:06 -06004138 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4139 assert(my_data != NULL);
4140
Chris Forbes04b61da2016-11-03 09:53:59 +13004141 skip |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
Dustin Graves46948e62016-05-06 10:16:06 -06004142
Chris Forbes04b61da2016-11-03 09:53:59 +13004143 if (!skip) {
Dustin Graves46948e62016-05-06 10:16:06 -06004144 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
4145 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004146}
4147
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004148VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4149 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4150 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4151 const uint32_t *pDynamicOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004152 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004153 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004154 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004155
Chris Forbes04b61da2016-11-03 09:53:59 +13004156 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004157 parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4158 pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004159
Chris Forbes04b61da2016-11-03 09:53:59 +13004160 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004161 get_dispatch_table(pc_device_table_map, commandBuffer)
4162 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4163 dynamicOffsetCount, pDynamicOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004164 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004165}
4166
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004167VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4168 VkIndexType indexType) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004169 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004170 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4171 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004172
Chris Forbes04b61da2016-11-03 09:53:59 +13004173 skip |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
Dustin Graves29148ff2016-03-23 19:44:00 -06004174
Chris Forbes04b61da2016-11-03 09:53:59 +13004175 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004176 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4177 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004178}
4179
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004180VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4181 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004182 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004183 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004184 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004185
Chris Forbes04b61da2016-11-03 09:53:59 +13004186 skip |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004187
Chris Forbes04b61da2016-11-03 09:53:59 +13004188 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004189 get_dispatch_table(pc_device_table_map, commandBuffer)
4190 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004191 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004192}
4193
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004194bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4195 uint32_t firstInstance) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004196 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Michael Lentine55a913f2015-11-24 09:48:23 -06004197 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004198 // 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 -07004199 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004200 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 -06004201 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004202 return false;
4203 }
4204
4205 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004206 // 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 -07004207 // this an error or leave as is.
Chris Forbes0e0161a2016-11-02 16:21:28 +13004208 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 -06004209 REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06004210 return false;
4211 }
4212
4213 return true;
4214}
4215
Chia-I Wu01ca2372016-05-13 14:37:49 +08004216VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4217 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004218 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06004219
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004220 get_dispatch_table(pc_device_table_map, commandBuffer)
4221 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004222}
4223
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004224VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4225 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004226 get_dispatch_table(pc_device_table_map, commandBuffer)
4227 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004228}
4229
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004230VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4231 uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004232 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004233 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4234 assert(my_data != NULL);
4235
Chris Forbes04b61da2016-11-03 09:53:59 +13004236 skip |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004237
Chris Forbes04b61da2016-11-03 09:53:59 +13004238 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004239 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4240 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004241}
4242
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004243VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4244 uint32_t count, uint32_t stride) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004245 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004246 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4247 assert(my_data != NULL);
4248
Chris Forbes04b61da2016-11-03 09:53:59 +13004249 skip |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004250
Chris Forbes04b61da2016-11-03 09:53:59 +13004251 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004252 get_dispatch_table(pc_device_table_map, commandBuffer)
4253 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4254 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004255}
4256
Chia-I Wu01ca2372016-05-13 14:37:49 +08004257VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004258 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004259}
4260
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004261VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004262 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004263 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4264 assert(my_data != NULL);
4265
Chris Forbes04b61da2016-11-03 09:53:59 +13004266 skip |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004267
Chris Forbes04b61da2016-11-03 09:53:59 +13004268 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004269 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4270 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004271}
4272
Chia-I Wu01ca2372016-05-13 14:37:49 +08004273VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
4274 uint32_t regionCount, const VkBufferCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004275 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004276 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004277 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004278
Chris Forbes04b61da2016-11-03 09:53:59 +13004279 skip |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004280
Chris Forbes04b61da2016-11-03 09:53:59 +13004281 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004282 get_dispatch_table(pc_device_table_map, commandBuffer)
4283 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004284 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004285}
4286
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004287bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004288 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004289 if (pRegions != nullptr) {
4290 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4291 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004292 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004293 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004294 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4295 return false;
4296 }
4297 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4298 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004299 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004300 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004301 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4302 return false;
4303 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004304 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004305
4306 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004307}
4308
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004309VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4310 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4311 const VkImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004312 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004313 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004314 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004315
Chris Forbes04b61da2016-11-03 09:53:59 +13004316 skip |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004317 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004318
Chris Forbes04b61da2016-11-03 09:53:59 +13004319 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004320 PreCmdCopyImage(commandBuffer, pRegions);
4321
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004322 get_dispatch_table(pc_device_table_map, commandBuffer)
4323 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004324 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004325}
4326
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004327bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004328 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004329 if (pRegions != nullptr) {
4330 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4331 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004332 log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004333 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004334 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4335 return false;
4336 }
4337 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4338 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004339 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 -06004340 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004341 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4342 return false;
4343 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004344 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004345
4346 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004347}
4348
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004349VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4350 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4351 const VkImageBlit *pRegions, VkFilter filter) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004352 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004353 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004354 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004355
Chris Forbes04b61da2016-11-03 09:53:59 +13004356 skip |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004357 regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004358
Chris Forbes04b61da2016-11-03 09:53:59 +13004359 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004360 PreCmdBlitImage(commandBuffer, pRegions);
4361
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004362 get_dispatch_table(pc_device_table_map, commandBuffer)
4363 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004364 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004365}
4366
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004367bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004368 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004369 if (pRegions != nullptr) {
4370 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4371 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004372 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 -06004373 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004374 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4375 "enumerator");
4376 return false;
4377 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004378 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004379
4380 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004381}
4382
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004383VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4384 VkImageLayout dstImageLayout, uint32_t regionCount,
4385 const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004386 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004387 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004388 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004389
Chris Forbes04b61da2016-11-03 09:53:59 +13004390 skip |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004391 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004392
Chris Forbes04b61da2016-11-03 09:53:59 +13004393 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004394 PreCmdCopyBufferToImage(commandBuffer, pRegions);
4395
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004396 get_dispatch_table(pc_device_table_map, commandBuffer)
4397 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004398 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004399}
4400
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004401bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004402 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004403 if (pRegions != nullptr) {
4404 if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4405 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004406 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 -06004407 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004408 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4409 "enumerator");
4410 return false;
4411 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004412 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004413
4414 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004415}
4416
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004417VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4418 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004419 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004420 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004421 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004422
Chris Forbes04b61da2016-11-03 09:53:59 +13004423 skip |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004424 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004425
Chris Forbes04b61da2016-11-03 09:53:59 +13004426 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004427 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4428
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004429 get_dispatch_table(pc_device_table_map, commandBuffer)
4430 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004431 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004432}
4433
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004434VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4435 VkDeviceSize dataSize, const uint32_t *pData) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004436 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004437 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004438 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004439
Chris Forbes04b61da2016-11-03 09:53:59 +13004440 skip |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004441
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004442 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004443 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004444 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4445 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004446 }
4447
4448 if ((dataSize <= 0) || (dataSize > 65536)) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004449 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004450 INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4451 "), must be greater than zero and less than or equal to 65536",
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004452 dataSize);
4453 } else if (dataSize & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004454 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004455 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4456 LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004457 }
4458
Chris Forbes04b61da2016-11-03 09:53:59 +13004459 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004460 get_dispatch_table(pc_device_table_map, commandBuffer)
4461 ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004462 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004463}
4464
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004465VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4466 VkDeviceSize size, uint32_t data) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004467 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004468 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4469 assert(my_data != NULL);
4470
Chris Forbes04b61da2016-11-03 09:53:59 +13004471 skip |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004472
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004473 if (dstOffset & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004474 skip |= log_msg(
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004475 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4476 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004477 }
4478
4479 if (size != VK_WHOLE_SIZE) {
4480 if (size <= 0) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004481 skip |= log_msg(
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004482 my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004483 LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004484 } else if (size & 3) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004485 skip |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
Mark Lobodzinskibbe3d972016-06-29 10:53:51 -06004486 INVALID_USAGE, LayerName,
Mark Lobodzinskibbed4372016-06-09 17:01:19 -06004487 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4488 }
4489 }
4490
Chris Forbes04b61da2016-11-03 09:53:59 +13004491 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004492 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4493 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004494}
4495
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004496VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4497 const VkClearColorValue *pColor, uint32_t rangeCount,
4498 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004499 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004500 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004501 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004502
Chris Forbes04b61da2016-11-03 09:53:59 +13004503 skip |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004504
Chris Forbes04b61da2016-11-03 09:53:59 +13004505 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004506 get_dispatch_table(pc_device_table_map, commandBuffer)
4507 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004508 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004509}
4510
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004511VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4512 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4513 const VkImageSubresourceRange *pRanges) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004514 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004515 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004516 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004517
Chris Forbes04b61da2016-11-03 09:53:59 +13004518 skip |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004519 rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004520
Chris Forbes04b61da2016-11-03 09:53:59 +13004521 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004522 get_dispatch_table(pc_device_table_map, commandBuffer)
4523 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004524 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004525}
4526
Chia-I Wu01ca2372016-05-13 14:37:49 +08004527VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
4528 const VkClearAttachment *pAttachments, uint32_t rectCount,
4529 const VkClearRect *pRects) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004530 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004531 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004532 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004533
Chris Forbes04b61da2016-11-03 09:53:59 +13004534 skip |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004535
Chris Forbes04b61da2016-11-03 09:53:59 +13004536 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004537 get_dispatch_table(pc_device_table_map, commandBuffer)
4538 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004539 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004540}
4541
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004542bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
Chris Forbes0e0161a2016-11-02 16:21:28 +13004543 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004544 if (pRegions != nullptr) {
4545 if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4546 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4547 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004548 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 -06004549 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004550 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4551 return false;
4552 }
4553 if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4554 VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4555 log_msg(
Chris Forbes0e0161a2016-11-02 16:21:28 +13004556 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 -06004557 UNRECOGNIZED_VALUE, LayerName,
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004558 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4559 return false;
4560 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004561 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004562
4563 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004564}
4565
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004566VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4567 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4568 const VkImageResolve *pRegions) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004569 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004570 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004571 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004572
Chris Forbes04b61da2016-11-03 09:53:59 +13004573 skip |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004574 regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004575
Chris Forbes04b61da2016-11-03 09:53:59 +13004576 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004577 PreCmdResolveImage(commandBuffer, pRegions);
4578
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004579 get_dispatch_table(pc_device_table_map, commandBuffer)
4580 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004581 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004582}
4583
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004584VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004585 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004586 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4587 assert(my_data != NULL);
4588
Chris Forbes04b61da2016-11-03 09:53:59 +13004589 skip |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004590
Chris Forbes04b61da2016-11-03 09:53:59 +13004591 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004592 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4593 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004594}
4595
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004596VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004597 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004598 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4599 assert(my_data != NULL);
4600
Chris Forbes04b61da2016-11-03 09:53:59 +13004601 skip |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004602
Chris Forbes04b61da2016-11-03 09:53:59 +13004603 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004604 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4605 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004606}
4607
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004608VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4609 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4610 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4611 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4612 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004613 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004614 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004615 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004616
Chris Forbes04b61da2016-11-03 09:53:59 +13004617 skip |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004618 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4619 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004620
Chris Forbes04b61da2016-11-03 09:53:59 +13004621 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004622 get_dispatch_table(pc_device_table_map, commandBuffer)
4623 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4624 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004625 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004626}
4627
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004628VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4629 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4630 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4631 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4632 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004633 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004634 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004635 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004636
Chris Forbes04b61da2016-11-03 09:53:59 +13004637 skip |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004638 memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4639 pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004640
Chris Forbes04b61da2016-11-03 09:53:59 +13004641 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004642 get_dispatch_table(pc_device_table_map, commandBuffer)
4643 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4644 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004645 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004646}
4647
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004648VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4649 VkQueryControlFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004650 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004651 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4652 assert(my_data != NULL);
4653
Chris Forbes04b61da2016-11-03 09:53:59 +13004654 skip |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004655
Chris Forbes04b61da2016-11-03 09:53:59 +13004656 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004657 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4658 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004659}
4660
Chia-I Wu01ca2372016-05-13 14:37:49 +08004661VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004662 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004663 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4664 assert(my_data != NULL);
4665
Chris Forbes04b61da2016-11-03 09:53:59 +13004666 skip |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004667
Chris Forbes04b61da2016-11-03 09:53:59 +13004668 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004669 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4670 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004671}
4672
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004673VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4674 uint32_t queryCount) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004675 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004676 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4677 assert(my_data != NULL);
4678
Chris Forbes04b61da2016-11-03 09:53:59 +13004679 skip |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004680
Chris Forbes04b61da2016-11-03 09:53:59 +13004681 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004682 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4683 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004684}
4685
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004686bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4687 uint32_t slot) {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004688
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08004689 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004690
4691 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004692}
4693
Chia-I Wu01ca2372016-05-13 14:37:49 +08004694VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
4695 VkQueryPool queryPool, uint32_t query) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004696 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004697 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4698 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004699
Chris Forbes04b61da2016-11-03 09:53:59 +13004700 skip |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004701
Chris Forbes04b61da2016-11-03 09:53:59 +13004702 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004703 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4704
4705 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4706 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004707}
4708
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004709VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4710 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4711 VkDeviceSize stride, VkQueryResultFlags flags) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004712 bool skip = false;
Dustin Graves20fd66f2016-04-18 18:33:21 -06004713 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4714 assert(my_data != NULL);
4715
Chris Forbes04b61da2016-11-03 09:53:59 +13004716 skip |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004717 dstOffset, stride, flags);
Dustin Graves20fd66f2016-04-18 18:33:21 -06004718
Chris Forbes04b61da2016-11-03 09:53:59 +13004719 if (!skip) {
Dustin Graves20fd66f2016-04-18 18:33:21 -06004720 get_dispatch_table(pc_device_table_map, commandBuffer)
4721 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4722 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004723}
4724
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004725VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4726 uint32_t offset, uint32_t size, const void *pValues) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004727 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004728 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004729 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004730
Chris Forbes04b61da2016-11-03 09:53:59 +13004731 skip |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004732
Chris Forbes04b61da2016-11-03 09:53:59 +13004733 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004734 get_dispatch_table(pc_device_table_map, commandBuffer)
4735 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004736 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004737}
4738
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004739VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4740 VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004741 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004742 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004743 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004744
Chris Forbes04b61da2016-11-03 09:53:59 +13004745 skip |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004746
Chris Forbes04b61da2016-11-03 09:53:59 +13004747 if (!skip) {
Dustin Graves1e92cd72016-02-09 14:00:18 -07004748 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004749 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004750}
4751
Chia-I Wu01ca2372016-05-13 14:37:49 +08004752VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004753 bool skip = false;
Dustin Graves29148ff2016-03-23 19:44:00 -06004754 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4755 assert(my_data != NULL);
Chia-I Wu08accc62015-07-07 11:50:03 +08004756
Chris Forbes04b61da2016-11-03 09:53:59 +13004757 skip |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
Dustin Graves29148ff2016-03-23 19:44:00 -06004758
Chris Forbes04b61da2016-11-03 09:53:59 +13004759 if (!skip) {
Dustin Graves29148ff2016-03-23 19:44:00 -06004760 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4761 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004762}
4763
Chia-I Wu01ca2372016-05-13 14:37:49 +08004764VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004765 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004766}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004767
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004768VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4769 const VkCommandBuffer *pCommandBuffers) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004770 bool skip = false;
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004771 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004772 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004773
Chris Forbes04b61da2016-11-03 09:53:59 +13004774 skip |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08004775
Chris Forbes04b61da2016-11-03 09:53:59 +13004776 if (!skip) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -07004777 get_dispatch_table(pc_device_table_map, commandBuffer)
4778 ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
Dustin Graves1e92cd72016-02-09 14:00:18 -07004779 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06004780}
4781
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004782VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004783 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4784}
4785
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004786VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4787 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004788 return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4789}
4790
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004791VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4792 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08004793 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4794 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4795
4796 return VK_ERROR_LAYER_NOT_PRESENT;
4797}
4798
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004799VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4800 uint32_t *pCount, VkExtensionProperties *pProperties) {
Chia-I Wu99f701c2016-05-13 14:06:08 +08004801 /* parameter_validation does not have any physical device extensions */
Chia-I Wu76a34662016-05-16 07:34:09 +08004802 if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
Chia-I Wu99f701c2016-05-13 14:06:08 +08004803 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Chia-I Wu76a34662016-05-16 07:34:09 +08004804
4805 assert(physicalDevice);
4806
4807 return get_dispatch_table(pc_instance_table_map, physicalDevice)
4808 ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08004809}
4810
Chris Forbes448ebcb2016-11-03 09:29:52 +13004811bool require_device_extension(layer_data *my_data, bool layer_data::*flag, char const *function_name, char const *extension_name)
4812{
4813 if (!(my_data->*flag)) {
4814 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
4815 __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4816 "%s() called even though the %s extension was not enabled for this VkDevice.",
4817 function_name, extension_name);
4818 }
4819
4820 return false;
4821}
4822
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004823// WSI Extension Functions
4824
4825VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004826 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004827 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004828 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004829 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4830 assert(my_data != NULL);
4831
Chris Forbes04b61da2016-11-03 09:53:59 +13004832 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkCreateSwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004833
Chris Forbes04b61da2016-11-03 09:53:59 +13004834 skip |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004835
Chris Forbes04b61da2016-11-03 09:53:59 +13004836 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004837 result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
4838
4839 validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
4840 }
4841
4842 return result;
4843}
4844
4845VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004846 VkImage *pSwapchainImages) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004847 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004848 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004849 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4850 assert(my_data != NULL);
4851
Chris Forbes04b61da2016-11-03 09:53:59 +13004852 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkGetSwapchainImagesKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004853
Chris Forbes04b61da2016-11-03 09:53:59 +13004854 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004855 parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
4856
Chris Forbes04b61da2016-11-03 09:53:59 +13004857 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004858 result = get_dispatch_table(pc_device_table_map, device)
4859 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
4860
4861 validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
4862 }
4863
4864 return result;
4865}
4866
4867VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004868 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004869 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004870 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004871 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4872 assert(my_data != NULL);
4873
Chris Forbes04b61da2016-11-03 09:53:59 +13004874 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkAcquireNextImageKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004875
Chris Forbes04b61da2016-11-03 09:53:59 +13004876 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004877 parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
4878
Chris Forbes04b61da2016-11-03 09:53:59 +13004879 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004880 result = get_dispatch_table(pc_device_table_map, device)
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004881 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004882
4883 validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
4884 }
4885
4886 return result;
4887}
4888
4889VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
4890 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004891 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004892 layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
4893 assert(my_data != NULL);
4894
Chris Forbes04b61da2016-11-03 09:53:59 +13004895 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkQueuePresentKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004896
Chris Forbes04b61da2016-11-03 09:53:59 +13004897 skip |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004898
Chris Forbes04b61da2016-11-03 09:53:59 +13004899 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004900 result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
4901
4902 validate_result(my_data->report_data, "vkQueuePresentKHR", result);
4903 }
4904
4905 return result;
4906}
4907
Chris Forbesbe5f5202016-11-02 18:34:25 +13004908VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13004909 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13004910 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4911 assert(my_data != NULL);
4912
Chris Forbes04b61da2016-11-03 09:53:59 +13004913 skip |= require_device_extension(my_data, &layer_data::swapchain_enabled, "vkDestroySwapchainKHR", VK_KHR_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13004914
4915 /* No generated validation function for this call */
4916
Chris Forbes04b61da2016-11-03 09:53:59 +13004917 if (!skip) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13004918 get_dispatch_table(pc_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
4919 }
4920}
4921
Chris Forbes115f98c2016-11-03 09:51:48 +13004922bool require_instance_extension(void *instance, bool instance_extension_enables::*flag, char const *function_name, char const *extension_name)
4923{
Chris Forbes6be763e2016-11-24 12:42:33 +13004924 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
4925 if (!(my_data->extensions.*flag)) {
Chris Forbes115f98c2016-11-03 09:51:48 +13004926 return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
4927 reinterpret_cast<uint64_t>(instance), __LINE__, EXTENSION_NOT_ENABLED, LayerName,
4928 "%s() called even though the %s extension was not enabled for this VkInstance.",
4929 function_name, extension_name);
4930 }
4931
4932 return false;
4933}
4934
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004935VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
4936 VkSurfaceKHR surface, VkBool32 *pSupported) {
4937 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004938 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004939 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004940 assert(my_data != NULL);
4941
Chris Forbes04b61da2016-11-03 09:53:59 +13004942 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004943 "vkGetPhysicalDeviceSurfaceSupportKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004944
Chris Forbes04b61da2016-11-03 09:53:59 +13004945 skip |=
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004946 parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
4947
Chris Forbes04b61da2016-11-03 09:53:59 +13004948 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004949 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4950 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
4951
4952 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
4953 }
4954
4955 return result;
4956}
4957
4958VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4959 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
4960 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004961 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004962 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004963 assert(my_data != NULL);
4964
Chris Forbes04b61da2016-11-03 09:53:59 +13004965 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004966 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004967
Chris Forbes04b61da2016-11-03 09:53:59 +13004968 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004969 parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004970
Chris Forbes04b61da2016-11-03 09:53:59 +13004971 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004972 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4973 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
4974
4975 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
4976 }
4977
4978 return result;
4979}
4980
4981VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4982 uint32_t *pSurfaceFormatCount,
4983 VkSurfaceFormatKHR *pSurfaceFormats) {
4984 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13004985 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13004986 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004987 assert(my_data != NULL);
4988
Chris Forbes04b61da2016-11-03 09:53:59 +13004989 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13004990 "vkGetPhysicalDeviceSurfaceFormatsKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13004991
Chris Forbes04b61da2016-11-03 09:53:59 +13004992 skip |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06004993 pSurfaceFormats);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004994
Chris Forbes04b61da2016-11-03 09:53:59 +13004995 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06004996 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4997 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
4998
4999 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
5000 }
5001
5002 return result;
5003}
5004
5005VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
5006 uint32_t *pPresentModeCount,
5007 VkPresentModeKHR *pPresentModes) {
5008 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005009 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005010 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005011 assert(my_data != NULL);
5012
Chris Forbes04b61da2016-11-03 09:53:59 +13005013 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005014 "vkGetPhysicalDeviceSurfacePresentModesKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbes8a13e272016-11-02 17:43:34 +13005015
Chris Forbes04b61da2016-11-03 09:53:59 +13005016 skip |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005017 pPresentModes);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005018
Chris Forbes04b61da2016-11-03 09:53:59 +13005019 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005020 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5021 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
5022
5023 validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
5024 }
5025
5026 return result;
5027}
5028
Chris Forbesbe5f5202016-11-02 18:34:25 +13005029VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005030 bool skip = false;
Chris Forbesbe5f5202016-11-02 18:34:25 +13005031
Chris Forbes04b61da2016-11-03 09:53:59 +13005032 skip |= require_instance_extension(instance, &instance_extension_enables::surface_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005033 "vkDestroySurfaceKHR", VK_KHR_SURFACE_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005034
Chris Forbes04b61da2016-11-03 09:53:59 +13005035 if (!skip) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005036 get_dispatch_table(pc_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
5037 }
5038}
5039
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005040#ifdef VK_USE_PLATFORM_WIN32_KHR
5041VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
5042 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5043 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5044
Chris Forbes7b58a712016-11-24 11:35:31 +13005045 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005046 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005047 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005048
Chris Forbes04b61da2016-11-03 09:53:59 +13005049 skip |= require_instance_extension(instance, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005050 "vkCreateWin32SurfaceKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005051
Chris Forbes04b61da2016-11-03 09:53:59 +13005052 skip |= parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005053
Chris Forbes04b61da2016-11-03 09:53:59 +13005054 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005055 result =
5056 get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5057 }
5058
5059 validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
5060
5061 return result;
5062}
Chris Forbes9a083b92016-11-02 16:58:15 +13005063
5064VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
5065 uint32_t queueFamilyIndex)
5066{
5067 VkBool32 result = false;
5068
Chris Forbes7b58a712016-11-24 11:35:31 +13005069 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes9a083b92016-11-02 16:58:15 +13005070 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005071 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005072
Chris Forbes04b61da2016-11-03 09:53:59 +13005073 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::win32_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005074 "vkGetPhysicalDeviceWin32PresentationSupportKHR", VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005075
Chris Forbes7281a502016-11-08 08:45:03 +13005076 // TODO: codegen doesn't produce this function?
5077 //skip |= parameter_validation_vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
Chris Forbes9a083b92016-11-02 16:58:15 +13005078
Chris Forbes04b61da2016-11-03 09:53:59 +13005079 if (!skip) {
Chris Forbes9a083b92016-11-02 16:58:15 +13005080 result = get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceWin32PresentationSupportKHR(
5081 physicalDevice, queueFamilyIndex);
5082 }
5083
5084 return result;
5085}
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005086#endif // VK_USE_PLATFORM_WIN32_KHR
5087
5088#ifdef VK_USE_PLATFORM_XCB_KHR
5089VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
5090 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5091 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5092
Chris Forbes7b58a712016-11-24 11:35:31 +13005093 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005094 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005095 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005096
Chris Forbes04b61da2016-11-03 09:53:59 +13005097 skip |= require_instance_extension(instance, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005098 "vkCreateXcbSurfaceKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005099
Chris Forbes04b61da2016-11-03 09:53:59 +13005100 skip |= parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005101
Chris Forbes04b61da2016-11-03 09:53:59 +13005102 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005103 result =
5104 get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5105 }
5106
5107 validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
5108
5109 return result;
5110}
5111
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005112VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5113 uint32_t queueFamilyIndex, xcb_connection_t *connection,
5114 xcb_visualid_t visual_id) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005115 VkBool32 result = false;
5116
Chris Forbes7b58a712016-11-24 11:35:31 +13005117 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005118 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005119 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005120
Chris Forbes04b61da2016-11-03 09:53:59 +13005121 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xcb_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005122 "vkGetPhysicalDeviceXcbPresentationSupportKHR", VK_KHR_XCB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005123
Chris Forbes04b61da2016-11-03 09:53:59 +13005124 skip |= parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005125 connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005126
Chris Forbes04b61da2016-11-03 09:53:59 +13005127 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005128 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5129 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005130 }
5131
5132 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005133}
5134#endif // VK_USE_PLATFORM_XCB_KHR
5135
5136#ifdef VK_USE_PLATFORM_XLIB_KHR
5137VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005138 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005139 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5140
Chris Forbes7b58a712016-11-24 11:35:31 +13005141 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005142 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005143 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005144
Chris Forbes04b61da2016-11-03 09:53:59 +13005145 skip |= require_instance_extension(instance, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005146 "vkCreateXlibSurfaceKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005147
Chris Forbes04b61da2016-11-03 09:53:59 +13005148 skip |= parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005149
Chris Forbes04b61da2016-11-03 09:53:59 +13005150 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005151 result =
5152 get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5153 }
5154
5155 validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
5156
5157 return result;
5158}
5159
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005160VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5161 uint32_t queueFamilyIndex, Display *dpy,
5162 VisualID visualID) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005163 VkBool32 result = false;
5164
Chris Forbes7b58a712016-11-24 11:35:31 +13005165 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005166 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005167 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005168
Chris Forbes04b61da2016-11-03 09:53:59 +13005169 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::xlib_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005170 "vkGetPhysicalDeviceXlibPresentationSupportKHR", VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005171
Chris Forbes04b61da2016-11-03 09:53:59 +13005172 skip |= parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005173
Chris Forbes04b61da2016-11-03 09:53:59 +13005174 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005175 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5176 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005177 }
Karl Schultz3a41cae2016-09-02 10:17:05 -06005178 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005179}
5180#endif // VK_USE_PLATFORM_XLIB_KHR
5181
5182#ifdef VK_USE_PLATFORM_MIR_KHR
5183VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005184 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005185 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5186
Chris Forbes7b58a712016-11-24 11:35:31 +13005187 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005188 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005189 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005190
Chris Forbes04b61da2016-11-03 09:53:59 +13005191 skip |= require_instance_extension(instance, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005192 "vkCreateMirSurfaceKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005193
Chris Forbes04b61da2016-11-03 09:53:59 +13005194 skip |= parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005195
Chris Forbes04b61da2016-11-03 09:53:59 +13005196 if (!skip) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005197 result =
5198 get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5199 }
5200
5201 validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
5202
5203 return result;
5204}
5205
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005206VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5207 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005208 VkBool32 result = false;
5209
Chris Forbes7b58a712016-11-24 11:35:31 +13005210 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005211 assert(my_data != NULL);
5212
Chris Forbes04b61da2016-11-03 09:53:59 +13005213 bool skip = false;
Chris Forbes9a083b92016-11-02 16:58:15 +13005214
Chris Forbes04b61da2016-11-03 09:53:59 +13005215 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::mir_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005216 "vkGetPhysicalDeviceMirPresentationSupportKHR", VK_KHR_MIR_SURFACE_EXTENSION_NAME);
5217
Chris Forbes04b61da2016-11-03 09:53:59 +13005218 skip |= parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005219
Chris Forbes04b61da2016-11-03 09:53:59 +13005220 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005221 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5222 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005223 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005224 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005225}
5226#endif // VK_USE_PLATFORM_MIR_KHR
5227
5228#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5229VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005230 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005231 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5232
Chris Forbes7b58a712016-11-24 11:35:31 +13005233 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005234 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005235 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005236
Chris Forbes04b61da2016-11-03 09:53:59 +13005237 skip |= require_instance_extension(instance, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005238 "vkCreateWaylandSurfaceKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5239
Chris Forbes04b61da2016-11-03 09:53:59 +13005240 skip |= parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005241
Chris Forbes04b61da2016-11-03 09:53:59 +13005242 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005243 result = get_dispatch_table(pc_instance_table_map, instance)
5244 ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005245 }
5246
5247 validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
5248
5249 return result;
5250}
5251
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005252VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5253 uint32_t queueFamilyIndex,
5254 struct wl_display *display) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005255 VkBool32 result = false;
5256
Chris Forbes7b58a712016-11-24 11:35:31 +13005257 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005258 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005259 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005260
Chris Forbes04b61da2016-11-03 09:53:59 +13005261 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::wayland_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005262 "vkGetPhysicalDeviceWaylandPresentationSupportKHR", VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
5263
Chris Forbes04b61da2016-11-03 09:53:59 +13005264 skip |=
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005265 parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005266
Chris Forbes04b61da2016-11-03 09:53:59 +13005267 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005268 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5269 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005270 }
Chris Forbes9a083b92016-11-02 16:58:15 +13005271
5272 return result;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005273}
5274#endif // VK_USE_PLATFORM_WAYLAND_KHR
5275
5276#ifdef VK_USE_PLATFORM_ANDROID_KHR
5277VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005278 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005279 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5280
Chris Forbes7b58a712016-11-24 11:35:31 +13005281 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005282 assert(my_data != NULL);
Chris Forbes04b61da2016-11-03 09:53:59 +13005283 bool skip = false;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005284
Chris Forbes04b61da2016-11-03 09:53:59 +13005285 skip |= require_instance_extension(instance, &instance_extension_enables::android_enabled,
Chris Forbes115f98c2016-11-03 09:51:48 +13005286 "vkCreateAndroidSurfaceKHR", VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Chris Forbes9a083b92016-11-02 16:58:15 +13005287
Chris Forbes04b61da2016-11-03 09:53:59 +13005288 skip |= parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005289
Chris Forbes04b61da2016-11-03 09:53:59 +13005290 if (!skip) {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005291 result = get_dispatch_table(pc_instance_table_map, instance)
5292 ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005293 }
5294
5295 validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
5296
5297 return result;
5298}
5299#endif // VK_USE_PLATFORM_ANDROID_KHR
5300
Mark Youngead9b932016-09-08 12:28:38 -06005301VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
5302 const VkSwapchainCreateInfoKHR *pCreateInfos,
5303 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
5304 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005305 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005306 auto my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06005307 assert(my_data != NULL);
5308
Chris Forbes04b61da2016-11-03 09:53:59 +13005309 skip |= require_device_extension(my_data, &layer_data::display_swapchain_enabled, "vkCreateSharedSwapchainsKHR", VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME);
Chris Forbesbe5f5202016-11-02 18:34:25 +13005310
Chris Forbes04b61da2016-11-03 09:53:59 +13005311 skip |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
Mark Youngead9b932016-09-08 12:28:38 -06005312 pSwapchains);
5313
Chris Forbes04b61da2016-11-03 09:53:59 +13005314 if (!skip) {
Mark Youngead9b932016-09-08 12:28:38 -06005315 result = get_dispatch_table(pc_device_table_map, device)
5316 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
5317
5318 validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
5319 }
5320
5321 return result;
5322}
5323
Chris Forbes667a5212016-11-03 10:18:35 +13005324VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5325 VkDisplayPropertiesKHR *pProperties) {
5326 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5327 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005328 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005329 assert(my_data != NULL);
5330
5331 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5332 "vkGetPhysicalDeviceDisplayPropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5333
5334 // No parameter validation function for this call?
5335
5336 if (!skip) {
5337 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5338 ->GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
5339
5340 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPropertiesKHR", result);
5341 }
5342
5343 return result;
5344}
5345
5346VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
5347 VkDisplayPlanePropertiesKHR *pProperties) {
5348 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5349 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005350 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005351 assert(my_data != NULL);
5352
5353 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5354 "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5355
5356 // No parameter validation function for this call?
5357
5358 if (!skip) {
5359 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5360 ->GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
5361
5362 validate_result(my_data->report_data, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", result);
5363 }
5364
5365 return result;
5366}
5367
5368VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
5369 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
5370 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5371 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005372 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005373 assert(my_data != NULL);
5374
5375 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5376 "vkGetDisplayPlaneSupportedDisplaysKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5377
5378 // No parameter validation function for this call?
5379
5380 if (!skip) {
5381 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5382 ->GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
5383
5384 validate_result(my_data->report_data, "vkGetDisplayPlaneSupportedDisplaysKHR", result);
5385 }
5386
5387 return result;
5388}
5389
5390VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5391 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
5392 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5393 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005394 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005395 assert(my_data != NULL);
5396
5397 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5398 "vkGetDisplayModePropertiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5399
5400 // No parameter validation function for this call?
5401
5402 if (!skip) {
5403 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5404 ->GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
5405
5406 validate_result(my_data->report_data, "vkGetDisplayModePropertiesKHR", result);
5407 }
5408
5409 return result;
5410}
5411
5412VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
5413 const VkDisplayModeCreateInfoKHR *pCreateInfo,
5414 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
5415 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5416 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005417 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005418 assert(my_data != NULL);
5419
5420 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5421 "vkCreateDisplayModeKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5422
5423 // No parameter validation function for this call?
5424
5425 if (!skip) {
5426 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5427 ->CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
5428
5429 validate_result(my_data->report_data, "vkCreateDisplayModeKHR", result);
5430 }
5431
5432 return result;
5433}
5434
5435VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
5436 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
5437 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5438 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005439 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005440 assert(my_data != NULL);
5441
5442 skip |= require_instance_extension(physicalDevice, &instance_extension_enables::display_enabled,
5443 "vkGetDisplayPlaneCapabilitiesKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5444
5445 // No parameter validation function for this call?
5446
5447 if (!skip) {
5448 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5449 ->GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
5450
5451 validate_result(my_data->report_data, "vkGetDisplayPlaneCapabilitiesKHR", result);
5452 }
5453
5454 return result;
5455}
5456
5457VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
5458 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
5459 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5460 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005461 auto my_data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Chris Forbes667a5212016-11-03 10:18:35 +13005462 assert(my_data != NULL);
5463
5464 skip |= require_instance_extension(instance, &instance_extension_enables::display_enabled,
5465 "vkCreateDisplayPlaneSurfaceKHR", VK_KHR_DISPLAY_EXTENSION_NAME);
5466
5467 // No parameter validation function for this call?
5468
5469 if (!skip) {
5470 result = get_dispatch_table(pc_instance_table_map, instance)
5471 ->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
5472
5473 validate_result(my_data->report_data, "vkCreateDisplayPlaneSurfaceKHR", result);
5474 }
5475
5476 return result;
5477}
5478
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005479// VK_EXT_debug_marker Extension
5480VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5481 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005482 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005483 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5484 assert(my_data != NULL);
5485
Chris Forbes04b61da2016-11-03 09:53:59 +13005486 skip |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005487
Chris Forbes04b61da2016-11-03 09:53:59 +13005488 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005489 result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5490
5491 validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5492 }
5493
5494 return result;
5495}
5496
5497VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5498 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005499 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005500 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5501 assert(my_data != NULL);
5502
Chris Forbes04b61da2016-11-03 09:53:59 +13005503 skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005504
Chris Forbes04b61da2016-11-03 09:53:59 +13005505 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005506 VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5507
5508 validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5509 }
5510
5511 return result;
5512}
5513
5514VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005515 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005516 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5517 assert(my_data != NULL);
5518
Chris Forbes04b61da2016-11-03 09:53:59 +13005519 skip |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005520
Chris Forbes04b61da2016-11-03 09:53:59 +13005521 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005522 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5523 }
5524}
5525
5526VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Chris Forbes04b61da2016-11-03 09:53:59 +13005527 bool skip = false;
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005528 layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5529 assert(my_data != NULL);
5530
Chris Forbes04b61da2016-11-03 09:53:59 +13005531 skip |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005532
Chris Forbes04b61da2016-11-03 09:53:59 +13005533 if (!skip) {
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005534 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5535 }
5536}
5537
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005538// VK_NV_external_memory_capabilities Extension
5539VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5540 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5541 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5542 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5543
5544 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005545 bool skip = false;
Chris Forbes7b58a712016-11-24 11:35:31 +13005546 auto my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005547 assert(my_data != NULL);
5548
Chris Forbes04b61da2016-11-03 09:53:59 +13005549 skip |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005550 my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5551
Chris Forbes04b61da2016-11-03 09:53:59 +13005552 if (!skip) {
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005553 result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5554 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
5555 externalHandleType, pExternalImageFormatProperties);
5556
5557 validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5558 }
5559
5560 return result;
5561}
5562
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005563#ifdef VK_USE_PLATFORM_WIN32_KHR
5564// VK_NV_external_memory_win32 Extension
5565VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5566 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5567
5568 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Chris Forbes04b61da2016-11-03 09:53:59 +13005569 bool skip = false;
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005570 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5571 assert(my_data != NULL);
5572
Chris Forbes04b61da2016-11-03 09:53:59 +13005573 skip |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005574
Chris Forbes04b61da2016-11-03 09:53:59 +13005575 if (!skip) {
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005576 result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5577 }
5578
5579 return result;
5580}
5581#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005582
5583
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005584
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005585static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005586
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005587static PFN_vkVoidFunction intercept_core_device_command(const char *name);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005588
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005589static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005590
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005591static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005592
Chia-I Wu01ca2372016-05-13 14:37:49 +08005593VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005594 assert(device);
5595
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005596 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5597
Dustin Graves080069b2016-04-05 13:48:15 -06005598 if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005599 return NULL;
5600 }
5601
Chia-I Wuf9b01382016-05-16 07:37:41 +08005602 PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5603 if (proc)
5604 return proc;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005605
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005606 proc = InterceptWsiEnabledCommand(funcName, device);
5607 if (proc)
5608 return proc;
5609
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005610 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005611 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005612 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005613}
5614
Chia-I Wu01ca2372016-05-13 14:37:49 +08005615VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005616 PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
Chia-I Wu02f01a32016-05-16 07:45:43 +08005617 if (!proc)
5618 proc = intercept_core_device_command(funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005619
5620 if (!proc)
5621 proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005622
Chia-I Wu617f2a42016-05-16 07:41:17 +08005623 if (proc)
5624 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005625
Chia-I Wu617f2a42016-05-16 07:41:17 +08005626 assert(instance);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005627
Chris Forbes7b58a712016-11-24 11:35:31 +13005628 auto data = get_my_data_ptr(get_dispatch_key(instance), instance_layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07005629
Chia-I Wu617f2a42016-05-16 07:41:17 +08005630 proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005631 if (!proc)
5632 proc = InterceptWsiEnabledCommand(funcName, instance);
5633
Chia-I Wu617f2a42016-05-16 07:41:17 +08005634 if (proc)
5635 return proc;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06005636
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005637 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07005638 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005639 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06005640}
Chia-I Wu99f701c2016-05-13 14:06:08 +08005641
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005642static PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
Chia-I Wu617f2a42016-05-16 07:41:17 +08005643 static const struct {
5644 const char *name;
5645 PFN_vkVoidFunction proc;
5646 } core_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005647 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5648 {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5649 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5650 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5651 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5652 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5653 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5654 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5655 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5656 {"vkGetPhysicalDeviceSparseImageFormatProperties",
5657 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5658 {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5659 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5660 {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5661 {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5662 {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5663 {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
Mark Lobodzinskib3c68282016-09-28 14:04:29 -06005664 {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
Chia-I Wu617f2a42016-05-16 07:41:17 +08005665 };
5666
5667 for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5668 if (!strcmp(core_instance_commands[i].name, name))
5669 return core_instance_commands[i].proc;
5670 }
5671
5672 return nullptr;
5673}
5674
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005675static PFN_vkVoidFunction intercept_core_device_command(const char *name) {
Chia-I Wuf9b01382016-05-16 07:37:41 +08005676 static const struct {
5677 const char *name;
5678 PFN_vkVoidFunction proc;
5679 } core_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005680 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5681 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5682 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5683 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5684 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5685 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5686 {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5687 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5688 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5689 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5690 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5691 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5692 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5693 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5694 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5695 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5696 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5697 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5698 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5699 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5700 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5701 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5702 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5703 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5704 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5705 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5706 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5707 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5708 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5709 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5710 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5711 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5712 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5713 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5714 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5715 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5716 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5717 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5718 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5719 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5720 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5721 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5722 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5723 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5724 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5725 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5726 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5727 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5728 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5729 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5730 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5731 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5732 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5733 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5734 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5735 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5736 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5737 {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5738 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5739 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5740 {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5741 {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5742 {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5743 {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5744 {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5745 {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5746 {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5747 {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5748 {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5749 {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5750 {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5751 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5752 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5753 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5754 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5755 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5756 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5757 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5758 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5759 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5760 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5761 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5762 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5763 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5764 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5765 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5766 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5767 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5768 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5769 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5770 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5771 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5772 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5773 {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5774 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5775 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5776 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5777 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5778 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5779 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5780 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5781 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5782 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5783 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5784 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5785 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5786 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5787 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5788 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5789 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5790 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5791 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5792 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5793 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5794 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5795 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5796 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005797 {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5798 {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5799 {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5800 {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
Mark Lobodzinskid5c4e622016-09-29 15:01:28 -06005801#ifdef VK_USE_PLATFORM_WIN32_KHR
5802 {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5803#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski620a9132016-09-28 13:51:51 -06005804};
5805
Chia-I Wuf9b01382016-05-16 07:37:41 +08005806
5807 for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5808 if (!strcmp(core_device_commands[i].name, name))
5809 return core_device_commands[i].proc;
5810 }
5811
5812 return nullptr;
5813}
5814
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005815static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005816 static const struct {
5817 const char *name;
5818 PFN_vkVoidFunction proc;
5819 } wsi_device_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005820 {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5821 {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5822 {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5823 {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005824 {"vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR)},
Chris Forbes64c3c652016-11-03 10:15:31 +13005825 {"vkCreateSharedSwapchainsKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR)},
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005826 };
5827
5828 if (device) {
Chris Forbesbe5f5202016-11-02 18:34:25 +13005829 for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
5830 if (!strcmp(wsi_device_commands[i].name, name))
5831 return wsi_device_commands[i].proc;
Mark Youngead9b932016-09-08 12:28:38 -06005832 }
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005833 }
5834
5835 return nullptr;
5836}
5837
5838static PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
5839 static const struct {
5840 const char *name;
5841 PFN_vkVoidFunction proc;
5842 } wsi_instance_commands[] = {
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005843 {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5844 {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5845 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5846 {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5847 {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5848 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
Chris Forbesbe5f5202016-11-02 18:34:25 +13005849 {"vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR)},
Chris Forbes667a5212016-11-03 10:18:35 +13005850 {"vkGetPhysicalDeviceDisplayPropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR)},
5851 {"vkGetPhysicalDeviceDisplayPlanePropertiesKHR",
5852 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR)},
5853 {"vkGetDisplayPlaneSupportedDisplaysKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR)},
5854 {"vkGetDisplayModePropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR)},
5855 {"vkCreateDisplayModeKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR)},
5856 {"vkGetDisplayPlaneCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR)},
5857 {"vkCreateDisplayPlaneSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR)},
Chris Forbesb858dc82016-11-03 11:28:19 +13005858#ifdef VK_USE_PLATFORM_WIN32_KHR
5859 {"vkCreateWin32SurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR)},
5860 {"vkGetPhysicalDeviceWin32PresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR)},
5861#endif
5862#ifdef VK_USE_PLATFORM_XCB_KHR
5863 {"vkCreateXcbSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR)},
5864 {"vkGetPhysicalDeviceXcbPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR)},
5865#endif
5866#ifdef VK_USE_PLATFORM_XLIB_KHR
5867 {"vkCreateXlibSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR)},
5868 {"vkGetPhysicalDeviceXlibPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR)},
5869#endif
5870#ifdef VK_USE_PLATFORM_MIR_KHR
5871 {"vkCreateMirSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR)},
5872 {"vkGetPhysicalDeviceMirPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR)},
5873#endif
5874#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5875 {"vkCreateWaylandSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR)},
5876 {"vkGetPhysicalDeviceWaylandPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR)},
5877#endif
5878#ifdef VK_USE_PLATFORM_ANDROID_KHR
5879 {"vkCreateAndroidSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR)},
5880#endif
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005881 };
5882
Chris Forbes8a13e272016-11-02 17:43:34 +13005883 for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
5884 if (!strcmp(wsi_instance_commands[i].name, name))
5885 return wsi_instance_commands[i].proc;
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005886 }
5887
Mark Lobodzinskiaf00fa82016-08-09 10:44:38 -06005888 return nullptr;
5889}
5890
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005891} // namespace parameter_validation
5892
5893// vk_layer_logging.h expects these to be defined
5894
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005895VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5896 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5897 const VkAllocationCallbacks *pAllocator,
5898 VkDebugReportCallbackEXT *pMsgCallback) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005899 return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005900}
5901
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005902VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5903 const VkAllocationCallbacks *pAllocator) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005904 parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005905}
5906
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005907VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5908 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5909 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005910 parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005911}
5912
5913// loader-layer interface v0
5914
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005915VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5916 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005917 return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005918}
5919
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005920VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5921 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005922 return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005923}
5924
Mark Lobodzinski72ecd912016-08-11 13:25:38 -06005925VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5926 VkLayerProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005927 // the layer command handles VK_NULL_HANDLE just fine internally
5928 assert(physicalDevice == VK_NULL_HANDLE);
5929 return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005930}
5931
5932VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5933 const char *pLayerName, uint32_t *pCount,
5934 VkExtensionProperties *pProperties) {
Chia-I Wub02600c2016-05-20 07:11:22 +08005935 // the layer command handles VK_NULL_HANDLE just fine internally
5936 assert(physicalDevice == VK_NULL_HANDLE);
Chia-I Wu76a34662016-05-16 07:34:09 +08005937 return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005938}
5939
5940VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005941 return parameter_validation::GetDeviceProcAddr(dev, funcName);
Chia-I Wu1a6b1932016-05-13 14:07:36 +08005942}
5943
5944VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Chia-I Wu01ca2372016-05-13 14:37:49 +08005945 return parameter_validation::GetInstanceProcAddr(instance, funcName);
Chia-I Wu99f701c2016-05-13 14:06:08 +08005946}